Java调用wmi执行dos命令
如题,我在网上找了一段代码,是java调用wmi的,但是这代码只能监控主机状态,查看了api也没有找到能执行dos命令得方法,请问调用wmi后是否可以执行dos命令?如果可以,请大神明示。
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 java.net.UnknownHostException;
import java.util.logging.Level;
public class WmiService {
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";
public WmiService(String address) {
JISystem.setAutoRegisteration(true);
JISystem.getLogger().setLevel(Level.WARNING);
m_Address = address;
}
public String[] query(String strQuery) {
System.out.println("query:" + 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;
String[] strs = new String[count];
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();
strs[c] = str;
}
return strs;
} catch (JIException e) {
e.printStackTrace();
}
return null;
}
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);//创建一个ComServer
IJIComObject unknown = m_ComStub.createInstance();//返回IJIComObject代表JIComServer服务器
m_ComObject = unknown.queryInterface(WMI_CLSID);//查询IID为WMI_CLSID得IJIComObject对象
m_Dispatch = (IJIDispatch) JIObjectFactory.narrowObject(m_ComObject.queryInterface(IJIDispatch.IID));//通过IJIComObject来返回IJIDispatch的一个引用
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) {
}
}
} catch (UnknownHostException e) {
if (m_Session != null) {
try {
JISession.destroySession(m_Session);
} catch (JIException e1) {
}
}
}
}
public void disconnect() {
try {
JISession.destroySession(m_Session);
} catch (JIException e) {
}
}
public static void main(String[] args) {
WmiService wmiService = new WmiService("192.168.1.134");
wmiService.connect("", "administrator", "goat");
// wmiService.query("SELECT * FROM Win32_BaseBoard");
wmiService.query("SELECT * FROM Win32_Processor");
// wmiService.query("SELECT * FROM Win32_VideoController");
// wmiService.query("SELECT * FROM Win32_NetworkAdapter");
// wmiService.query("SELECT * FROM Win32_ComputerSystem");
// wmiService.query("SELECT * FROM Win32_ComputerSystemProduct");
// wmiService.query("SELECT * FROM Win32_CDROMDrive");
// wmiService.query("SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name != '_Total'");
// wmiService.query("SELECT * FROM Win32_PerfFormattedData_PerfOS_Memory");
// wmiService.query("SELECT * FROM Win32_PerfRawData_PerfDisk_PhysicalDisk Where Name != '_Total'");
wmiService.disconnect();
}
}
最后有个哥们给我提示,但是我没有找到有这样得方法可以调用的。
set ww=createobject("wbemscripting.swbemlocator")
set cc=ww.connectserver("192.168.1.134","root/cimv2","administrator","goat")
Set pp=cc.get("Win32_Process")
pp.create("cmd /c echo test wmi for remote! >c:\a.log")