【发布时间】:2011-10-11 12:34:04
【问题描述】:
我被指派修改 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 字符串,但我不知道这有多“正确”。
【问题讨论】:
-
请注意,在 Windows 的本地化版本中,管理员的名称可能不同。例如,在俄语 Windows 中没有“管理员”用户,而是“Администратор”,因此硬编码管理员的名称不是一个好主意。
-
仅供参考:对于当前用户的域,您可以使用:
WindowsIdentity.GetCurrent().User.AccountDomainSid -
注意:对于那些使用 PowerShell 的人:
(Get-AdDomain -Identity 'myDomain').DomainSID有效。该 cmdlet 是ActiveDirectory模块的一部分。Get-AdDomaincmdlet 返回Microsoft.ActiveDirectory.Management.ADDomain类型的对象。遗憾的是,该类没有任何特殊的 .net 选项来按希望将名称解析为 SID。
标签: c# .net-4.0 active-directory