3

質問:

C# で、ライブラリや厄介な LDAPを使用せずに Active Directory グループ SID を検索する方法はありますか?DirectoryServices.AccountManagement

[更新] -- なぜ私が尋ねているのか:

[Authorize]属性と基礎となるものは、ADWindowsPrincipal.IsInRole(string role)に対してのみチェックされます。samAccountName

これは、Microsoft がロールをチェックするときに避けることを提案している従来の識別子であるだけではありません。

// It is also better from a performance standpoint than the overload that accepts a string. 
// The aformentioned overloads remain in this class since we do not want to introduce a 
// breaking change. However, this method should be used in all new applications and we should document this.
public virtual bool IsInRole (SecurityIdentifier sid) {}

しかし、AD を制御することもできず、samAccountName が、セットアップを要求する「ユーザー フレンドリ」な名前と同期していることを保証できません。これが、単数形 (samAccountName) 文字列ではなく複数形 (Name) を渡すという問題が最初に発生した理由です...値が同じではありませんでした。

また、samAccountName と SID は変更される可能性があります。たとえば、AD 管理者がアカウントを削除して再作成した場合、SID は確実に異なり、samAccountName は人的エラーの別の場所になりますが、常に名前を復元します。要求された /UPN 値。

最終的には、SAM や SID をハードコーディングせずにグループ メンバーシップをチェックするために、独自のクリーンな authorize 属性を作成したいと考えています。

DirectoryServices.AccountManagement でこれを実行できることはわかっています。

// get group principal 
var pc = new PrincipalContext(ContextType.Domain, "domainName");
var gp = GroupPrincipal.FindByIdentity(pc, IdentityType.Name, "groupName");
// check if user is in group.
var up = UserPrincipal.Current;
var usersGroups = up.GetGroups();
var inGroup = usersGroups.Contains(gp);

プログラムされる属性を可能な限りスリムに保つために、これを行うためのより簡単で、依存度が低く、レガシーではない方法があるかどうかを知りたかっただけです。

以前の関連する質問: Active Directory Group Membership Checking in .Net 4.5

4

1 に答える 1

7

これは非常に簡単に実行できます。ドメイン コンテキストを設定し、グループを見つけ、Sidプロパティを取得します。次のようにします。

// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// find your group - by group name, group DN, SAM Account Name - whatever you like! 
// This is **NOT** limited to just SAM AccountName!
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, groupSamAccountName);

if(group != null)
{
    // this gives you the variable of type "SecurityIdentifier" to be used in your 
    // call to "IsInRole" ....
    SecurityIdentifier groupSid = group.Sid;
    string groupSidSDDL = groupSid.Value;
}

samAccountNameまた、 を使用することへの嫌悪感を理解できません。これは、各グループの必須で一意のプロパティであるため、グループを一意に識別するのに最適です。

System.DirectoryServices.AccountManagement(S.DS.AM) 名前空間を調べてください。ここでそれについてすべて読んでください:

新しい S.DS.AM を使用すると、AD でユーザーやグループを簡単に操作できます。

于 2012-10-31T21:17:39.630 に答える