2012-03-07 83 views
1

斷開時,我可以使用該代碼來獲得的用戶當前登錄的GUID和SID:用戶GUID從網絡

UserPrincipal user = System.DirectoryServices.AccountManagement.UserPrincipal.Current; 
Console.WriteLine("{0}, {1}", user.Guid, user.Sid); 

然而,如果在沒有用戶登錄被連接到網絡時,該代碼失敗(「服務器無法聯繫」)。我可以得到該用戶的SID,即使他們沒有連接,像這樣:

WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent(); 
Console.WriteLine("{0}", identity.User.Value); 

但WindowsIdentity對象不包含GUID,據我可以告訴。

如何獲得當前用戶的GUID,如果他們沒有連接到網絡?

注意:這是一個桌面應用程序,而不是一個Web應用程序。

+0

你可能不能! – EJP 2012-03-08 00:33:57

+0

你可以進入更多的細節?我真的不明白這些東西是如何工作的。爲什麼如果他們不在網絡上,而不是GUID,我可以得到SID? – Mud 2012-03-08 01:42:49

+0

我想知道GUID是否只在服務器上。 – EJP 2012-03-08 01:47:43

回答

1

安全標識符(SID)是每個進程令牌的一部分,它是真正的用戶標識符。當您在WorkGroup中時,它存儲在每臺計算機的SAM(註冊表的一部分)中,當您位於域中時,它將作爲用戶對象的屬性存儲在Active Directory中。

GUID也是Active-Directory中用戶對象的屬性,但它的主要用途是確保此對象的唯一性。

據我所知,GUID不是Windows安全性的一部分,所以我不驚訝這是它在disconected模式下不可用。

+0

織補。 [本文](http://technet.microsoft.com/en-us/library/cc961625.aspx)說,當他移動域時,用戶的SID會改變,而他的GUID不會。我需要堅持代表用戶的令牌,以便稍後可以識別他(在Windows之外運行的自定義身份驗證方案),並且我不希望它在移動域時被破壞,而且我不想維護它像Windows這樣的SID歷史列表顯然確實如此。能夠訪問該GUID將是非常好的。 – Mud 2012-03-08 17:45:28

+0

據我所知,唯一的解決方案是從Active Directory中查詢GUID。 – JPBlanc 2012-03-08 17:54:27

0

SID存儲在用戶的安全令牌中,這就是爲什麼您可以離線訪問它的原因。在森林內移動期間(在同一森林內的域之間)保留GUID,因此將其用作密鑰是個不錯的主意。由於它永遠不會改變,爲什麼不在第一次啓動應用程序時將用戶的GUID保存到註冊表中?