3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(.Net)SIDを文字列に変換

ActiveDirectoryから取得したオブジェクトの SID はバイト型配列になっています。

これを文字列(S-1-5-21-xxx-xxx...)に変換する方法です。

WindowsAPIにMSDN:ConvertSidToStringSidという関数があるようなので、これを使うと簡単に文字列形式にできるようですね。

サンプルはこんな感じです。(C#)

/// 

/// ActiveDirectoryから取得したbyte配列をSID文字列形式に変換

///

/// 変換する SID へのポインタを指定します

/// NULL で終わる SID 文字列へのポインタを受け取る変数へのポインタを指定します。返されたバッファを解放するには、LocalFree 関数を使います。

/// 関数が成功すると、0 以外の値が返ります。関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、GetLastError 関数を使います。

[DllImport("advapi32.dll")]

private static extern int ConvertSidToStringSid(byte[] psid, ref IntPtr stringSid);

 

public static string SidToString(SearchResult res)

{

ResultPropertyValueCollection pvc = res.Properties["objectSid"];

byte[] sids = (byte[])pvc[0];

//ポインタ定義

IntPtr pStringSid = IntPtr.Zero;

//APIを使って変換 第二引数ポインタに結果が入ってる

int ret = ConvertSidToStringSid(sids, ref pStringSid);

//結果となる文字列変数定義

string strSid = string.Empty;

if (ret != 0)

{

//ポインタの先にある文字列をマネージStringに変換。

strSid = Marshal.PtrToStringAnsi(pStringSid);

//メモリ解放

Marshal.FreeCoTaskMem(pStringSid);

}

return strSid;

}

参考:

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