j-Interop调用windows的wmi获取监控数据问题

annhey 2014-04-22 08:53:35
因项目需监控远程服务器,于是在网上了解了下j-Interop,不过测试时一直在报socket write error,不知道有没有遇到同样问题的。
下面是控制台完整错误信息:
org.jinterop.dcom.common.JIException: Message not found for errorCode: 0xC0000001
at org.jinterop.winreg.smb.JIWinRegStub.winreg_OpenHKLM(JIWinRegStub.java:113)
at org.jinterop.dcom.core.JIProgId.getIdFromWinReg(JIProgId.java:128)
at org.jinterop.dcom.core.JIProgId.getCorrespondingCLSID(JIProgId.java:160)
at org.jinterop.dcom.core.JIComServer.<init>(JIComServer.java:428)
at com.nrsdn.net.wmi.WMITest.connect(WMITest.java:82)
at com.nrsdn.net.wmi.WMITest.main(WMITest.java:139)
Caused by: jcifs.smb.SmbException
jcifs.util.transport.TransportException
java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at jcifs.smb.SmbTransport.negotiate(SmbTransport.java:266)
at jcifs.smb.SmbTransport.doConnect(SmbTransport.java:302)
at jcifs.util.transport.Transport.run(Transport.java:240)
at java.lang.Thread.run(Unknown Source)

at jcifs.util.transport.Transport.run(Transport.java:256)
at java.lang.Thread.run(Unknown Source)

at jcifs.smb.SmbTransport.connect(SmbTransport.java:292)
at jcifs.smb.SmbTree.treeConnect(SmbTree.java:139)
at jcifs.smb.SmbFile.doConnect(SmbFile.java:847)
at jcifs.smb.SmbFile.connect(SmbFile.java:890)
at jcifs.smb.SmbFile.connect0(SmbFile.java:816)
at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:73)
at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:62)
at jcifs.smb.SmbFile.getInputStream(SmbFile.java:2765)
at rpc.ncacn_np.RpcTransport.attach(RpcTransport.java:91)
at rpc.Stub.attach(Stub.java:106)
at rpc.Stub.call(Stub.java:110)
at org.jinterop.winreg.smb.JIWinRegStub.winreg_OpenHKLM(JIWinRegStub.java:111)
... 5 more
Exception in thread "main" java.lang.NullPointerException
at com.nrsdn.net.wmi.WMITest.query(WMITest.java:44)
at com.nrsdn.net.wmi.WMITest.main(WMITest.java:142)


下面是调用代码:
package com.nrsdn.net.wmi;
import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.common.JISystem;
import org.jinterop.dcom.core.*;
import org.jinterop.dcom.impls.JIObjectFactory;
import org.jinterop.dcom.impls.automation.IJIDispatch;
import org.jinterop.dcom.impls.automation.IJIEnumVariant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.UnknownHostException;
import java.util.logging.Level;

