- PR -

C#からActive Directoryのユーザ、グループのSIDを取得したい

1
投稿者投稿内容
たけ
会議室デビュー日: 2004/12/13
投稿数: 6
投稿日時: 2004-12-13 22:31
MSDN Online「Active Directory でフォーム認証を使用する方法」を参考にしています。
http://www.microsoft.com/japan/msdn/net/security/SecNetHT02.asp

ログイン認証、およびユーザが所属するグループ名の取得はできたのですが、
ユーザとグループのSID(S-1-5-21-……-513)の取得方法が分かりません。

http://www.dotnet247.com/247reference/msgs/32/163897.aspx
を参考に、objectsidプロパティを取得し、中身を展開してみましたが、
S-1-5-…の形式では取得できませんでした。
S-1-5-…の形式で取得する方法をご存知の方がいらっしゃいましたら、
教えてください。よろしくお願いします。

以下、グループを取得するメソッド部分を抜粋します。
-----------------------------------
  public string GetGroups()
  {
   // ***************************
   // memberofグループを取得
   // ***************************
   DirectorySearcher search = new DirectorySearcher(_path);
   search.Filter = "(cn=" + _filterAttribute + ")";
   search.PropertiesToLoad.Add("memberOf");       
   search.PropertiesToLoad.Add("PrimaryGroupID");
   StringBuilder groupNames = new StringBuilder();

   try
   {
    SearchResult result = search.FindOne();
    primaryGroupId = (int)result.Properties["PrimaryGroupID"][0];

    foreach(String Key in result.Properties.PropertyNames)
    {
     // membrtofプロパティがあったら、中身を取得
     if(Key.Equals("memberof"))
     {
      String dn;
      int equalsIndex, commaIndex;
      int propertyCount = result.Properties["memberOf"].Count;

      for( int propertyCounter = 0; propertyCounter < propertyCount; propertyCounter++)
      {
       dn = (String)result.Properties["memberOf"][propertyCounter];
       equalsIndex = dn.IndexOf("=", 1);
       commaIndex = dn.IndexOf(",", 1);
       if (-1 == equalsIndex)
       {
        return null;
       }
       groupNames.Append("|");
       groupNames.Append(dn.Substring((equalsIndex + 1),
        (commaIndex - equalsIndex) - 1));
      }
     }
    }
   }
   catch(Exception ex)
   {
    throw new Exception("Error obtaining group names. " + ex.Message);
   }

   // ***************************
   // 「primary」グループを取得
   // ***************************
   search = new DirectorySearcher(_path);
   search.Filter = "(objectclass=group)";
   search.PropertiesToLoad.Add("PrimaryGroupToken");
   search.PropertiesToLoad.Add("distinguishedName");
   search.PropertiesToLoad.Add("objectsid");
   try
   {
    foreach(SearchResult result in search.FindAll()){

     int equalsIndex, commaIndex;
     
     int groupToken = (int)result.Properties["PrimaryGroupToken"][0];
     string groupName = (string)result.Properties["distinguishedName"][0];

// SIDの取得?? start
     System.Array ob = (System.Array)result.Properties["objectsid"][0];
     string sid = "";
     for(int i=0; i<ob.Length; i++)
     {
      sid += ((byte)ob.GetValue(i)).ToString("X2");
     }
// SIDの取得?? end

     // primaryグループの場合
     if(primaryGroupId == groupToken)
     {
      equalsIndex = groupName.IndexOf("=", 1);
      commaIndex = groupName.IndexOf(",", 1);
      if (-1 == equalsIndex)
      {
       return null;
      }
      groupNames.Insert(0, groupName.Substring((equalsIndex + 1),
       (commaIndex - equalsIndex) - 1));
     }
    }
   }
   catch(Exception ex)
   {
    throw new Exception("Error obtaining group names. " + ex.Message);
   }
   return groupNames.ToString();
  }
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2004-12-14 01:24
南部です。

コード:

[DllImport("advapi32.dll")]
public static extern int ConvertSidToStringSid(byte[] psid, ref IntPtr stringSid);

-- (略)--
ResultPropertyValueCollection pvc = res.Properties["objectSid"];
byte[] sids = (byte[])pvc[0];
IntPtr pStringSid = IntPtr.Zero;
int ret = ConvertSidToStringSid(sids, ref pStringSid);
if(ret != 0)
{
string stringSid = Marshal.PtrToStringAnsi(pStringSid);
System.Diagnostics.Debug.WriteLine(stringSid);
Marshal.FreeCoTaskMem(pStringSid);
}



こんな感じどうでしょうか。


[ メッセージ編集済み 編集者: nanbu 編集日時 2004-12-14 01:59 ]
たけ
会議室デビュー日: 2004/12/13
投稿数: 6
投稿日時: 2004-12-14 20:28
>南部さま
ありがとうございます!
S-1-5-…の形式で取得できました。
1

スキルアップ/キャリアアップ(JOB@IT)