2017-12-20 20 views
-1

パスワードがすぐに期限切れになるActive Directoryからユーザーのリストを取得する必要があります(5日以内など)。アクティブディレクトリ - パスワードの期限が切れているユーザーのリストをすぐに取得する

これを行うには、DirectorySearcherにフィルタを追加する必要があります。 samaccountnameパターンをフィルタに追加しましたが、pwdLastSetを追加する方法を理解できません。理想的には、フィルターはパスワードの有効期限を満たすユーザーにのみユーザーリストを縮小します。

 using (DirectoryEntry searchRoot = GetXYZAccountOU()) 
     { 
      DirectorySearcher ds = new DirectorySearcher(searchRoot); 
      ds.SearchScope = SearchScope.Subtree; 

      ds.Filter = "(&" +         
          "(samaccountname=XYZ*)" 
      + ")"; 


      SearchResultCollection result = ds.FindAll(); 

      foreach (SearchResult searchResult in result) 
      { 
       var de = searchResult.GetDirectoryEntry(); 
       //long pwdLastSetVal = (long)de.Properties["pwdLastSet"][0]; 

       //Console.WriteLine(de.Properties["displayName"].Value + ": " + DateTime.FromFileTimeUtc(pwdLastSetVal)); 
       Console.WriteLine(de.Properties["displayName"].Value); 
      } 

      Console.Read(); 
     } 

ここで、XYZはユーザーのsamaccountnameの頭文字です。

私はこのコードを実行した場合、私は、Active Directoryのブラウザでそれらの両方を見ることができますが、私はdisplayNameといくつかの他の属性ではなくpwdLastSetまたは計算属性msDS-UserPasswordExpiryTimeComputedを得ることができます。

+1

あなたはPrincipalContextは、たとえばhttps://stackoverflow.com/questions/5535829/principalcontext-userprincipal-how-to-know-when-のためにここを見て使用してこれをやったほうが良いでしょうpassword-expires – MethodMan

+0

私は、UserPrincipalを使って1人のユーザーのパスワードの有効期限を知ることができたと知っていましたが、数日でパスワードの有効期限が切れているユーザーのリストを探す必要があります。すべてのユーザーのリストを取得し、各ユーザーの有効期限を見つけるために繰り返し実行すると、パフォーマンスの観点から非常に悪いことになります。 – Danish

+0

これを行うこともできますが、現在どのように単一のユーザーに対してこれを行っていますか?よく同じことをしますが、forループまたはforeachループの内部で行います。あなたはボックスの側面を考える必要があります – MethodMan

答えて

0

パスワードが有効である期間を事前に知っておき、pwdLastSet属性を照会してください。もちろん、日付は奇妙な形式で保存されています。

30日間有効であるとします。そして、あなたはこのようにクエリを作成することができます

var date = DateTime.Now.AddDays(-30).ToFileTime(); 
var query = $"(&(objectclass=user)(objectcategory=person)(!pwdlastset=0)(pwdlastset<={date})(!userAccountControl:1.2.840.113556.1.4.803:=65536))"; 

アカウントは、パスワードを無期限に設定することができますので、あなたのクエリで、そのために考慮しなければなりません。 userAccountControlの条件はそれを行います。

コード内でマジックナンバーを使用したくない場合は、ドメインのルートにあるmaxPwdAge属性を調べることで、ドメインで有効なパスワードの長さを調べることができます。別の、奇妙な形式):

var domain = new DirectoryEntry("LDAP://domain.com"); 
Int64 pwdAge = (Int64) domain.Properties["maxPwdAge"][0]; 
var maxPwdAge = pwdAge/-864000000000; //convert to days 
関連する問題