Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2009, 11:14   #1
ikot
Пользователь
 
Регистрация: 29.09.2008
Сообщений: 56
По умолчанию Повышение прав пользователя

Помогите разобраться со следующей проблемой.
Как запустить программу, требующую прав администратора, под учетной записью user с ограниченными правами.
Если можно 2 варианта:
- как это сделать, если известны логин и пароль администратора
- логин и пароль не известны

P.S. Это надо сделать так, чтобы пользователь не заметил...

Последний раз редактировалось ikot; 23.08.2009 в 11:23.
ikot вне форума Ответить с цитированием
Старый 23.08.2009, 11:23   #2
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

А на каком языке? И какую программу - вашу, или чужую?
BaronTreep вне форума Ответить с цитированием
Старый 23.08.2009, 11:45   #3
ikot
Пользователь
 
Регистрация: 29.09.2008
Сообщений: 56
По умолчанию

Цитата:
Сообщение от BaronTreep Посмотреть сообщение
А на каком языке? И какую программу - вашу, или чужую?
на Delphi. Программу свою.
ikot вне форума Ответить с цитированием
Старый 23.08.2009, 11:55   #4
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Если свою, то никаких проблем. Можно запросить права у ОС, паролей знать не нужно.
Код:
// Устанавливаем привелегии процессу. Перевод с C
// аргументы - токен процесса (если 0, то своему процессу), имя привелегии, флаг вкл/выкл, флаг вышло/невышло

// Какие бывают привелегии:

////////////////////////////////////////////////////////////////////////
//               NT Defined Privileges                                //
////////////////////////////////////////////////////////////////////////
//"SeCreateTokenPrivilege"
//"SeAssignPrimaryTokenPrivilege"
//"SeLockMemoryPrivilege"
//"SeIncreaseQuotaPrivilege"
//"SeUnsolicitedInputPrivilege"
//"SeMachineAccountPrivilege"
//"SeTcbPrivilege"
//"SeSecurityPrivilege"
//"SeTakeOwnershipPrivilege"
//"SeLoadDriverPrivilege"
//"SeSystemProfilePrivilege"
//"SeSystemtimePrivilege"
//"SeProfileSingleProcessPrivilege"
//"SeIncreaseBasePriorityPrivilege"
//"SeCreatePagefilePrivilege"
//"SeCreatePermanentPrivilege"
//"SeBackupPrivilege"
//"SeRestorePrivilege"
//"SeShutdownPrivilege"
//"SeDebugPrivilege"
//"SeAuditPrivilege"
//"SeSystemEnvironmentPrivilege"
//"SeChangeNotifyPrivilege"
//"SeRemoteShutdownPrivilege"

function SetPrivilege(hToken: dword; lpPrivName : PChar; bEnable : Boolean) : Boolean;
var
   NameValue: Int64;
   tkp: TOKEN_PRIVILEGES;
   ReturnLength: Cardinal;
begin
   Result := False;
   if hToken = 0 then
              OpenProcessToken(INVALID_HANDLE_VALUE, TOKEN_ADJUST_PRIVILEGES
                                                      or TOKEN_QUERY, hToken);
   if not LookupPrivilegeValue(nil, lpPrivName, NameValue) then
    begin
     CloseHandle(hToken);
     exit;
    end;
   tkp.PrivilegeCount := 1;
   tkp.Privileges[0].Luid := NameValue;
   if bEnable then
          tkp.Privileges[0].Attributes := (SE_PRIVILEGE_ENABLED)
   else begin
          tkp.Privileges[0].Attributes := (SE_PRIVILEGE_ENABLED and
                                           tkp.Privileges[0].Attributes);
   end;
   AdjustTokenPrivileges(hToken, FALSE, tkp, sizeof(TOKEN_PRIVILEGES),
                         tkp, ReturnLength);
   if (GetLastError <> ERROR_SUCCESS) then exit;

   Result := TRUE;
   CloseHandle(hToken);
