1

我可以使用此代码获取当前登录用户的 GUID 和 SID:

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?

注意:这是一个桌面应用程序,而不是一个网络应用程序。

4

2 回答 2

1

安全标识符 (SID) 是每个进程令牌的一部分,它是真正的用户标识符。当您在工作组中时,它存储在每台计算机的 SAM(注册表的一部分)中,当您在域中时,它作为用户对象的属性存储在 Active-Directory 中。

GUID 也是 Active-Directory 中用户对象的一个​​属性,但它的主要目的是确保该对象的唯一性。

据我了解,GUID 不是 Windows 安全性的一部分,所以我并不奇怪它在断开模式下不可用。

于 2012-03-08T09:04:01.723 回答
0

SID 存储在用户的安全令牌中,这就是您可以离线访问它的原因。GUID 在林内移动期间(因此在同一林内的域之间)被保留,因此使用它作为您的密钥是一个好主意。既然它永远不会改变,为什么不在第一次启动应用程序时将用户的 GUID 保存到注册表中呢?

于 2012-03-10T18:22:30.950 回答