2010-02-12 14 views
6

C# 'da makine SID'sini (bilgisayar hesabının SID'si değil) almam gerekiyor. Bilgisayarın ana bilgisayar adı olması, mutlaka yerel bilgisayar olması ve etki alanı bilgisayarı veya çalışma grubu bilgisayarı olabilmesidir. bunu böylemakine SID'sini (birincil etki alanı denetleyicisi dahil) alın

private static class Helper 
    { 
     internal enum SID_NAME_USE 
     { 
      SidTypeUser = 1, 
      SidTypeGroup, 
      SidTypeDomain, 
      SidTypeAlias, 
      SidTypeWellKnownGroup, 
      SidTypeDeletedAccount, 
      SidTypeInvalid, 
      SidTypeUnknown, 
      SidTypeComputer 
     } 

     [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern bool LookupAccountName(
      string systemName, 
      string accountName, 
      byte[] sid, 
      ref int sidLen, 
      System.Text.StringBuilder domainName, 
      ref int domainNameLen, 
      out SID_NAME_USE peUse); 

     public static SecurityIdentifier LookupAccountName(
      string systemName, 
      string accountName, 
      out string strDomainName, 
      out SID_NAME_USE accountType) 
     { 
      const int ERROR_INSUFFICIENT_BUFFER = 122; 

      int lSidSize = 0; 
      int lDomainNameSize = 0; 

      //First get the required buffer sizes for SID and domain name. 
      LookupAccountName(systemName, 
           accountName, 
           null, 
           ref lSidSize, 
           null, 
           ref lDomainNameSize, 
           out accountType); 

      if (Marshal.GetLastWin32Error() == ERROR_INSUFFICIENT_BUFFER) 
      { 
       //Allocate the buffers with actual sizes that are required 
       //for SID and domain name. 
       byte[] sid = new byte[lSidSize]; 
       var sbDomainName = new System.Text.StringBuilder(lDomainNameSize); 

       if (LookupAccountName(systemName, 
             accountName, 
             sid, 
             ref lSidSize, 
             sbDomainName, 
             ref lDomainNameSize, 
             out accountType)) 
       { 
        strDomainName = sbDomainName.ToString(); 
        return new SecurityIdentifier(sid, 0); 
       } 
      } 

      throw new Win32Exception(); 
     } 
    } 

ve kullanma: Ben LookupAccountName API işlevi çağırmak için bu yardımcı sınıf kullanılarak

Helper.SID_NAME_USE accountType; 
string refDomain; 
SecurityIdentifier sid = Helper.LookupAccountName("falcon.mydomain.local", "falcon", out refDomain, out accountType); //Domain computer 

SecurityIdentifier sid = Helper.LookupAccountName("rat", "rat", out refDomain, out accountType); //Workgroup computer 

Benim tek sorun, bilgisayar birincil etki alanı denetleyicisi ise bu çalışmadığını (ihtiyacım Bu durumda alan adı SID elde etmek için).

cevap

2

Görünen en bilgisayarlar için aşağıdakileri yaptığınızdan:

LookupAccountName ("", "BilgisayarAdı", ...); ConvertSidToStringSid (...)

Ancak, etki alanı denetleyicileri için bilgisayar adı parametresine dolar işareti eklemeniz ve ardından döndürülen SID'deki son parçayı silmeniz gerekir.

İlgili konular