2011-11-29 70 views
6

作爲本地系統或本地服務運行的C#Windows服務是否可能假冒其他用戶而不需要該用戶的密碼Windows服務可能在沒有密碼的情況下冒充用戶嗎?

這將如何完成?

注意:我的動機是能夠在服務中運行用戶特定的WMI查詢。我所做的WMI調用(對於OfflineFiles WMI API)是用戶敏感的,並且只有當我將我的服務作爲其數據要查詢的用戶運行時才能工作。我不希望用戶在安裝服務時輸入他們的用戶名和密碼,所以我想僅以本地系統或其他方式運行該服務,並模擬我關心的用戶。

+0

我懷疑你將有更好的運氣,如果你要解釋你的服務做一旦它模擬的用戶是什麼。據我所知,你問的也不是沒有可能積攢憑證(這意味着在某些時候輸入密碼的用戶) –

+0

@ChrisShain,如你所說我已經更新的問題。 – Eric

+0

檢查出這個問題的答案:http://stackoverflow.com/questions/559719/windows-impersonation-from-c-sharp –

回答

7

假設你而相關用戶登錄時只需要啓動模擬,你可以:

  1. 使用EnumProcesses找到相關用戶會話(例如http://msdn.microsoft.com/en-us/library/windows/desktop/ms682623(v=vs.85).aspx)[WINAPI]
  2. OpenProcessToken()上的相關用戶進程[WINAPI]
  3. DuplicateToken()與模擬特權[WINAPI]
  4. 創建使用DuplicateToken
  5. 校準的結果的新的WindowsIdentity() l。從第4步開始的新身份登錄

一旦令牌被複制,用戶是否登錄 - 服務中的模擬仍然存在並不重要。

顯然,API無證ZwCreateToken WINAPI功能雖然也能達到這一點,但我從來沒有使用它,並在任何時候在將來可能會斷裂。

+0

for#1,也可以使用'Process.GetProcesses()' –

+0

事實上,有一種使用S4U(服務用戶)的技術: https://blogs.msdn.microsoft.com/winsdk/2015/08/28 /以用戶身份登錄不需要密碼/ https://msdn.microsoft.com/en-us/library/windows/desktop/aa378128(v=vs.85).aspx –

-1

Topshelf窗口服務API/Tool支持它並且是開源的。 [更新]我錯過了你至少需要密碼進行一次性配置。

+0

哪裏該說它能模仿沒有他們的密碼的用戶? – BlackICE

+0

TS文檔中的哪些地方介紹了該功能?我非常希望看到他們的實施。 –

+0

@David,當然你需要密碼。 – kenny

0

據我所知,由於明顯的安全原因無法完成。您必須擁有密碼才能調用LogonUser,然後調用WindowsIdentity.Impersonate。

有一個例外:如果您有通過遠程調用傳遞給服務的現有WindowsIdentity,那麼您可以模擬該服務中的WindowsIdentity,但不能以這種方式運行應用程序。

+1

安全原因並不明顯 - 如果您是使用本地系統帳戶運行的服務,那麼您確實無法做到這一點。 – EFraim

相關問題