Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何提供DirectoryEntry.Exists和凭据?_C#_.net_Active Directory_Directoryentry - Fatal编程技术网

C# 如何提供DirectoryEntry.Exists和凭据?

C# 如何提供DirectoryEntry.Exists和凭据?,c#,.net,active-directory,directoryentry,C#,.net,Active Directory,Directoryentry,今天早上我发现了一个很好的方法(),它应该能够检查服务器上是否存在Active Directory对象。所以我尝试了一个简单的方法: if (DirectoryEntry.Exists(path)) {} 当然,它没有任何重载来提供凭证。因为,如果未提供凭据,我会遇到此异常: 登录失败:未知用户名或密码 密码不正确。 (System.DirectoryServices.DirectoryServicesCOMException) 是否有其他选项可以让我在AD服务器上验证我的代码?或者检查对象是

今天早上我发现了一个很好的方法(),它应该能够检查服务器上是否存在Active Directory对象。所以我尝试了一个简单的方法:

if (DirectoryEntry.Exists(path)) {}
当然,它没有任何重载来提供凭证。因为,如果未提供凭据,我会遇到此异常:

登录失败:未知用户名或密码 密码不正确。 (System.DirectoryServices.DirectoryServicesCOMException)


是否有其他选项可以让我在AD服务器上验证我的代码?或者检查对象是否存在?

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

这可能会有帮助(在广告上下文中讨论模拟):


顺便说一句,如果您已经拥有一个用户的凭据,该用户可以访问您需要的所有内容,那么为什么不只是该用户的流程(例如/runas)?

这里您可以阅读有关C#中模拟的内容:


所以回答这个问题:不可能

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


糟糕的检查,但它有效。太糟糕了,默认的.net方法DirectoryEntry.Exists没有像DirectoryEntry构造函数那样提供提供凭据的重载…

在这种情况下,您不能使用静态方法Exists,正如您所说:

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; 
}

没有办法做到这一点,我已经写了一个连接问题,希望能解决它


我知道这是一个老问题,但问题的关键在于你可以窃取和修改™ 要创建接受凭据的版本,请执行以下操作:

存在公共静态bool(字符串路径、字符串用户名、字符串密码)
{
DirectoryEntry=新的DirectoryEntry(路径、用户名、密码);
尝试
{
_=entry.NativeObject;//引发异常(可能会中断应用程序)
返回true;
}
捕获(System.Runtime.InteropServices.COMException e)
{
如果(e.ErrorCode==未检查((int)0x80072030)||
e、 ErrorCode==未选中((int)0x80070003)| |//ERROR_DS_NO_此类对象和路径未找到(严格意义上未找到)
e、 ErrorCode==未选中((int)0x800708AC))//找不到组名
返回false;
投掷;
}
最后
{
entry.Dispose();
}
}
你必须做的一个改变是改变
Bind
的使用,因为这是一种
内部
方法,不能被像我们这样的凡人使用。取而代之的是,我只是得到了财产,而这正是我想要的

您可以这样使用:

var ouExists=Exists(“LDAP://hadoop.com/OU=Students,DC=hadoop,DC=com”,“用户名”,“密码”);

谢谢。我也发现了这一点,但并没有为我的问题提供一个下降的解决方案。Runas在我当前的项目中确实不是一个选项。。。模拟都不是,但似乎是目前为止最好的。这将是我首选的解决方案,但这个属性对我来说似乎不是静态的,看一看:哦,我看到了nevermind。是的,你必须实例化一个新的目录条目。已编辑。感谢提供一个很好的代码示例。显然这是唯一的办法。令人遗憾的是,默认的.net方法不可能做到这一点,但至少有一个很好的解决方法可以做到这一点!这将主要起作用,但在无法验证它是否实际存在(网络错误、未知域等)的情况下,将返回
false
。我只是借用了,仅当已知它不存在时才返回
false
,并重新引用任何其他异常。