我可以通过以下代码行检查用户是否是域管理员:
using (DirectoryEntry domainEntry = new DirectoryEntry(string.Format("LDAP://{0}", domain)))
{
byte[] domainSIdArray = (byte[])domainEntry.Properties["objectSid"].Value;
SecurityIdentifier domainSId = new SecurityIdentifier(domainSIdArray, 0);
SecurityIdentifier domainAdminsSId = new SecurityIdentifier(WellKnownSidType.AccountDomainAdminsSid, domainSId);
using (DirectoryEntry groupEntry = new DirectoryEntry(string.Format("LDAP://<SID={0}>", BuildOctetString(domainAdminsSId))))
{
string adminDn = groupEntry.Properties["distinguishedname"].Value as string;
SearchResult result = (new DirectorySearcher(domainEntry, string.Format("(&(objectCategory=user)(samAccountName={0}))", userName), new[] { "memberOf" })).FindOne();
return result.Properties["memberOf"].Contains(adminDn);
}
}
更多详情here
但是当域控制器关闭或其脱机(没有任何连接)时,我收到以下错误:
服务器无法运行。
at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
在System.DirectoryServices.DirectoryEntry.Bind()
在System.DirectoryServices.DirectoryEntry.get_AdsObject()
在System.DirectoryServices.PropertyValueCollection.PopulateList()
在System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry,String propertyName)
在System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
是否能够检查用户是否为关闭域控制器的域管理员?
答案 0 :(得分:1)
您可以在不联系域控制器的情况下检查当前用户是否为域管理员。
如果你的要求是检查arbirary用户是否是域管理员,我认为没有域控制器就可以做到。
Windows确实为登录密码的目的缓存了登录凭据。缓存在HKEY_LOCAL_MACHINE\SECURITY\Cache
中存储和加密。按照设计,缓存只能由LSA解密。如果您找到其他方法来解密或查询信息而不通过LSA,那么微软可能会立即修复它。所以,你唯一的希望就是以某种方式LSA公开了一个API来查询存储在凭证缓存中的组信息。据我所知,我没有看到这样的API存在。有关记录的LSA API,请参阅here。