Отложенный CustomAction в контексте системы получить доступ запрещен
У меня возникли проблемы с привилегиями при запуске CustomAction в отложенном режиме.
Я хочу убить некоторые процессы службы, которые могут выполняться с использованием разных учетных записей пользователей, от локальной системы до обычных пользователей, но ЦС будет успешным только тогда, когда процессы и ЦС выполняются как один и тот же пользователь. Вот некоторые случаи и результаты:
- "process1.exe" - это процесс, запущенный от имени того же пользователя, который выполняет установку. Если kill CA запускается в системном контексте с помощью Impersonate="no", доступ запрещен.
- "process1.exe" - это процесс, запущенный от имени того же пользователя, который выполняет установку. Если kill CA запускается в контексте пользователя с помощью Impersonate="yes", процесс уничтожается.
- "process1.exe" - это процесс, выполняющийся от имени другого пользователя. Если kill CA запускается в контексте пользователя с помощью Impersonate="yes", доступ запрещен.
- "process1.exe" - это процесс, выполняющийся от имени другого пользователя. Если kill CA запускается в контексте системы с помощью Impersonate="no", доступ запрещен
- "process1.exe" - это процесс, работающий как локальная система. Если kill CA запускается в контексте пользователя с помощью Impersonate="yes", доступ запрещен.
- "process1.exe" - это процесс, работающий как локальная система. Если kill CA запускается в контексте System с помощью Impersonate="no", процесс уничтожается.
<SetProperty Id="KillUserProcess" Value='"[WindowsFolder]\System32\taskkill.exe" /F /IM process1.exe' After="CostFinalize" />
<CustomAction Id="KillUserProcess" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Impersonate="no" Return="check" />
<SetProperty Id="KillSysProcess" Value='"[WindowsFolder]\System32\taskkill.exe" /F /IM process2.exe' After="CostFinalize" />
<CustomAction Id="KillSysProcess" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Impersonate="no" Return="check" />
<InstallExecuteSequence>
<Custom Action="KillUserProcess" After="InstallInitialize"></Custom>
<Custom Action="KillSysProcess" After="KillUserProcess"></Custom>
</InstallExecuteSequence>
Action=KillUserProcess,ActionType=3137,Source=BinaryData,Target=CAQuietExec,CustomActionData="C:\Windows\System32\taskkill.exe"
/F /IM process1.exe)
CAQuietExec: "C:\Windows\System32\taskkill.exe" /F /IM process1.exe
CAQuietExec: ERROR: The process "process1.exe" with PID 3164 could not be
terminated.
CAQuietExec: Reason: Access is denied.
CAQuietExec:
CAQuietExec: Error 0x80070001: Command line returned an error.
CAQuietExec: Error 0x80070001: QuietExec Failed
CAQuietExec: Error 0x80070001: Failed in ExecCommon method
Action=KillSysProcess,ActionType=3137,Source=BinaryData,Target=CAQuietExec,CustomActionData="C:\Windows\System32\taskkill.exe"
/F /IM process2.exe)
CAQuietExec: "C:\Windows\System32\taskkill.exe" /F /IM process2.exe
CAQuietExec: SUCCESS: The process "process2.exe" with PID 4596 has been
terminated.
Если у LocalSystem нет прав на уничтожение процессов, то кто это делает? Выполнение этих команд из командной строки работает без проблем при повышении. Даже используя psexec из SysInternal для запуска команды, система работает без проблем. С этими проблемами сталкиваются только при запуске через MSI.
Можно ли сделать пользовательское действие, запущенное как система, уничтожением процессов, не принадлежащих только системе?
1 ответ
Этот вопрос помечен DTF, но я не вижу никакого кода.NET.
FWIW, я погуглил эту тему, и об этом слишком много рассуждать... реальность такова, что вам нужен больший молот, а C#/DTF - это тот молот. С его помощью вы можете делать более сложные вызовы API и улучшать обработку ошибок / ведение журнала.