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;
}
参考: