域控制器关闭时,我可以检查AD用户是否为域管理员?

时间:2012-08-16 06:18:34

标签: c# active-directory domaincontroller

我可以通过以下代码行检查用户是否是域管理员:

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)

是否能够检查用户是否为关闭域控制器的域管理员?

1 个答案:

答案 0 :(得分:1)

您可以在不联系域控制器的情况下检查当前用户是否为域管理员。

如果你的要求是检查arbirary用户是否是域管理员,我认为没有域控制器就可以做到。

Windows确实为登录密码的目的缓存了登录凭据。缓存在HKEY_LOCAL_MACHINE\SECURITY\Cache中存储和加密。按照设计,缓存只能由LSA解密。如果您找到其他方法来解密或查询信息而不通过LSA,那么微软可能会立即修复它。所以,你唯一的希望就是以某种方式LSA公开了一个API来查询存储在凭证缓存中的组信息。据我所知,我没有看到这样的API存在。有关记录的LSA API,请参阅here