2013-05-15 8 views
12

ADのユーザーアカウントが有効になっているかどうかを確認しようとしています。なぜUserPrincipal.Enabledが異なる値を返しますか?

string domain = "my domain"; 
string group = "my security group"; 
string ou = "my OU"; 

//init context 
using (var cnt= new PrincipalContext(ContextType.Domain, domain)) 
{ 
    //find the necessary security group 
    using (GroupPrincipal mainGroup 
       = GroupPrincipal.FindByIdentity(cnt, IdentityType.Guid, group)) 
    { 
     if (mainGroup != null) 
     { 
      //get the group's members 
      foreach (var user in mainGroup.GetMembers() 
            .OfType<UserPrincipal>() 
            .Where(u => u.DistinguishedName.Contains(ou))) 
      { 
       //ensure that all the info about the account is loaded 
       //by using FindByIdentity as opposed to GetMembers 
       var tmpUser= UserPrincipal.FindByIdentity(cnt, 
                  user.SamAccountName); 
       //actually I could use `user` variable, 
       //as it gave the same result as `tmpUser`. 

       //print the account info 
       Console.WriteLine(tmpUser.Name + "\t" + 
            tmpUser.Enabled.HasValue + "\t" + 
            tmpUser.Enabled.Value);      
      } 
     } 
    } 
} 

私は、管理者アカウントで、このコードを実行すると、私は非特権のアカウントの下でそれを実行するとしながら、私は、本当の結果を得るている問題、user.Enabled戻りfalseを:このために私は次のコードを使用します一部のアカウントではtrueである必要があります。

私は見つけることができただけで同様のQ &は、ここでは役に立たない

  1. UserPrincipal.Enabled returns False for accounts that are in fact enabled?
  2. Everything in Active Directory via C#.NET 3.5 (Using System.DirectoryServices.AccountManagement)

です。

なぜそうですか?非公開のアカウントでこの情報を取得するための選択肢は何ですか? How to determine if user account is enabled or disabled:ここ


は別のアプローチである

private bool IsActive(DirectoryEntry de) 
{ 
    if (de.NativeGuid == null) 
     return false; 

    int flags = (int)de.Properties["userAccountControl"].Value; 

    if (!Convert.ToBoolean(flags & 0x0002)) 
     return true; 
    else 
     return false; 
} 

同じアプローチはActive Directory Objects and C#に記載されています。

ただし、特権のないユーザーアカウントで実行されている場合、の属性はnullであり、アカウントの状態を判断することはできません。


ここでこの問題を回避するには、ADにアクセスするための十分なpriviledgesを持つユーザーの資格情報を指定し、PrincipalContext Constructorを使用することです。

私には不明な点があります。なぜなら、非特権ユーザーがADにアクセスできた理由と、特定のアカウント属性の値を取得できなかった理由です。おそらくこれはC#とは関係がなく、ADで設定する必要があります。

答えて

1

ADクエリを実行するアカウントのアクセス許可をActive Directoryに委任する必要があります。これは私のアプリケーションが動作するために必要だったものです(ユーザーアカウントで他の管理タスクを実行していますが)。

アクセス許可を委任する方法については、Hereを参照してください(または下記のblockquoteを参照してください)。

  • は、次の手順を実行して制御の委任ウィザードを起動します:
    • Active Directoryユーザーとコンピュータを開き

      あなたが委任を実行するには、次の手順を参照して。
    • コンソールツリーで、ドメインノードをダブルクリックします。
    • 詳細メニューで、組織単位を右クリックし、委任コントロールをクリックして、次へをクリックします。
    • 一般的な管理タスクを委任するユーザーまたはグループを選択します。これを行うには、次の手順を実行します。
    • [ユーザーまたはグループ]ページで、[追加]をクリックします。
    • ユーザー、コンピュータまたはグループを選択するには、組織単位の制御を委任する必要があるユーザーとグループの名前を入力し、[OK]をクリックします。次に[次へ]をクリックします。
    • 一般的なタスクを委任するに割り当てます。これを行うには、以下の一般的なタスクを実行します。
    • ページを削除するタスクで、次の一般的なタスクを委任をクリックします。
    • 委任するタスクのページで委任するタスクを選択し、[OK]をクリックします。例えば完了

をクリックしてください:ユーザー/コンピュータオブジェクトを移動するには、管理者を委任するには、ADユーザーとコンピュータの進歩モードを使用して委任を実行することができます。オブジェクト移動のための両方のOUに書き込み権限が必要です。新しい値を書き込むために、管理者アカウントだけでなく、ユーザーアカウント(特定のOU内の全権限に値を委任している必要があります。アカウントがuserAccountControl属性を持っている場合に探して価値が他の

何かがある。私はそれを聞きました

+0

リンクから正確な指示を追加することができれば、あなたの答えはリンクが壊れていなくても安全です! – ForceMagic

+1

ありがとうございました。リンクからの関連情報のブロッククォートを追加しました。 –

関連する問題