2009-02-18 37 views
29

作爲LocalSystem運行的C#程序如何暫時模仿另一個用戶的登錄身份?粗略地說,我有一個Windows服務,我想以LocalSystem身份運行,但有時冒充用戶XYZ(當使用Windows集成安全性連接到數據庫時)。來自C的Windows模擬#

最重要的是:有沒有辦法做到這一點,而不知道其他用戶的密碼?

注意:如果密碼是強制性的,那麼建議使用安全地存儲密碼的策略(c#和/或vbscript)。

+0

有關模擬代碼,請參閱以下兩個代碼項目文章:[http://www.codeproject.com/KB/cs/cpimpersonation1.aspx](http://www.codeproject.com/KB/cs/cpimpersonation1 .aspx)[http://www.codeproject.com/KB/cs/zetaimpersonator。aspx](http://www.codeproject.com/KB/cs/zetaimpersonator.aspx)以及他們基於的Microsoft知識庫文章:[http://support.microsoft.com/default.aspx?scid=kb; en-us; Q306158](http://support.microsoft.com/default.aspx?scid=kb;en-us;Q306158) – mundeep 2009-02-18 03:36:33

回答

18

這是可能的,但它需要你做大量的代碼。見NtCreateTokenCreateToken。你需要SeCreateTokenPrivilege,雖然這不會是一個問題,因爲你在NT AUTHORITY \ SYSTEM下運行。然後,您可以使用創建的令牌在線程內模擬。

+0

謝謝。代碼示例沒有太多,因爲它:) – user53794 2009-02-22 18:26:49

5

對於密碼存儲部分,您可能需要查看最近詢問的this question

這是我的回答:

你可以/應該使用DPAPI,提供存儲加密的Data Protection API
它只存在這種類型的問題。存儲的

加密基於任一:

  • 的用戶帳戶,因此只有登錄的用戶可以訪問該數據。這使得數據可以通過完全相同的用戶憑證轉移到另一臺PC。
  • 該機器使得數據只能在特定的機器設置下訪問,並且不能轉移到另一臺PC。

有一個dnrTV show with Karl Franklin顯示實現此功能和其他加密函數所需的內容。
該頁面還提供了來自該節目的源代碼。

當然,在這個問題上有很多other articles

10

簡答題:你不能沒有用戶密碼或用戶通過COM調用你的服務。

要冒充您的流程中的其他用戶,您必須致電ImpersonateLoggedOnUserImpersonateLoggedOnUser需要令牌句柄。有幾種方法可以獲取令牌句柄: