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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2012, 19:11   #1
ichi
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 147
По умолчанию ExitWindowsEx + WindowsXP + Запуск от имени...

Написал простое приложение. На форму добавил одну кнопку. В обработчике кнопки добавил следующую функцию:

ExitWindowsEx(EWX_POWEROFF or EWX_FORCE, 0);

Собираю проект в среде Delphi, приложение успешно запускается. И правильно выполняет возложенную на себя функцию, т.е. завершает сеанс Windows XP.

Потом пытаюсь запустить приложение от имени другого пользователя, как от пользователя с правами администратора, так и без них. Приложение запускается, при нажатие на кнопку должен завершится сеанс WindowsXP, но это не происходит.

Подскажите, пожалуйста, из-за чего так?
ichi вне форума Ответить с цитированием
Старый 24.09.2012, 08:58   #2
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Попробуйте вот это код:
Код:
var
hToken: THandle;
tkp: TTokenPrivileges;
ReturnLength: Cardinal;
begin
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or
  TOKEN_QUERY, hToken) then
    begin
      LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
      tkp.PrivilegeCount := 1;
      tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      if AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength) then
        ExitWindowsEX(EWX_POWEROFF or EWX_FORCE, 0);
    end;
end
FaTaL вне форума Ответить с цитированием
Старый 24.09.2012, 12:31   #3
ichi
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 147
По умолчанию

Цитата:
Сообщение от FaTaL Посмотреть сообщение
Попробуйте вот это код:
Код:
var
hToken: THandle;
tkp: TTokenPrivileges;
ReturnLength: Cardinal;
begin
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or
  TOKEN_QUERY, hToken) then
    begin
      LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
      tkp.PrivilegeCount := 1;
      tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      if AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength) then
        ExitWindowsEX(EWX_POWEROFF or EWX_FORCE, 0);
    end;
end
В своем первом сообщение я ошибся с параметром функции, там я указал параметр EWX_POWEROFF, а меня интересует EWX_LOGOFF. Вот как раз он и не работает при запуске от имени другого пользователя, а на счет EWX_POWEROFF, то вы правы Windows XP нужно использовать указанный вами код:

Цитата:
Код:
var
hToken: THandle;
tkp: TTokenPrivileges;
ReturnLength: Cardinal;
begin
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or
  TOKEN_QUERY, hToken) then
    begin
      LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
      tkp.PrivilegeCount := 1;
      tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      if AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength) then
        ExitWindowsEX(EWX_POWEROFF or EWX_FORCE, 0);
    end;
end
Да, вопрос остается в силе. Как можно заставить работать функцию ExitWindowsEX(EWX_LOGOFF or EWX_FORCE, 0); при запуске приложения от имени другого пользователя? В данном случае код указанный пользователем по имени FaTaL не работает, но в случае с ExitWindowsEX(EWX_POWEROFF or EWX_FORCE, 0); все работает как часы.
ichi вне форума Ответить с цитированием
Старый 24.09.2012, 13:46   #4
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Может для этого какие то другие привилегии нужно? Глянь тут http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
Хотя вот это код работает под любым юзером (не проверял только под гостем):
Код:
var
hToken: THandle;
tkp: TTokenPrivileges;
ReturnLength: Cardinal;
begin
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or
  TOKEN_QUERY, hToken) then
    begin
      LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
      tkp.PrivilegeCount := 1;
      tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      if AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength) then
        ExitWindowsEX(EWX_LOGOFF,0);
    end;
end;

Последний раз редактировалось FaTaL; 24.09.2012 в 13:49.
FaTaL вне форума Ответить с цитированием
Старый 25.09.2012, 06:56   #5
ichi
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 147
По умолчанию

Цитата:
Сообщение от FaTaL Посмотреть сообщение
Может для этого какие то другие привилегии нужно? Глянь тут http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
Хотя вот это код работает под любым юзером (не проверял только под гостем):
Код:
var
hToken: THandle;
tkp: TTokenPrivileges;
ReturnLength: Cardinal;
begin
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or
  TOKEN_QUERY, hToken) then
    begin
      LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
      tkp.PrivilegeCount := 1;
      tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      if AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength) then
        ExitWindowsEX(EWX_LOGOFF,0);
    end;
end;
Вы не совсем поняли что я хочу получить. Да, данный код работает под любой учетной записью, под которой зашел пользователь на рабочий стол WindowsXP. Но, данный код не работает когда, например, мы зашли под учетной записью user (обычный пользователь), но приложение запустили от имени administrator (администратор системы). Вот этот случай я и рассматриваю, пытаюсь понять почему не работает. С параметром EWX_POWEROFF все работает от имени другого пользователя, а EWX_LOGOFF нет.

У кого есть какие-нибудь идеи по этому поводу?

To FaTaL: Спасибо за ссылку.
ichi вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запуск процессов от имени администратора D][mon C# (си шарп) 0 14.01.2012 23:12
Запуск от имени админитратора tarakan1983 Общие вопросы Delphi 1 15.12.2011 12:36
Запуск от имени администратора DEV C++ Илларион Общие вопросы C/C++ 2 29.08.2011 06:55
Запуск функции от имени администратора s@ngre Win Api 4 12.04.2011 16:55
Запуск приложения от имени Администратора NoName_emaNoN Общие вопросы Delphi 16 15.07.2010 01:09