gpt4 book ai didi

java - 使用 JNA 查询所有 Windows 服务

转载 作者:行者123 更新时间:2023-11-30 11:24:49 24 4
gpt4 key购买 nike

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

But here I can only "get" a defined (I have to give a "ServiceName") Windows Services. (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 个。

关于java - 使用 JNA 查询所有 Windows 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20562528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com