7

これは、リモート マシンから取得する必要があります。次のクエリは、SID ではなく、グループ名とアカウント名に対して機能します。

"SELECT GroupComponent FROM Win32_GroupUser WHERE PartComponent = \"Win32_UserAccount.Domain='" + accountDomain + "',Name='" + accountName + "'\""

返される Win32_Group オブジェクトは文字列の形式で提供され、ドメインと名前しかありません (Win32_Group には SID プロパティがあります)。

私はこの沈んだ気持ちを持っています。

  1. Win32_SID を照会して、SID をアカウント名に変換します。
  2. 上記のクエリを実行します。
  3. Win32_Groupを照会して、結果のグループ名を SID に変換します。
4

2 に答える 2

3

はい、ありますが、ドメインの所有に依存する方法もあります。

  1. P/Invoke と Windows API を使用して SID をユーザー ID に変換する方法、または .NET 2.0+ で P/Invoke を使用しない方法については、このページを参照してください。

    System.Security.Principal を使用します。

    // ユーザー sid を domain\name string account = new SecurityIdentifier(stringSid).Translate(typeof(NTAccount)).ToString(); に変換します。

  2. AD とそこにユーザー ID がある場合は、DirectorySearcher メソッドまたはアカウント管理 API を使用してグループを検索します。それ以外の場合は、この記事で説明されている方法を使用し てローカル グループを取得してください。

  3. @tvanfosson によって提案された API を使用して、グループを反復処理し、SID を取得します。または、以下の情報に従ってください。

ASP.NET アプリケーションでは、ユーザーがフォーム認証ではなく Windows によって認証されている場合、このようなコードを使用してグループ情報にアクセスできます。この例では、その環境でスローされる例外に関する興味深いメモを残しましたが、他のユーザーにも適用される可能性があります。

public List<string> GetGroupsFromLogonUserIdentity()
{
    List<string> groups = new List<string>();
    HttpRequest request = HttpContext.Current.Request;

    if (request.LogonUserIdentity.Groups != null)
    {
        foreach (IdentityReference group in request.LogonUserIdentity.Groups)
        {
            try
            {
                groups.Add(group.Translate(typeof(NTAccount)).ToString());
            }
            catch (IdentityNotMappedException)
            {
                // Swallow these exceptions without throwing an error. They are
                // the result of dead objects in AD which are associated with
                // user accounts. In this application users may have a group
                // name associated with their AD profile which cannot be
                // resolved in the Active Directory.
            }
        }
    }

    return groups;
}

LogonUserIdentity は、 WindowsIdentityクラスに基づいています。このコード サンプルを変更して、WindowsIdentity を使用し、Web 以外のアプリケーションで機能させることができます。グループを反復処理すると、SecurityIdentifier を取得するために次のようなことができるはずです。

SecurityIdentifier secid = group as SecurityIdentifier;
于 2010-03-22T19:56:50.697 に答える
3

System.DirectoryServices.AccountManagement名前空間クラスを使用できますか?

using (var context = new PrincipalContext( ContextType.Domain ))
{
    using (var user = UserPrincipal.FindByIdentity( context, accountName ))
    {
        var groups = user.GetAuthorizationGroups();
        ...iterate through groups and find SIDs for each one
    }
}

マシン名を指定し、適切な権限を持っている必要がありますが、ContextType.Machine で動作するはずです。

using (var context = new PrincipalContext( ContextType.Machine,
                                           "MyComputer",
                                           userid,
                                           password ))
{
   ...
}

新しい .NET 3.5 アカウント管理名前空間の使用に関するMSDN の記事(長めですが) があります。

于 2010-03-22T19:49:40.110 に答える