目前,我正在尝试从(远程)计算机查询所有已安装的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个。