Я разработал сервис окна (S1) на C++, который может запускать или останавливать службу удаленно. эта служба работает нормально, когда я запускаю это как процесс. Но это не работает, когда я добавляю это в диспетчер службы и запускаю под локальной системной учетной записью, в этом случае OpenSCManager возвращает 0 (доступ запрещен).Доступ запрещен при запуске или остановке окна службы удаленно
int main(int argc, char* argv[])
{
//this is sample code not complete service code//
char *premote_server= "192.168.122.100";
ImpersonateUser();
//access service control manager
SC_HANDLE hSCM = ::OpenSCManager(premote_server,
SERVICES_ACTIVE_DATABASE,
SC_MANAGER_ALL_ACCESS);
DWORD dwError = GetLastError(); //dwError is 5 which is Acess is denied.
if (hSCM == 0)
{
printf("ERROR: UNABLE TO OPEN SERVICE MANAGER\n");
PrintError(GetLastError());
return;
}
StopSvc(hSCM, 'servicename');
::CloseServiceHandle(hSCM);
delete[] pName;
return 0;
}
void ImpersonateUser()
{
//prepare to access remote system
DWORD id = GetCurrentProcessId();
HANDLE hp = OpenProcess(PROCESS_ALL_ACCESS, FALSE, id);
HANDLE t;
BOOL b = OpenProcessToken(hp,
TOKEN_QUERY | TOKEN_DUPLICATE ,
&t);
if(!ImpersonateLoggedOnUser(t))
{
PrintError(GetLastError());
return;
}
CloseHandle(hp); //close handle
CloseHandle(t);
}
void StopSvc(SC_HANDLE hSCM,, char *szSvcName)
{
SC_HANDLE hService = ::OpenService(hSCM,
szSvcName,
SERVICE_STOP);
if (hService == NULL)
{
printf("ERROR: COULDN'T OPEN SERVICE\n");
return;
}
SERVICE_STATUS status;
if(!::ControlService(hService,
SERVICE_CONTROL_STOP,
&status))
printf("ERROR: COULDN'T STOP SERVICE\n");
::CloseServiceHandle(hService);
QuerySvc(szNetworkName, szSvcName);
}
Примечание: 1. У меня есть права администратора на моей локальной системе, а также удаленную систему. 2. Я не могу изменить свойства службы входа в систему из-за других функций. 3.Я использую Visual Studio 2015 для разработки.
Вам не нужна ваша функция ImpersonateUser(), поскольку она делает то же самое, что и встроенный API ImpersonateSelf(). На самом деле вам это тоже не нужно; вы не делаете ничего, для чего полезно использовать самоликвидацию. –
Привет @ Харри Джонстон спасибо. он работает, но можно ли добавить LOCALCOMPUTERNAME в группу «Администраторы удаленного компьютера»? –