Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Убить процесс (сервис). Права ограничены. Не могу поднять себе права. 
:(
    Опции темы
neosapient
Дата 22.11.2007, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Есть сервак. На него можно зайти удаленно через рАдмин. Есть сервис, который запускается/перегружается/удаляется через менеджер управления сервисами.
Проблема в том, что сервис иногда зависает в моменты открытия (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;
}


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


Это сообщение отредактировал(а) neosapient - 22.11.2007, 18:09
PM MAIL   Вверх
xvr
Дата 22.11.2007, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(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 и пр.



Это сообщение отредактировал(а) xvr - 22.11.2007, 19:54
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0432 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.