2013-12-13 3 views
2

В настоящее время я пытаюсь запросить все установленные службы Windows с (удаленной) машины. Я взглянул на win32.Advapi32.Запросить все службы Windows с помощью JNA

Но здесь я могу только «получить» определенный (я должен предоставить «ServiceName») Службы Windows. (Advapi32.INSTANCE.OpenSCManager, Advapi32.INSTANCE.OpenService, Advapi32.INSTANCE.QueryServiceStatusEx)

Знаете ли вы API, который позволяет запросить все службы Windows из (удаленных) машин?

EDIT: //

Я попробовал Allready со следующим кодом. Но он почти не прерывает сообщение об ошибке!

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. Я не могу/не буду называть инструмент «третьей стороны» и читать поток. 2. Хмм я ничего не узнал о том, какой apis этот инструмент вызывает. Возникает вопрос: какой API этот инструмент вызывает для запроса всех установленных служб Windows? Но спасибо до сих пор –

+0

Похоже, что ['EnumServicesStatusEx'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682640 (v = vs.85) .aspx) - это то, что вы хотите. – technomage

ответ

1

Вы неправильно картировали EnumServicesStatusEx. Шестой аргумент должен быть размером переданного буфера (в вашем первом вызове это должно быть ноль). Тогда появится указатель на требуемый размер.

Заметим, что EnumServicesStatusEx требует 10 аргументов, и вы указали только девять.

+0

Да, конечно, «Открой глаза». Я исправлю это и снова проведу тест. –

Смежные вопросы