gpt4 book ai didi

c# - 如何防止 DirectoryOperationException - 服务器无法处理目录请求

转载 作者:行者123 更新时间:2023-11-30 16:21:06 27 4
gpt4 key购买 nike

我正在尝试编写一个实用程序方法来更新 C# 中的 AD 属性(目前只是单值字符串属性)。这是一个不依赖 IIS 的独立实用程序。此方法将用于将数据从我们的 HR 系统加载到我们的 AD 中。

我能够使用 System.DirectoryServices.Protocols 有效地读取对象和属性。但是当我调用 ModifyRequest 方法时,我收到一个 DirectoryOperationException 消息“服务器无法处理目录请求”。

基于另一个 Stack Overflow 问题: .Net's Directory Services throws a strange exception

我尝试将端口 636 用于 SSL LDAP,但它并没有改变行为。

我没有使用 IIS,而是在 .NET 4.5 上,因此 .NET/IIS 的 Microsoft 补丁不适用。

谷歌搜索没有结果。

如果您知道为什么会出现这个错误,以及如何解决它,我将不胜感激。

下面的代码.. 请假设 Conn 包含来自封闭实用程序类的有效且经过身份验证的 LDAP 连接——如果需要,我可以提供封闭实用程序类的完整源代码。

异常发生在ModifyStringAttributeValues中的SendRequest行:

using System;
using System.Collections.Generic;
using System.DirectoryServices.Protocols;
using System.Net;

namespace MyOrganization.Common.Ldap
{
public class LdapSession
{
public bool UseKerberos { set; get; }
public String Host { set; get; }
public String UserId { set; get; }
public String Password { set; get; }
public String Tag { set; get; }
public int Port { set; get; }

public const int DefaultLdapPort = 389;

protected LdapConnection Conn;

public void EstablishV2()
{

}

public void Establish()
{

var effectivePort = Port == 0 ? DefaultLdapPort : Port;

Console.WriteLine("EffectivePort={0}", effectivePort);

var identifier = new LdapDirectoryIdentifier(Host, effectivePort);

if (UseKerberos)
{
Conn = new LdapConnection(identifier)
{
AuthType = AuthType.Kerberos,
Timeout = new TimeSpan(0, 10, 0, 0),
SessionOptions =
{
ProtocolVersion = 3,
VerifyServerCertificate =
new VerifyServerCertificateCallback((con, cer) => true),
SecureSocketLayer = true
}
};
}
else
{
Conn = new LdapConnection(identifier)
{
AuthType = AuthType.Basic,
Timeout = new TimeSpan(0, 10, 0, 0)
};

// Console.WriteLine("LPA: Binding with {0}, {1}", UserId, Password); // QUARTZ

Conn.Bind(new NetworkCredential(UserId, Password));
}


}

public IEnumerable<SearchResultEntry> Search(string cx, string filter, SearchScope searchScope, params string[] attrib)
{
var s = new SearchRequest(cx, filter, searchScope, attrib)
{
SizeLimit = 0,
TimeLimit = new TimeSpan(1, 0, 0) // One hour, zero minutes, zero seconds
};

var raw = Conn.SendRequest(s);

if (raw == null)
{
throw new Exception("null response");
}

var r = raw as SearchResponse;

if (r != null)
{
// Console.WriteLine(Tag + "Search response entries: {0}", r.Entries.Count); // QUARTZ

foreach (SearchResultEntry e in r.Entries)
{
yield return e;
}
}
else
{
// Console.WriteLine(Tag + "Search response was null" ); // QUARTZ
}

yield break;
}


public ResultCode ModifyStringAttributeValues(string dn, IDictionary<string, string> modifications)
{
// declare the request and response objects here
// they are used in two blocks
ModifyRequest modRequest;
ModifyResponse modResponse;

try
{
// initialize the modRequest object
modRequest =
new ModifyRequest(dn);

modRequest.Controls.Add(new PermissiveModifyControl());

var mods = new DirectoryAttributeModification[modifications.Count];

int z = 0;
foreach (var pair in modifications)
{
var mod = new DirectoryAttributeModification();
mod.Operation = DirectoryAttributeOperation.Replace;
mod.Name = pair.Key;
mod.Add(pair.Value);

mods[z] = mod;

z += 1;
}

// cast the returned directory response into a ModifyResponse type
// named modResponse
modResponse =
(ModifyResponse)Conn.SendRequest(modRequest);

return modResponse.ResultCode;
}

catch (Exception e)
{
Console.WriteLine("\nUnexpected exception occured:\n\t{0}: {1}",
e.GetType().Name, e.Message);

return ResultCode.Unavailable;
}
}
}
}

我知道代码有点笨拙,而且充满了奇怪的注释——它是在我让它运行时根据 Microsoft 网站上的示例代码剪切、粘贴和修改的。

最佳答案

如果有人再次遇到这个问题,这是我的解决方案。删除重复用户证书的操作为我解决了这个问题。以下是步骤

  1. 运行 > certmgr.msc
  2. 进入personal文件夹,找到相关的证书
  3. 最后删除所有重复的证书

关于c# - 如何防止 DirectoryOperationException - 服务器无法处理目录请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13500487/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com