目前,我正在尝试从(远程)计算机查询所有已安装的Windows服务。
我看了win32.Advapi32


  但是在这里,我只能“获取”定义的Windows服务(必须提供“ ServiceName”)。 (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);
       }
}

最佳答案

您错误地映射了EnumServicesStatusEx。第六个参数必须是传入缓冲区的大小(在您的第一个调用中,该参数应为零)。然后将指向所需大小的指针。

请注意,EnumServicesStatusEx需要10个参数,而您仅将其映射为9个。

08-26 05:35