#include <iostream>
#include <windows.h>
#include <tchar.h>
#include "EnableDebugPrivilege.h"
using namespace std;
int main()
{
//------------------------------------------------------------------------
EnableDebugPrivilege(INVALID_HANDLE_VALUE);
//------------------------------------------------------------------------
SC_HANDLE schSCManager;
schSCManager=OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (NULL!=schSCManager)
{
SC_HANDLE schService;
_TCHAR *ser_name=_T("nnCron");
schService = OpenService(schSCManager, LPCWSTR(ser_name), SERVICE_STOP | DELETE);
if(NULL!=schService)
{
SERVICE_STATUS Status;
ControlService(schService, SERVICE_CONTROL_STOP, &Status);
Sleep(200);
BOOL bOk = DeleteService(schService);
//------------------------------------------------------------------------
if(bOk)
{
Sleep(1000);
if(StartService(schService,
0,
NULL
))
else
cout<<"Don't start service..."<<endl;
}
//------------------------------------------------------------------------
CloseServiceHandle(schService);
}
else
cout<<"Service not access - "<<GetLastError()<<endl;
CloseServiceHandle(schSCManager);
}
else
cout<<"Not Connection - "<<GetLastError()<<endl;
//------------------------------------------------------------------------
return 0;
}
EnableDebugPrivilege
Код:
EnableDebugPrivilege.cpp
Код:
#include <windows.h>
void EnableDebugPrivilege(bool fEnable)
{
HANDLE hToken;
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
AdjustTokenPrivileges(hToken, false, &tp, sizeof(tp), NULL, NULL);
CloseHandle(hToken);
}
}
void EnableDebugPrivilege(bool fEnable)
{
HANDLE hToken;
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
AdjustTokenPrivileges(hToken, false, &tp, sizeof(tp), NULL, NULL);
CloseHandle(hToken);
}
}
Пытаюсь отключить на время службу и потом её включить.
1. С админскими правами службу включить обратно не удаётся;
2. Под Пользователем вообще не удаётся подключиться к Service Control Manager, не смотря на наличие EnableDebugPrivilege().