Active directory 如何从域名dns名称获取域sid?

Active directory 如何从域名dns名称获取域sid?,active-directory,directoryservices,Active Directory,Directoryservices,我有Active Directory域的dns名称,我想获取此域的域sid。我该怎么做 我已有以下资料: var domainContext = new DirectoryContext(DirectoryContextType.Domain, domainDnsName); var domain = Domain.GetDomain(domainContext); var dc = domain.DomainControllers.OfType<DomainController&

我有Active Directory域的dns名称,我想获取此域的域sid。我该怎么做

我已有以下资料:

var domainContext =
    new DirectoryContext(DirectoryContextType.Domain, domainDnsName);
var domain = Domain.GetDomain(domainContext);
var dc = domain.DomainControllers.OfType<DomainController>().FirstOrDefault();
var域上下文=
新的DirectoryContext(DirectoryContextType.Domain,domainDnsName);
var domain=domain.GetDomain(domainContext);
var dc=domain.DomainControllers.OfType().FirstOrDefault();

但我有点被困在了该怎么走的地方(或者我走错了路线)。

你想要的是这样的:

DirectoryEntry domainEntry = domain.GetDirectoryEntry();
byte[] domainSid = domainEntry.Properties["objectSID"].Value as byte[];
SecurityIdentifier strongDomainSid = new SecurityIdentifier(domainSid, 0);

如果您使用的是本机代码

  • 为所需的域生成ldap查询字符串。例如,“LDAP://fabrikam.com”(它不必采用特殊形式,例如“LDAP://DC=fabrikam,DC.com”)

  • 获取表示域的
    ADs
    对象

    IADs domain = ADsGetObject(path);
    
  • 获取域对象的
    objectSid
    字节数组属性:

    Variant objectSid = domain.Get("objectSid");
    
  • 将二进制sid转换为字符串:

    Pointer p = SafeArrayAccessData(objectSid);
    String domainSid = ConvertSidToStringSid(p);
    
  • 它将返回一个好的域sid:

    String GetDomainSid(String domainName)
    {
       Variant objectSid = ADSGetObject(domainName).Get("objectSid");
       Pointer p = SafeArrayAccessData(objectSid);
       String domainSid = ConvertSidToStringSid(p);       
       SafeArrayUnaccessData(objectSid);
    
       return domainSid;
    }
    
    GetDomainSid("fabrikam.com") ==> "S-1-5-21-1708537768-844245398-2146844275"
    

    这不起作用:
    没有方法
    GetDirectoryEntry()
    DomainController
    可以,但它返回一个
    DirectoryEntry
    ,而不返回
    objectSid
    。MSDN说它可以-。如果不是出于任何原因,那你自己也没什么大不了的。只需为域的DN创建一个新的DirectoryEntry(例如,var de=new DirectoryEntry(“LDAP://dc=mydomain,dc=com”)。如果没有其他内容,您应该能够从域对象中删除DN。嗯,忽略了这个。但不确定默认命名上下文是否有objectSID。周末后将对此进行研究。谢谢!现在是这样的-每个域都有一个SIDIt工作。奇怪的是,我忽略了
    domain.GetDirectoryEntry
    方法。谢谢。
    String GetDomainSid(String domainName)
    {
       Variant objectSid = ADSGetObject(domainName).Get("objectSid");
       Pointer p = SafeArrayAccessData(objectSid);
       String domainSid = ConvertSidToStringSid(p);       
       SafeArrayUnaccessData(objectSid);
    
       return domainSid;
    }
    
    GetDomainSid("fabrikam.com") ==> "S-1-5-21-1708537768-844245398-2146844275"