Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Убить процесс (сервис). Права ограничены.


Автор: neosapient 22.11.2007, 17:01
Есть сервак. На него можно зайти удаленно через рАдмин. Есть сервис, который запускается/перегружается/удаляется через менеджер управления сервисами.
Проблема в том, что сервис иногда зависает в моменты открытия (starting) и закрытия (stoping). В этом случае надо убить процесс. Но проблема в том, что админ настроил рАдмин так, что через диспетчер задач не убить поток (профиль не имеет админских прав - через рАдмин подключаются другие люди, от них и защитились).
Приходиться подключаться к серваку через удаленный доступ и под правами администратора. А подвисший сервис убивать из под рАдмина ну очень хочется.

Вот набросал пример, который работает у меня прекрастно (так как тестировал на своей локальной машине под провами админа).
Вы не устали от слова админ?  smile 

Когда же начал тестить на удаленной машине мне стала появляться ошибка 
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;
}


Жду вашей помощи.

Автор: xvr 22.11.2007, 19:54
Цитата(neosapient @ 22.11.2007,  17:01)
Есть сервак. На него можно зайти удаленно через рАдмин. Есть сервис, который запускается/перегружается/удаляется через менеджер управления сервисами.
Проблема в том, что сервис иногда зависает в моменты открытия (starting) и закрытия (stoping). В этом случае надо убить процесс. Но проблема в том, что админ настроил рАдмин так, что через диспетчер задач не убить поток (профиль не имеет админских прав - через рАдмин подключаются другие люди, от них и защитились).


Т.е. у рАдмин не хватает прав на эти действия.

Цитата

Когда же начал тестить на удаленной машине мне стала появляться ошибка 
SetDebugStatusForCurentProc: SetDebugStatusForCurentProc error; 1300
1300 Not all privileges referenced are assigned to the caller.  ERROR_NOT_ALL_ASSIGNED
Пользователь обладает не всеми использованными правами доступа. 


Ошибка возникает гдето между вызовами LookupPrivilegeValue и AdjustTokenPrivileges

Что не удивительно - прав то нет, и изменить их не дадут.

Цитата

Помогите мне убивать этот несчастный процесс. Считайте что пароль админа знаю.

Смотрите в районе функций LogonUser и ImpersonateLoggedOnUser. Добавьте эту связку перед LookupPrivilegeValue и пр.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)