是否有更好(更简单)的方法来获取特定域的SID?

我被指派修改WinForms应用程序,基本上检查登录用户是否属于特定域。 这是我到目前为止所提出的:

byte[] domainSid; var directoryContext = new DirectoryContext(DirectoryContextType.Domain, "domain.se"); using (var domain = Domain.GetDomain(directoryContext)) using (var directoryEntry = domain.GetDirectoryEntry()) domainSid = (byte[])directoryEntry.Properties["objectSid"].Value; var sid = new SecurityIdentifier(domainSid, 0); bool validUser = UserPrincipal.Current.Sid.IsEqualDomainSid(sid); 

有没有更好/更简单的方法来做到这一点? 对我来说,似乎可以使用PrincipalContext或System.Security.Principal中的其他类以某种方式访问​​domainSid。

我考虑过使用硬编码的SID字符串,但我不知道它是多么“正确”。

你正在做什么看起来对我来说是最好的选择。 硬编码字符串定义不是一个好主意。

每个域都有一个内置帐户domainName \ administrator ,因此您可以创建一个具有此名称的帐户,将其转换为SecurityIdentifier并读取AccountDomainSid属性。

这种方式的一个例子是:

 public static class SecurityEx { public static SecurityIdentifier DomainSId { get { var administratorAcount = new NTAccount(GetDomainName(), "administrator"); var administratorSId = (SecurityIdentifier) administratorAcount.Translate(typeof (SecurityIdentifier)); return administratorSId.AccountDomainSid; } } internal static string GetDomainName() { //could be other way to get the domain name through Environment.UserDomainName etc... return IPGlobalProperties.GetIPGlobalProperties().DomainName; } } 

您还可以找到其他解决方案,通过WMI或Lsa获得相同的结果。 这对我来说似乎是最优雅的方式。