2013-12-13 1 views
2

현재 (원격) 컴퓨터에서 설치된 모든 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); 
     } 
} 
+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. "제 3 자"도구를 호출하거나 스트림을 읽을 수는 없습니다. 2. 흠, 나는이 도구가 어떤 API를 호출하는지 알지 못했습니다. 질문 :이 도구가 모든 설치된 Windows 서비스를 쿼리하기 위해 호출하는 API는 무엇입니까? 하지만 고마워 지금까지 –

+0

['EnumServicesStatusEx'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682640(v=vs.85) .aspx)가 원하는 것입니다. – technomage

답변

1

EnumServicesStatusEx을 잘못 매핑했습니다. 여섯 번째 인수는 전달 된 버퍼의 크기 여야합니다 (첫 번째 호출에서는 0이어야합니다). 그러면 필요한 크기의 포인터가 다음에 올 것입니다.

EnumServicesStatusEx에는 10 개의 인수가 필요하며 9 개만 매핑했습니다.

+0

물론 "눈을 뜨고". 나는 그것을 고치고 다시 시험을 보게 될 것이다. –