Skip to content

Commit

Permalink
0002025: Windows non-admin user cannot query service status
Browse files Browse the repository at this point in the history
  • Loading branch information
erilong committed Oct 25, 2014
1 parent 51a3e82 commit c52bc4c
Showing 1 changed file with 30 additions and 3 deletions.
Expand Up @@ -43,6 +43,7 @@
import com.sun.jna.platform.win32.Winsvc;
import com.sun.jna.platform.win32.Winsvc.SC_HANDLE;
import com.sun.jna.platform.win32.Winsvc.SC_STATUS_TYPE;
import com.sun.jna.platform.win32.Winsvc.SERVICE_STATUS_PROCESS;
import com.sun.jna.ptr.IntByReference;

@IgnoreJRERequirement
Expand Down Expand Up @@ -134,6 +135,30 @@ public void stop() {
}
}

@Override
public boolean isRunning() {
Advapi32 advapi = Advapi32.INSTANCE;
SC_HANDLE manager = advapi.OpenSCManager(null, null, Winsvc.SC_MANAGER_ENUMERATE_SERVICE);
if (manager == null) {
throwException("OpenSCManager");
} else {
SC_HANDLE service = advapi.OpenService(manager, config.getName(), Winsvc.SERVICE_QUERY_STATUS);
if (service != null) {
IntByReference bytesNeeded = new IntByReference();
advapi.QueryServiceStatusEx(service, SC_STATUS_TYPE.SC_STATUS_PROCESS_INFO, null, 0, bytesNeeded);
SERVICE_STATUS_PROCESS status = new SERVICE_STATUS_PROCESS(bytesNeeded.getValue());
if (!advapi.QueryServiceStatusEx(service, SC_STATUS_TYPE.SC_STATUS_PROCESS_INFO, status, status.size(), bytesNeeded)) {
throwException("QueryServiceStatusEx");
}
closeServiceHandle(service);
closeServiceHandle(manager);
return (status.dwCurrentState == Winsvc.SERVICE_RUNNING);
}
closeServiceHandle(manager);
}
return super.isRunning();
}

@Override
protected boolean isPidRunning(int pid) {
boolean isRunning = false;
Expand Down Expand Up @@ -169,9 +194,11 @@ public boolean isInstalled() {
Advapi32 advapi = Advapi32.INSTANCE;
boolean isInstalled = false;

SC_HANDLE manager = openServiceManager();
if (manager != null) {
SC_HANDLE service = advapi.OpenService(manager, config.getName(), Winsvc.SERVICE_ALL_ACCESS);
SC_HANDLE manager = advapi.OpenSCManager(null, null, Winsvc.SC_MANAGER_ENUMERATE_SERVICE);
if (manager == null) {
throwException("OpenSCManager");
} else {
SC_HANDLE service = advapi.OpenService(manager, config.getName(), Winsvc.SERVICE_QUERY_STATUS);
isInstalled = (service != null);
closeServiceHandle(service);
closeServiceHandle(manager);
Expand Down

0 comments on commit c52bc4c

Please sign in to comment.