현재 (원격) 컴퓨터에서 설치된 모든 Windows 서비스를 쿼리하려고합니다. win32.Advapi32
을 살펴 보았습니다.JNA를 사용하여 모든 Windows 서비스 쿼리
하지만 여기에서는 정의 된 ("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);
}
}
분명히 [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
안녕하세요, 감사합니다. 하지만 1. "제 3 자"도구를 호출하거나 스트림을 읽을 수는 없습니다. 2. 흠, 나는이 도구가 어떤 API를 호출하는지 알지 못했습니다. 질문 :이 도구가 모든 설치된 Windows 서비스를 쿼리하기 위해 호출하는 API는 무엇입니까? 하지만 고마워 지금까지 –
['EnumServicesStatusEx'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682640(v=vs.85) .aspx)가 원하는 것입니다. – technomage