作爲LocalSystem運行的C#程序如何暫時模仿另一個用戶的登錄身份?粗略地說,我有一個Windows服務,我想以LocalSystem身份運行,但有時冒充用戶XYZ(當使用Windows集成安全性連接到數據庫時)。來自C的Windows模擬#
最重要的是:有沒有辦法做到這一點,而不知道其他用戶的密碼?
注意:如果密碼是強制性的,那麼建議使用安全地存儲密碼的策略(c#和/或vbscript)。
作爲LocalSystem運行的C#程序如何暫時模仿另一個用戶的登錄身份?粗略地說,我有一個Windows服務,我想以LocalSystem身份運行,但有時冒充用戶XYZ(當使用Windows集成安全性連接到數據庫時)。來自C的Windows模擬#
最重要的是:有沒有辦法做到這一點,而不知道其他用戶的密碼?
注意:如果密碼是強制性的,那麼建議使用安全地存儲密碼的策略(c#和/或vbscript)。
這是可能的,但它需要你做大量的代碼。見NtCreateToken和CreateToken。你需要SeCreateTokenPrivilege,雖然這不會是一個問題,因爲你在NT AUTHORITY \ SYSTEM下運行。然後,您可以使用創建的令牌在線程內模擬。
謝謝。代碼示例沒有太多,因爲它:) – user53794 2009-02-22 18:26:49
對於密碼存儲部分,您可能需要查看最近詢問的this question。
這是我的回答:
你可以/應該使用DPAPI,提供存儲加密的Data Protection API。
它只存在這種類型的問題。存儲的
加密基於任一:
有一個dnrTV show with Karl Franklin顯示實現此功能和其他加密函數所需的內容。
該頁面還提供了來自該節目的源代碼。
當然,在這個問題上有很多other articles。
簡答題:你不能沒有用戶密碼或用戶通過COM調用你的服務。
要冒充您的流程中的其他用戶,您必須致電ImpersonateLoggedOnUser
。 ImpersonateLoggedOnUser
需要令牌句柄。有幾種方法可以獲取令牌句柄:
LogonUser
的用戶登錄。但是這需要你知道用戶密碼。CreateRestrictedToken
,DuplicateToken
或DuplicateTokenEx
現有令牌。OpenProcessToken
或OpenThreadToken
有關模擬代碼,請參閱以下兩個代碼項目文章:[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