2009-04-03 7 views
5

Active Directoryユーザーアカウントのアカウントがロックされているかどうかを確認する方法を見つける必要があります。C-Sharp/CのActive Directoryからユーザーアカウントステータス(ロック/アンロック)を取得する

私はWindows 2000 ADでuserAccountControlプロパティを試しましたが、その特定のユーザーに間違ったパスワードを提供するワークステーションにログオンしようとすると、アカウントをロックするとそのプロパティがバイトを変更しません。私はADExplorer.exe semi-godによるユーティリティを使って知ることができます - > Mr. Russinovich

私は、3.5フレームワークでは.InvokeGet( "userLockedOut");私は.NET Framework 1.1で書かれたエンタープライズアプリケーションでこれをやろうとしています。新しいアプリケーションを使用するチャンスはありません。ここで

答えて

2

... Active Directoryのもの上のすべての情報とリンクされ、(正確なスニペットを見つけることができない私は、過去に行っているより少しです)キーはディレクトリ検索を行い、返されるユーザーのロックアウト時間に基づいて制限しています。さらに、特定のユーザーの場合、追加のプロパティを使用して検索をさらに制限できます。上記のcodeprojectリンクには、特定のロジック(検索制限のための)があると私は信じています。

class Lockout : IDisposable 
{ 
    DirectoryContext context; 
    DirectoryEntry root; 
    DomainPolicy policy; 

    public Lockout(string domainName) 
    { 
    this.context = new DirectoryContext(
     DirectoryContextType.Domain, 
     domainName 
    ); 

    //get our current domain policy 
    Domain domain = Domain.GetDomain(this.context); 

    this.root = domain.GetDirectoryEntry(); 
    this.policy = new DomainPolicy(this.root);  
    } 

    public void FindLockedAccounts() 
    { 
    //default for when accounts stay locked indefinitely 
    string qry = "(lockoutTime>=1)"; 

    TimeSpan duration = this.policy.LockoutDuration; 

    if (duration != TimeSpan.MaxValue) 
    { 
     DateTime lockoutThreshold = 
     DateTime.Now.Subtract(duration); 

     qry = String.Format(
     "(lockoutTime>={0})", 
     lockoutThreshold.ToFileTime() 
     ); 
    } 

    DirectorySearcher ds = new DirectorySearcher(
     this.root, 
     qry 
    ); 

    using (SearchResultCollection src = ds.FindAll()) 
    { 
     foreach (SearchResult sr in src) 
     { 
     long ticks = 
      (long)sr.Properties["lockoutTime"][0]; 

     Console.WriteLine(
      "{0} locked out at {1}", 
      sr.Properties["name"][0], 
      DateTime.FromFileTime(ticks) 
     ); 
     } 
    } 
    } 

    public void Dispose() 
    { 
    if (this.root != null) 
    { 
     this.root.Dispose(); 
    } 
    } 
} 

コードは、このポストから引き出された:http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/5e0fadc2-f27b-48f6-a6ac-644e12256c67/

+0

ジョシュアありがとうございます。しかし、残念ながら私がすでにウェブサーフィンをしていたソリューションは、.NET 2.0のクラスを実装しています など、 HostSecurityManager.DomainPolicyプロパティ メモ:このプロパティは、.NET Framework Version 2.0で新しく追加されました。 – monoco

+0

ああ、申し訳ありませんが、質問に答える私の興奮の1.1を見ていない。 – Joshua

0

.NET 1.1を見た後、このスレッドをチェックアウト:http://forums.asp.net/t/434077.aspxを、フィルターにlockoutTimeのを使用して、まだトリックを行う必要があります。

(&(objectClass=user)(objectCategory=person)(lockoutTime>=1)); 

もうひとつ、それは結局のところ、あなたは.NETのV.1.1を使用している場合は、その後、S.:(構文の多くを提供し、より大きなコードのポスト後)スレッド内の具体的

DSはInteger8を長整数に正しく変換します(1.0で動作しません)。つまり、反射コードを取り除くことができます(投稿内)。

//use the filter from above 

SearchResultCollection src = ds.FindAll(); 

foreach(SearchResult sr in src) 

{ 

    DateTime lockoutTime = DateTime.FromFileTime((long)sr.Properties["lockoutTime][0]); 

    Response.Output.Write("Locked Out on: {0}", lockoutTime.ToString()); 

} 
関連する問題