2013-12-13 45 views
2

所有Windows服务目前我正在试图查询所有已安装的Windows服务从(远程)机器。 我看了一下win32.Advapi32查询与JNA

但是在这里我只能“定义”(我必须给出一个“ServiceName”)Windows服务。 (Advapi32.INSTANCE.OpenSCManager,Advapi32.INSTANCE.OpenService,Advapi32.INSTANCE.QueryServiceStatusEx)

你知道它允许查询所有Windows服务从(远程)机器的任何API?

编辑://

我用下面的代码试了一下。但它几乎没有错误信息而中止!

public void getService(){ 
    IntByReference size = new IntByReference(); 
    IntByReference lppcbBytesneeded = new IntByReference(); 
    IntByReference retz = new IntByReference(); 
    SC_HANDLE scm = Advapi32.INSTANCE.OpenSCManager(null, null, Winsvc.SC_MANAGER_ENUMERATE_SERVICE); 
    boolean ret = CustomAdvapi32.INSTANCE.EnumServicesStatusEx(scm, 0, 0x00000030, 0x0000000, null, lppcbBytesneeded, 
      retz, size, null); 
    //CustomAdvapi32.INSTANCE.EnumServicesStatusEx(hSCManager, InfoLevel, dwServiceType, dwServiceState, 
    //cbBufSize, pcbBytesNeeded, lpServicesReturned, lpResumeHandle, pstzGroupName) 
    int error = Native.getLastError(); 

     Memory buf = new Memory(lppcbBytesneeded.getValue()); 
     size.setValue(retz.getValue()); 
     ret = CustomAdvapi32.INSTANCE.EnumServicesStatusEx(scm, 0, 0x00000030, 0x0000000, 
       buf, lppcbBytesneeded, retz, size, null); 
     error = Native.getLastError(); 


     ENUM_SERVICE_STATUS_PROCESS serviceInfo = new ENUM_SERVICE_STATUS_PROCESS(buf); 
     Structure[] serviceInfos = serviceInfo.toArray(retz.getValue()); 

     for(int i = 0; i < retz.getValue(); i++) { 
     serviceInfo = (ENUM_SERVICE_STATUS_PROCESS) serviceInfos[i]; 
     System.out.println(serviceInfo.lpDisplayName + "/" + serviceInfo.lpServiceName); 
     } 
} 
+0

显然['sc'命令可以做到这一点](http://www.randomsupport.com/rs/blogs/index.php?title=howto_remotely_query_windows_service_inf&more=1&c=1&tb=1&pb=1),我会假设它使用SCManager功能来完成。 – technomage

+0

嗨,谢谢。但是1.我不能/不会调用“第三方”工具并阅读流。 2.嗯,我没有发现任何关于这个工具调用的apis的信息。问题是:该工具调用哪个API来查询所有安装的Windows服务?但是,到目前为止感谢 –

+0

它看起来像['EnumServicesStatusEx'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms682640(v = vs.85).aspx)是你想要的。 – technomage

回答

1

您错误地映射EnumServicesStatusEx。第六个参数需要在(在你的第一个电话,这应该是零)传递的缓冲区的大小。接下来会出现所需大小的指针。

注意EnumServicesStatusEx需要10个参数和你只九映射它。

+0

是的,当然是“睁开你的眼睛”。我会修复它并再次运行一些测试。 –