2012-07-31 62 views
1

我正在使用各種Windows服務在專用網絡中的不同計算機上運行的系統。網絡中的任何計算機都可以運行遠程與這些服務交互的客戶端應用程序。作爲我們軟件包的一部分,我們擁有的功能可以讓用戶查看網絡中的任何服務是否遇到問題,並重新啓動其中的任何服務。如何使用NEW_CREDENTIALS在C#中模擬用戶?

爲了得到這個工作,我們使用user impersonationService Controller class:我們要求用戶提供用戶名和託管落水服務的計算機上的管理帳戶的密碼,冒充該管理員,然後重新啓動與ServiceController的服務。這在大多數情況下都適用,但我們不能模擬我們某些服務器上的管理員。我的理解是,爲了使用戶模擬起作用,被模擬的帳戶必須位於本地計算機上或Active Directory組的一部分中,但所涉及的服務器只有自己本地的帳戶。

我注意到有很多LogonUser方法的參數開始模擬,並開始與他們一起玩,看看他們中的任何人是否會解決我的問題。當我試圖登錄類型值設置爲「新憑證」(第9),我看到了一些奇怪的(但可能有用的)行爲:

  • 我可以,我不能與以前
  • 工作的服務器上重新啓動服務
  • 如果我嘗試重新啓動已關閉的服務並提供不正確的密碼,則該服務仍會重新啓動。

爲什麼我看到這種行爲?如果原因很好,我可能會使用這個設置來徹底擺脫要求用戶登錄的問題。

回答

0

我想通了,這是怎麼回事:

Getting the Current username when impersonated,使用模擬與登錄類型的新的憑據時,模擬的線程繼續充當發送到本地計算機中的所有命令的原始用戶。它只在向其他計算機發送命令時充當模擬用戶。

這就是爲什麼我觀察到我不需要提供正確的密碼:如果我在服務器上有一個關閉的用戶,然後以該服務器上的管理員身份運行客戶端應用程序並嘗試重新啓動它,那麼它與我提供的憑據無關。模擬線程將繼續使用管理員帳戶,因爲重新啓動服務只涉及與本地計算機交互。我放入的新憑證被有效忽略。

順便說一下,這意味着當我嘗試重新啓動本地計算機上的服務時,我應該只能輸入錯誤的用戶名和密碼。當我測試了更多,這就是我觀察到的。

這就是爲什麼它看起來像我不需要擔心我放入哪個密碼。如何訪問在Active Directory組中沒有帳戶的計算機?根據this article,「NewCredentials LogonType認證跨域」。我不確定發生了什麼,但它看起來像新的憑據根本不會嘗試根據Active Directory進行身份驗證。我的猜測是,它將模擬的憑證直接發送到正在訪問的計算機,允許冒充本地帳戶。

對於我正在處理的項目,這意味着我仍然需要在用戶嘗試重新啓動服務時詢問用戶憑據,但現在他們可以在任何服務器上重新啓動服務,即使它未配置爲具有Active Directory帳戶。

+0

有人可以仔細檢查我是否確實發生了什麼?我知道自從我使用模擬後可能會有一些安全問題,所以如果我不瞭解情況,我不想讓自己陷入麻煩:P – Kevin 2012-07-31 16:17:04