2011-09-06 44 views
2

我有一個運行在本地系統帳戶下的.NET Winddows服務。然後,此服務運行COM組件,該COM組件使用COM Interop在Visual Studio 6上的ATL中編寫。此COM組件然後在SYSTEM帳戶下運行。我知道我可以冒充另一個帳戶,但現在我想把事情留在原地。在SYSTEM帳戶下殺死一個ATL COM進程?

問題是,在Windows服務停止後,COM組件仍在運行。我也無法殺死這個過程。任務管理器不會殺死它,所以我從命令行嘗試了TaskKill。這甚至說它終止了成功的過程,但是當我檢查任務管理器時它仍然在運行。我試過PSKill,但是說拒絕訪問。

我已經窮盡Google尋找解決方案。誰能幫忙?

另外,它爲什麼仍然運行呢?

回答

3

殺死一個進程只是一個權限問題。假設使用UAC的Vista/7,如果您沒有以管理員身份運行,您將無法終止系統進程。注 - 僅作爲本地管理員組的成員是不夠的。您必須啓動任務管理器/進程資源管理器/ pskill或其他任何使用「以管理員身份運行」才能使用管理權限實際運行它們。否則,你只是一個普通用戶,而你被拒絕了。

至於COM服務器堅持圍繞:COM服務器有一個引用計數,和他們自行關閉計數下降到0。在你的情況下,只有後,服務器可能無法關閉的原因有幾個原因:

  1. 您的客戶端沒有正確釋放由COM服務器創建的所有實例。我不是一個.NET程序員,所以我不能說這是你應該照顧的事情,還是垃圾收集是否適合你。如果由於崩潰或外部終止而導致服務未正確清理而終止,您將會遇到該問題。
  2. 無論出於造成者的任何原因,服務器可能會在內部增加其引用計數。這甚至可能是服務器中的一個錯誤。
  3. 即使沒有活動客戶端,IIRC,COM可能會讓服務器運行一段時間。如果是這樣,服務器將在幾分鐘後關閉。