Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

выключить компьютор Win2000 [Win2k]


DS ©   (2004-10-20 00:03:00) 

Пытаюсь выключить компьютор,администратор(в свойствах пользователя)
в Win2000
var ph:THandle;            
  tp,prevst:TTokenPrivileges;
  rl:DWORD;
begin
OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,ph);
LookupPrivilegeValue(Nil,'SeShutdownPrivilege',tp.Privileges[0].Luid);
tp.PrivilegeCount:=1;
tp.Privileges[0].Attributes:=2;
AdjustTokenPrivileges(ph,FALSE,tp,SizeOf(prevst),prevst,rl);
ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF or EWX_FORCE,0);
не выключается
LookupPrivilegeValue и AdjustTokenPrivileges возращают True!

для проверки пробывал EWX_LOGOFF - выполняется,а выключение нет


vertal   (2004-10-20 20:15:00) [1]

В моей 2000 винде и c компилятором из Delphi7 работает следующее:

Const
SE_SHUTDOWN_NAME='SeShutdownPrivilege';

{$B-}
Function ShutdownOrReboot(dwFlags:Cardinal):Boolean;
Var
 TokenHandle:THandle;
 NewState:TOKEN_PRIVILEGES;
 ReturnLength:DWORD;
Begin
if LongInt(GetVersion())>0 then
Begin
  NewState.PrivilegeCount:=1;
  NewState.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
  Result:=OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,TokenHandle)
    and LookupPrivilegeValue(Nil,SE_SHUTDOWN_NAME,NewState.Privileges[0].Luid)
    and AdjustTokenPrivileges(TokenHandle,False,NewState,0,Nil,ReturnLength)
    and ExitWindowsEx(dwFlags,0);
End
else
  Result:=ExitWindowsEx(dwFlags,0);
End;
Вызов:
ShutdownOrReboot(EWX_SHUTDOWN or EWX_FORCE or EWX_POWEROFF);


DS   (2004-10-20 17:13:00) [2]

Pop   (20.10.04 11:00) [2]
>Не компьютОр, а компьютер

э,ночь,буду иметь в виду!

Не работает!код! WIN2000 невыключается.
Накачал исходники ни один неработает
правда может в том,что это не компилится- не соотвествиие типов
if AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength)

этот nil пришлось заменить пустой R
...0,R,ReturnLength)
где R: TTokenPrivileges;
nil,0 не компилится delphi4

эксперементы с SizeOf(prevst) или 0 в поле size ни к чему не привели,что я делаю не так


Pop   (2004-10-20 11:00:00) [3]

Не компьютОр, а компьютер. Русский язык не менее важен любого языка программирования!


lipskiy   (2004-10-20 00:10:00) [4]

Этот код рабочий:

procedure TFormShutDown.Off;

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; // one privelege to set
 tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
 if AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength) then
   ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN or EWX_POWEROFF, 0);
end;

end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо