我正在使用这种在当前域中查找用户的简单方法,该方法适用于所有“存在”的用户,但我找不到任何方法来确定用户是否不存在。
string userLDAP = @"MYDOMAIN/username";
string path = "WinNT://" + userLDAP ;
DirectoryEntry root = new DirectoryEntry(path, null, null, AuthenticationTypes.Secure);
除了抛出异常之外,我如何使用目录条目来确定用户是否不存在?
if (root.Properties != null)
if (root.Properties["objectSid"] != null) //// EXCEPTION HERE
if (root.Properties["objectSid"][0] != null)
答案 0 :(得分:5)
最好将DirectorySearcher用于此目的......
string userName = "TargetUserName";
using (DirectorySearcher searcher = new DirectorySearcher("GC://yourdomain.com"))
{
searcher.Filter = string.Format("(&(objectClass=user)(sAMAccountName={0}))", userName);
using (SearchResultCollection results = searcher.FindAll())
{
if (results.Count > 0)
Debug.WriteLine("Found User");
}
}
此示例将搜索整个林,包括子域。如果您只想定位单个域,请使用“LDAP://mydomain.com”而不是“GC://mydomain.com”。您还可以使用DirectoryEntry提供searcher.SearchRoot作为搜索的根(即特定的OU或域)。
不要忘记大多数AD的东西是IDisposable所以如上所示正确处理。
答案 1 :(得分:0)
您在寻找特定用户或所有用户吗?
我有一个应用程序通过检查帐户名来检查用户是否在场 - 它使用SecurityIdentifier
命名空间中的System.Security.Principal
来检查Sid是否有效。
public bool AccountExists(string name)
{
bool SidExists = false;
try
{
NTAccount Acct = new NTAccount(name);
SecurityIdentifier id = (SecurityIdentifier)Acct.Translate(typeof(SecurityIdentifier));
SidExists = id.IsAccountSid();
}
catch (IdentityNotMappedException)
{
//Oh snap.
}
return SidExists;
}
您可以在创建NTAccount
对象
NTAccount Acct = new NTAccount("SampleDomain", "SampleName");
修改强>
参考你的评论,这对你有用吗?没有检查它,可能必须在评估IsAccountSid()
方法之前处理可能的空值返回...
public SecurityIdentifier AccountSID(string myDomain, string myAcct)
{
SecurityIdentifier id;
try
{
NTAccount Acct = new NTAccount(myDomain, myAcct);
id = (SecurityIdentifier)Acct.Translate(typeof(SecurityIdentifier));
}
catch (IdentityNotMappedException)
{
//Oh snap.
}
return id;
}
SecurityIdentifier AcctSID = AccountSID("ExampleDomain", "ExampleName");
if (AcctSID.IsAccountSid())
//Do Something
答案 2 :(得分:0)
how to check if Windows user account name exists in domain对此问题的回答可能会对您有所帮助。
答案 3 :(得分:0)
我认为检查 DirectoryEntry 对象是否指向现有AD条目的简单方法是使用静态存在方法。
所以你的代码可能如下所示:
using(DirectoryEntry de = new DirectoryEntry(....)) {
// now we check if the related object exists
bool exists = DirectoryEntry.Exists(de.Path);
if(exists) {
// yes the objects exists
// do something
} // end if
} // end using
当然你可以省略exists变量。我用它只是为了使声明更清晰。