У меня есть служба, работающая как локальная система. Я использую функцию CreateProcess для вызова внешнего .exe. Какая учетная запись по умолчанию используется при вызове функции CreateProcess? Я не смог найти ничего по учетной записи по умолчанию в документации MSDN. Кроме того, я хочу, чтобы этот процесс был постоянным до тех пор, пока не будет запущена служба времени. Должен ли я использовать CreateService?
Windows CreateProcess как локальная система
Ответы (1)
CreateProcess
создает процесс, который выполняется от имени того же пользователя, что и родительское приложение, и выполняется в том же сеансе. Вы должны использовать CreateProcessAsUser
/CreateProcessWithLogonW
/ CreateProcessWithTokenW
для создания процесса от имени другого пользователя. Единственным исключением является ShellExecute
, который может создать процесс от имени другого пользователя, если используется повышение прав UAC, а пользователь не является администратором.
Если вам нужно взаимодействовать с другой службой, вы можете использовать ChangeServiceConfig
, чтобы заставить себя зависеть от другой службы. Диспетчер управления службами запустит другую службу перед запуском вашей службы.
person
Anders
schedule
10.05.2018
Процесс подсистемы Windows создается либо через
CreateProcess
, либо через CreateProcessAsUser
. CreateProcessWithLogonW
и CreateProcessWithTokenW
используют RPC для службы вторичного входа. При повышении уровня через ShellExecuteEx
runas используется RPC для службы Application Information. Можно также определить и запустить задачу от имени другого пользователя через COM API службы планировщика заданий. Все они используют привилегированный сервис для вызова CreateProcessAsUser
.
- person Eryk Sun; 11.05.2018
здесь можно отметить, что существуют родитель и создатель (которого называют
CreateProcess
) это обычно одно и то же, но не обязательно. и дочерний процесс запускается в том же сеансе входа в систему, что и родительский, и в том же сеансе терминала, что и создатель. процесс, созданный из службы (когда он и родитель), выживет после выхода из системы
- person RbMm; 11.05.2018
ребенок наследует от родителя не только pid, но и токен - и это серьезно влияет на ребенка, если у нас есть родитель != создатель. но терминальная сессия унаследована от создателя (если мы используем
CreateProcess
). для запуска в другой терминальной сессии нужно уже использовать CreateProcessAsUser
. интересно, если использовать CreateProcessAsUser
с PROC_THREAD_ATTRIBUTE_PARENT_PROCESS
(мы можем использовать оба сразу) - дочерний процесс наследует явный токен вместо токена родительского процесса. но все это не связано, если у нас есть создатель == родитель
- person RbMm; 11.05.2018
CreateProcess
создать процесс с токеном родительского процесса (вашим текущим или установленнымPROC_THREAD_ATTRIBUTE_PARENT_PROCESS
) - person RbMm   schedule 11.05.2018