end;

// Проверка наличия привелегий у процесса.
function LookPrivilege(hToken: dword; lpPrivName : PChar; Typ : Byte) : Boolean;
var
   NameValue : Int64;
   tkp : PRIVILEGE_SET;
   pfResult : LongBool;
begin
 if hToken = 0 then
            OpenProcessToken(INVALID_HANDLE_VALUE, TOKEN_ADJUST_PRIVILEGES
                                                    or TOKEN_QUERY, hToken);
 LookupPrivilegeValue(nil, lpPrivName, NameValue);
 tkp.PrivilegeCount := 1;
 // tkp.Control:=PRIVILEGE_SET_ALL_NECESSARY;
 tkp.Privilege[0].Luid := NameValue;
 if Typ = 1 then
   tkp.Privilege[0].Attributes := SE_PRIVILEGE_ENABLED;
 if Typ = 2 then
   tkp.Privilege[0].Attributes := SE_PRIVILEGE_USED_FOR_ACCESS;
 PrivilegeCheck(hToken, tkp, pfResult);
 Result := pfResult
end;
Цитата:
- как это сделать, если известны логин и пароль администратора
Всё-таки посмотрите, как запустить другую программу Здесь

Последний раз редактировалось BaronTreep; 23.08.2009 в 12:02.
BaronTreep вне форума Ответить с цитированием
Старый 23.08.2009, 12:08   #5
ikot
Пользователь
 
Регистрация: 29.09.2008
Сообщений: 56
По умолчанию

Цитата:
Если свою, то никаких проблем. Можно запросить права у ОС, паролей знать не нужно.
Такой еще вопрос, может быть и глупый.
Как вызвать вашу функцию(т.е. с какими параметрами) и где?

Последний раз редактировалось ikot; 23.08.2009 в 12:11.
ikot вне форума Ответить с цитированием
Старый 23.08.2009, 12:17   #6
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Где угодно - на событии кнопки, в Form1.Create, или после begin в no-VCL программе:

Код:
SetPrivilege(0, "SeDebugPrivilege", True); // Теперь имеем привелегии отладчика
BaronTreep вне форума Ответить с цитированием
Старый 23.08.2009, 12:21   #7
ikot
Пользователь
 
Регистрация: 29.09.2008
Сообщений: 56
По умолчанию

BaronTreep большое спасибо!!!
ikot вне форума Ответить с цитированием
Старый 24.08.2009, 17:07   #8
olchick
Пользователь
 
Регистрация: 02.06.2009
Сообщений: 13
По умолчанию

Попробовала ваш код, но он почему-то не срабатывает.
Запускала программу на учетной записи "Гость" - права не поменялись.
olchick вне форума Ответить с цитированием
Старый 27.08.2009, 09:12   #9
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Цитата:
Сообщение от olchick
Попробовала ваш код, но он почему-то не срабатывает.
Запускала программу на учетной записи "Гость" - права не поменялись.
Ну там в начале кода - привелегии, которые можно ставить. Причём в виндоус для разных действий нужны разные привелегии - открыть защищённый файл - одни, а программу под отладкой запустить - вообще другие, так что нужно смотреть конкретно по задаче, а просто функция общая.
BaronTreep вне форума Ответить с цитированием
Старый 27.08.2009, 09:23   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Запускала программу на учетной записи "Гость" - права не поменялись.
Если проль известен то поможет CreateProcessWithLogon
http://delphiworld.narod.ru/base/run_for_any_user.html
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Повышение рейтинга пользователя? spamer О форуме и сайтах клуба 5 13.03.2009 20:35
Получение прав другого пользователя Квэнди Win Api 14 28.07.2008 14:49
В чем я не прав?С++ diden Помощь студентам 3 23.05.2008 18:32
Назначение прав пользователя Seqular Безопасность, Шифрование 1 04.08.2007 16:48