пятница, 12 февраля 2010 г.

Поднимаем привилегии до админа под Windows XP

Понадобилось мне как-то сделать так, чтобы моя программа, будучи запущенной под ограниченным пользователем,  могла сама себе поднимать привилегии до администраторских.

Исходные условия: Windows XP, известные логин и пароль админа.
Цель: Научить программу поднимать себе привилегии.

Все оказалось достаточно просто:
#include "windows.h"

//Поднять права до админских
bool logonAsAdmin()
{
  LPTSTR lpszUsername = L"Admin"; // логин админа
  LPTSTR lpszDomain = NULL;  // домен
  LPTSTR lpszPassword = L"passw"; // пароль админа
  HANDLE hToken;  //маркер доступа (токен)

  //Получаем токен админа
  if (!LogonUser(lpszUsername, lpszDomain, lpszPassword, LOGON32_LOGON_INTERACTIVE,
         LOGON32_PROVIDER_DEFAULT, &hToken))
   return false;

  //Прикидываемся админом
  if (!ImpersonateLoggedOnUser(hToken))
   return false;

  return true;
}

* This source code was highlighted with Source Code Highlighter.
Но тут надо помнить о дыре, которую дает данный код. Дело в том, что в программе может быть код, дающий пользователю доступ к файловой системе с правами админа. Например, если в вашей программе есть диалог открытия файла и вы дали своей программе админский доступ, то такой доступ получит и пользователь программы.
Поэтому, перед тем как вызвать диалог открытия/сохранения файла - верните программе юзерский уровень и поднимите его обратно после работы с диалогом.
Или давайте админский уровень своей программе только на очень короткий срок и немедленно возвращайте его обратно, как только надобность в нем отпадет.

Комментариев нет:

Отправить комментарий