2010-11-26 109 views
8

今天早上我发现了一个很好的方法(DirectoryEntry.Exists),它应该能够检查服务器上是否存在Active Directory对象。所以我尝试了一个简单的:如何使用凭据提供DirectoryEntry.Exists?

if (DirectoryEntry.Exists(path)) {} 

当然,它没有任何重载提供凭据。因为如果没有提供证书,我得到这个例外:

登录失败:未知的用户名或 错误的密码。 (System.DirectoryServices.DirectoryServicesCOMException)

有没有,让我在AD服务器来验证我的代码的可能性任何其他选择吗?或者检查一个对象的存在?

回答

13

在这种情况下,你不能使用像你说的静态方法存在:

DirectoryEntry directoryEntry = new DirectoryEntry(path); 
directoryEntry.Username = "username"; 
directoryEntry.Password = "password"; 

bool exists = false; 
// Validate with Guid 
try 
{ 
    var tmp = directoryEntry.Guid; 
    exists = true; 
} 
catch (COMException) 
{ 
    exists = false; 
} 
+0

这将是我的首选解决方案,但此属性对我来说似乎不是静态的,请看下面的内容:http://msdn.microsoft.com/zh-cn/library/system.directoryservices.directoryentry.username.aspx – 2010-11-26 14:31:10

0

如果运行该进程的用户没有调用DirectoryEntry.Exists的权限,则可以使用模拟。

这可能会有帮助(在AD背景下讨论模拟):http://www.codeproject.com/KB/system/everythingInAD.aspx

顺便说一句,如果你已经有了谁有权访问你需要的一切,与该用户为什么不只是过程中的用户的凭据(如/运行方式)?

+0

谢谢。发现也像,但没有提供我解决我的问题的后裔。 Runas在我目前的项目中确实不是一种选择......既不冒充也不冒险,但似乎是迄今为止最好的。 – 2010-11-26 10:17:24

1

所以回答的问题是:不可能。

最后编写一个自己的方法来获取DirectoryEntry的区分名称和指定的凭据。在存在/不存在的两种情况下,我都得到了DirectoryEntry的一个实例。为了检查它是否返回了有效的对象,我做了一个简单的尝试... catch以查看它是否导致异常。如果是这样,它是无效的。

恶心的检查,但它的作品。太糟糕了默认的.NET方法DirectoryEntry.Exists没有提供过载提供凭据就像DirectoryEntry的构造......

相关问题