Есть сервак. На него можно зайти удаленно через рАдмин. Есть сервис, который запускается/перегружается/удаляется через менеджер управления сервисами. Проблема в том, что сервис иногда зависает в моменты открытия (starting) и закрытия (stoping). В этом случае надо убить процесс. Но проблема в том, что админ настроил рАдмин так, что через диспетчер задач не убить поток (профиль не имеет админских прав - через рАдмин подключаются другие люди, от них и защитились). Приходиться подключаться к серваку через удаленный доступ и под правами администратора. А подвисший сервис убивать из под рАдмина ну очень хочется.
Вот набросал пример, который работает у меня прекрастно (так как тестировал на своей локальной машине под провами админа). Вы не устали от слова админ?
Когда же начал тестить на удаленной машине мне стала появляться ошибка SetDebugStatusForCurentProc: SetDebugStatusForCurentProc error; 1300 1300 Not all privileges referenced are assigned to the caller. ERROR_NOT_ALL_ASSIGNED Пользователь обладает не всеми использованными правами доступа.
Ошибка возникает гдето между вызовами LookupPrivilegeValue и AdjustTokenPrivileges
Помогите мне убивать этот несчастный процесс. Считайте что пароль админа знаю. Может кто подскажет, как запустив эту же прогу, сделать её запущеной под правами админа?
Как поднять привилегию SE_DEBUG_NAME отсутствует в токене вызывающего Прочее Win2003
| Код | // main.cpp #include <windows.h> #include <Tlhelp32.h> #include <stdlib.h> #include <stdio.h> #include <conio.h>
DWORD GetProcessByExeName(char* ExeN) { DWORD id; HANDLE hProcessSnap = NULL; PROCESSENTRY32 pe32 = {0}; if(ExeN==NULL)return false; char temp[80]={0}; hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if(hProcessSnap==NULL) printf("GetProcessByExeName: CreateToolhelp32Snapshot error; %i\n",GetLastError()); pe32.dwSize=sizeof(PROCESSENTRY32); if(Process32First(hProcessSnap,&pe32)) strcpy(temp,pe32.szExeFile); else printf("GetProcessByExeName: Process32First error; %i\n",GetLastError()); pe32.dwSize=sizeof(PROCESSENTRY32); while(Process32Next(hProcessSnap,&pe32)) { strcpy(temp,pe32.szExeFile); pe32.dwSize = sizeof(PROCESSENTRY32); if (strcmp(temp,ExeN)==0) { if (GetLastError() != ERROR_SUCCESS){ printf("GetProcessByExeName: GetProcessByExeName2 error; %i\n",GetLastError()); } id = pe32.th32ProcessID; CloseHandle(hProcessSnap); return id; } } CloseHandle(hProcessSnap); return false; }
bool SetDebugStatusForCurentProc() { HANDLE hToken=0; LUID DebugValue={0}; TOKEN_PRIVILEGES tkp={0}; if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken)){ printf("SetDebugStatusForCurentProc: Can`t open process token; %i\n",GetLastError()); }
if (!LookupPrivilegeValue((LPSTR) NULL,SE_DEBUG_NAME,&DebugValue)){ printf("SetDebugStatusForCurentProc: Can`t lookup privilege value; %i\n",GetLastError()); }
tkp.PrivilegeCount = 1; tkp.Privileges[0].Luid = DebugValue; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(TOKEN_PRIVILEGES),(PTOKEN_PRIVILEGES)NULL,(PDWORD) NULL)){ printf("SetDebugStatusForCurentProc: Can`t adjust token privileges; %i\n",GetLastError()); } if (GetLastError() != ERROR_SUCCESS){ printf("SetDebugStatusForCurentProc: SetDebugStatusForCurentProc error; %i\n",GetLastError()); } return true; }
bool KillProcByPid(DWORD id) { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, id); if(hProcess==0 || hProcess==INVALID_HANDLE_VALUE) printf("KillProcByPid: Can`t open process; handle = %i ; %i\n",hProcess,GetLastError()); if(INVALID_HANDLE_VALUE != hProcess) { if(TerminateProcess(hProcess, 0)==FALSE) printf("KillProcByPid: Can`t terminate process; %i\n",GetLastError()); CloseHandle(hProcess); printf("KillProcByPid: Can`t close handle; %i\n",GetLastError()); } if (GetLastError() != ERROR_SUCCESS){ printf("KillProcByPid: SetDebugStatusForCurentProc error; %i\n",GetLastError()); } return 0; }
main(void) { DWORD pid=0; pid = GetProcessByExeName("Service.exe"); printf("pid=%i\n",pid); SetDebugStatusForCurentProc(); KillProcByPid(pid); printf("press any key...\n"); getch(); return 0; }
|
Жду вашей помощи.
|