2

SID のみを持つ UserPrincipal を使用して Active Directory を検索する方法はありますか? byte[] に SID があり (以前は DirectorySearcher で照会されていました)、StringBuilder を使用してそれを "S-1-15-..." および "\01\05.." に変換しました。

私はそれをこのように処理しようとしました:

PrincipalContext pContext = new PrincipalContext(ContextType.Domain);
UserPrincipal pUser = new UserPrincipal(pContext);
pUser.Sid = stringBuilder.ToString();
PrincipalSearcher pSearcher = new PrincipalSearcher();
pSearcher.QueryFilter = pUser;
Console.WriteLine(pSearcher.FindOne().DistinguishedName.ToString());

Visual Studio は、Sid が書き込み保護されていることを教えてくれます。もちろん...

前もって感謝し、乾杯アレックス

ps: ここで説明されている方法で解決しようとしました: How can I convert from a SID to an account name in C# , but no success here.

4

2 に答える 2

5

遅いよりはましです。あなたの質問は私を助けてくれたので、後世のためにこの回答に完全性を追加しようと思いました. 私のコンテキストはローカル マシンであり、FindByIdentity遅すぎることに注意してください。

あなたは正しい道を歩んでいました。この回答は、LINQ を使用して、PrincipalSearcher. これらのクエリは、SID を介してアカウントをすばやく見つけるためのトリックを実行しました。

private static GroupPrincipal GetGroup(string accountSid)
{
  PrincipalContext oPrincipalContext = GetPrincipalContext();
  GroupPrincipal oGroupPrincipal = new GroupPrincipal(oPrincipalContext);
  return new PrincipalSearcher(oGroupPrincipal).FindAll().Cast<GroupPrincipal>()
  .FirstOrDefault(x => x.Sid.Value.Equals(accountSid, StringComparison.OrdinalIgnoreCase));
}

private static UserPrincipal GetUser(string accountSid)
{
  PrincipalContext oPrincipalContext = GetPrincipalContext();
  UserPrincipal oUserPrincipal = new UserPrincipal(oPrincipalContext);
  return new PrincipalSearcher(oUserPrincipal).FindAll().Cast<UserPrincipal>()
  .FirstOrDefault(x => x.Sid.Value.Equals(accountSid, StringComparison.OrdinalIgnoreCase));
}

private static PrincipalContext GetPrincipalContext()
{
  return new PrincipalContext(ContextType.Machine, Environment.MachineName);
}

詳細については、このテーマに関する私の投稿を参照してください。

于 2016-11-22T06:13:54.427 に答える