/**
* Created with IntelliJ IDEA.
* User: noah
* Date: 8/16/12
* Time: 8:00 AM
* To change this template use File | Settings | File Templates.
*/
public class WMITest {
private JIComServer m_ComStub = null;
private IJIComObject m_ComObject = null;
private IJIDispatch m_Dispatch = null;
private String m_Address = null;
private JISession m_Session = null;
private IJIDispatch m_WbemServices = null;

private static final String WMI_CLSID = "76A6415B-CB41-11d1-8B02-00600806D9B6";
private static final String WMI_PROGID = "WbemScripting.SWbemLocator";

private Logger logger = LoggerFactory.getLogger(this.getClass());


public WMITest(String address) {
JISystem.setAutoRegisteration(true);
JISystem.getLogger().setLevel(Level.WARNING);
m_Address = address;
}

public void query(String strQuery) {
JIVariant results[] = new JIVariant[0];
try {
results = m_WbemServices.callMethodA("ExecQuery", new Object[]{new JIString(strQuery), JIVariant.OPTIONAL_PARAM(), JIVariant.OPTIONAL_PARAM(), JIVariant.OPTIONAL_PARAM()});
IJIDispatch wOSd = (IJIDispatch) JIObjectFactory.narrowObject((results[0]).getObjectAsComObject());

int count = wOSd.get("Count").getObjectAsInt();

IJIComObject enumComObject = wOSd.get("_NewEnum").getObjectAsComObject();
IJIEnumVariant enumVariant = (IJIEnumVariant) JIObjectFactory.narrowObject(enumComObject.queryInterface(IJIEnumVariant.IID));

IJIDispatch wbemObject_dispatch = null;

for (int c = 0; c < count; c++) {

Object[] values = enumVariant.next(1);
JIArray array = (JIArray) values[0];
Object[] arrayObj = (Object[]) array.getArrayInstance();
for (int j = 0; j < arrayObj.length; j++) {
wbemObject_dispatch = (IJIDispatch) JIObjectFactory.narrowObject(((JIVariant) arrayObj[j]).getObjectAsComObject());
}

String str = (wbemObject_dispatch.callMethodA("GetObjectText_", new Object[]{1}))[0].getObjectAsString2();
System.out.println("(" + c + "):");
System.out.println(str);
System.out.println();
}


} catch (JIException e) {
e.printStackTrace();
}
}

public void connect(final String domain, final String username, final String password) {
try {

m_Session = JISession.createSession(domain, username, password);
m_Session.useSessionSecurity(true);
m_Session.setGlobalSocketTimeout(5000);

m_ComStub = new JIComServer(JIProgId.valueOf(WMI_PROGID), m_Address, m_Session);

IJIComObject unknown = m_ComStub.createInstance();
m_ComObject = unknown.queryInterface(WMI_CLSID);

m_Dispatch = (IJIDispatch) JIObjectFactory.narrowObject(m_ComObject.queryInterface(IJIDispatch.IID));
JIVariant results[] = m_Dispatch.callMethodA(
"ConnectServer",
new Object[]{
new JIString(m_Address),
JIVariant.OPTIONAL_PARAM(),
JIVariant.OPTIONAL_PARAM(),
JIVariant.OPTIONAL_PARAM(),
JIVariant.OPTIONAL_PARAM(),
JIVariant.OPTIONAL_PARAM(),
0,
JIVariant.OPTIONAL_PARAM()
}
);

m_WbemServices = (IJIDispatch) JIObjectFactory.narrowObject((results[0]).getObjectAsComObject());

} catch (JIException e) {
e.printStackTrace();
if (m_Session != null) {
try {
JISession.destroySession(m_Session);
} catch (JIException e1) {
logger.error(e.getMessage(), e);
}
}
} catch (UnknownHostException e) {
if (m_Session != null) {
try {
JISession.destroySession(m_Session);
} catch (JIException e1) {
logger.error(e.getMessage(), e);
}
}
}
}

public void disconnect() {
try {
JISession.destroySession(m_Session);
} catch (JIException e) {
logger.error(e.getMessage(), e);
}
}


public static void main(String[] args) {

System.out.println("dfdfdsfdf");

WMITest wt = new WMITest("10.24.101.104");
//域(一般为空字符),用户名,密码
wt.connect("", "administrator", "password");

//系统信息
wt.query("SELECT * FROM Win32_ComputerSystem");

//CPU信息
wt.query("SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name != '_Total'");

//内存信息
wt.query("SELECT * FROM Win32_PerfFormattedData_PerfOS_Memory");

//磁盘信息
wt.query("SELECT * FROM Win32_PerfRawData_PerfDisk_PhysicalDisk Where Name != '_Total'");

wt.disconnect();

}
}
...全文
267 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiejc 2014-04-30
  • 打赏
  • 举报
回复
我测试了你的代码,在我这没问题,应该是你的防火墙没关闭吧。
annhey 2014-04-23
  • 打赏
  • 举报
回复
引用 1 楼 m3621552 的回复:
本地安全设置 启动控制面板,进入“管理工具”,然后单击“本地安全策略”。这将打开“本地安全设置”窗口 进入“本地策略” - >“安全选项”>“网络访问:共享和本地帐户的安全模式”更改为“经典”。 google到的:https://wiki.eclipse.org/Hudson-ci/Troubleshooting_DCOM_Slaves 你参考下
已经是经典模式了,不过还是谢谢哦
m3621552 2014-04-22
  • 打赏
  • 举报
回复
本地安全设置 启动控制面板,进入“管理工具”,然后单击“本地安全策略”。这将打开“本地安全设置”窗口 进入“本地策略” - >“安全选项”>“网络访问:共享和本地帐户的安全模式”更改为“经典”。 google到的:https://wiki.eclipse.org/Hudson-ci/Troubleshooting_DCOM_Slaves 你参考下

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