我们有一个由 Apache Tomcat 6 提供的 Java 网络应用程序。我们的用户存储在 Windows 2008 R2 Activity 目录中。 应用程序使用来自 org.jvnet.com4j.typelibs 库版本 1.0 的 COM4J 连接到 AD
例如,我们搜索一个用户属性:
public <T> T getValueFromAD(Filter filter, String atributes, ADObjectMapper<T> mapper, T nullValue)
{
_Connection con = com4j.typelibs.ado20.ClassFactory.createConnection();
try
{
con.provider("ADsDSOObject");
con.open("AD-Anon-Search", "", "", -1/*default*/);
_Command cmd = com4j.typelibs.ado20.ClassFactory.createCommand();
try
{
cmd.activeConnection(con);
cmd.commandText("<GC://" + this.domain + ">;" + filter.encode() + ";" + atributes + ";SubTree");
_Recordset rs = cmd.execute(Variant.getMissing(), Variant.getMissing(), -1/*default*/);
try
{
if (rs.eof())
return nullValue;
else
return mapper.mapRecordSet(rs);
}
finally {
rs.close();
rs.dispose();
}
}
finally {
cmd.dispose();
}
}
finally {
con.close();
con.dispose();
COM4J.cleanUp();
}
}
这用于很好地找到正确的位置,但有时(不是固定时间)它会停止工作并且对 AD 的查询会以访问错误响应,例如:
com4j.ComException: 80004005 Error no especificado : Error no especificado : .\invoke.cpp:517
at com4j.Wrapper.invoke(Wrapper.java:166)
at $Proxy108.execute(Unknown Source)
...
Caused by: com4j.ComException: 80004005 Error no especificado : Error no especificado : .\invoke.cpp:517
at com4j.Native.invoke(Native Method)
at com4j.StandardComMethod.invoke(StandardComMethod.java:35)
at com4j.Wrapper$InvocationThunk.call(Wrapper.java:340)
at com4j.Task.invoke(Task.java:51)
at com4j.ComThread.run0(ComThread.java:153)
at com4j.ComThread.run(ComThread.java:134)
或
com4j.ComException: 80072116 Traducción del nombre: no se puede encontrar el nombre o privilegios insuficientes para ver el nombre. : Traducción del nombre: no se puede encontrar el nombre o privilegios insuficientes para ver el nombre. : .\invoke.cpp:517
at com4j.Wrapper.invoke(Wrapper.java:166)
at $Proxy116.set(Unknown Source)
...
Caused by: com4j.ComException: 80072116 Traducción del nombre: no se puede encontrar el nombre o privilegios insuficientes para ver el nombre. : Traducción del nombre: no se puede encontrar el nombre o privilegios insuficientes para ver el nombre. : .\invoke.cpp:517
at com4j.Native.invoke(Native Method)
at com4j.StandardComMethod.invoke(StandardComMethod.java:35)
at com4j.Wrapper$InvocationThunk.call(Wrapper.java:340)
at com4j.Task.invoke(Task.java:51)
at com4j.ComThread.run0(ComThread.java:153)
at com4j.ComThread.run(ComThread.java:134)
有谁知道这个问题的原因,或者至少知道我们应该怎么做才能找到原因?
我们发现让它再次正常工作的唯一方法是重新启动 tomcat。
谢谢。亲切的问候。
最佳答案
终于找到问题了。这是由http://support.microsoft.com/kb/2494158绘制的场景引起的微软:
Consider the following scenario:
- You create a managed service account in a domain.
- You install the managed service account on a computer that is running Windows 7 or Windows Server 2008 R2.
- You configure a service to use the managed service account on the computer.
In this scenario, the service starts successfully. However, the managed service account authentication fails after 30 days.
Note The managed service account automatically updates the password every 30 days.
这正是我们的问题,因此应用网络中描述的修补程序解决了问题。希望这可以帮助其他人。
关于java - 从 Java 应用程序连接到 AD 时出现错误 80004005,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22326616/