2017-05-09 64 views
1

我在 延遲模式下運行CustomAction時遇到一些特權問題。系統上下文中延遲的CustomAction獲取訪問被拒絕

我想殺死一些可能使用 不同的用戶帳戶從本地系統運行到普通用戶的服務進程,但是隻有當進程和CA作爲同一用戶執行時才能成功。 這裏有一些情況和結果:

  • 「process1.exe」是運行的運行 安裝相同的用戶的過程。如果kill CA在系統上下文中使用 Impersonate =「no」運行,則訪問被拒絕
  • 「process1.exe」是一個作爲運行 安裝的相同用戶運行的進程。如果kill CA在用戶上下文中使用 Impersonate =「yes」運行,則進程將被終止
  • 「process1.exe」是作爲另一用戶運行的進程。如果在用戶上下文中使用Impersonate =「yes」運行殺死CA ,則訪問被拒絕
  • 「process1.exe」是作爲另一用戶運行的進程。如果在系統上下文中使用Impersonate =「no」運行殺死CA ,則拒絕訪問
  • 「process1.exe」是作爲本地系統運行的進程。如果在用戶上下文中使用Impersonate =「yes」運行殺死CA ,則訪問被拒絕。
  • 「process1.exe」是作爲本地系統運行的進程。如果在系統上下文中使用Impersonate =「no」運行殺死CA ,則處理爲 死亡。
<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.

如果本地系統沒有殺過程的權利,誰呢? 當提升 時,從命令提示符運行這些命令沒有任何問題。 即使使用SysInternal中的psexec作爲系統工作 運行命令沒有問題。只有在通過MSI運行時纔會遇到這些問題。

是否有可能使自定義操作作爲系統kill進程運行 不僅僅由System擁有?

+0

我第一眼看不到錯誤,但也許你可以嘗試用sc stop 而不是'taskkill'來停止你的服務。 – linuxrocks

+0

停止服務是我做的第一件事,實際的CustomAction在指示服務管理器停止服務時,我已經更先進了,它解決了服務的所有進程,並等待60秒關閉進程。但有時進程崩潰,他們不關閉,服務經理停止嘗試停止服務。釋放所有鎖的唯一方法是終止進程。這就是問題出現的地方,即使在「系統」環境中運行,缺乏殺死進程的權限。 – IlirB

回答

0

此問題標記爲DTF,但我沒有看到任何.NET代碼。

FWIW,我已經使用了這個主題,它太臆測了...現實是你需要一個更大的錘子,而C#/ DTF就是那個錘子。你可以用它做更復雜的API調用,並且更好的錯誤處理/日誌記錄。