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

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

Как выключить компьютер под xp


Alexey SVD ©   (2007-06-19 16:05:00) 

Всем привет! Как выключить компьютер под xp? Финкция ExitWindowsEx вырубает только не NT системы. Есть какие нибудь варианты?


Инс   (2007-06-21 15:57:00) [1]

А врубать привилегию, можно примерно так:
unit ExSecurity;

interface

uses Windows, SysUtils;

type
 EPrivilegeException = class(Exception);

const
 // Privileges names
 SE_ASSIGNPRIMARYTOKEN_NAME = 'SeAssignPrimaryTokenPrivilege';
 SE_AUDIT_NAME = 'SeAuditPrivilege';
 SE_BACKUP_NAME = 'SeBackupPrivilege';
 SE_CHANGE_NOTIFY_NAME = 'SeChangeNotifyPrivilege';
 SE_CREATE_GLOBAL_NAME = 'SeCreateGlobalPrivilege';
 SE_CREATE_PAGEFILE_NAME = 'SeCreatePagefilePrivilege';
 SE_CREATE_PERMANENT_NAME = 'SeCreatePermanentPrivilege';
 SE_CREATE_TOKEN_NAME = 'SeCreateTokenPrivilege';
 SE_DEBUG_NAME = 'SeDebugPrivilege';
 SE_ENABLE_DELEGATION_NAME = 'SeEnableDelegationPrivilege';
 SE_IMPERSONATE_NAME = 'SeImpersonatePrivilege';
 SE_INC_BASE_PRIORITY_NAME = 'SeIncreaseBasePriorityPrivilege';
 SE_INCREASE_QUOTA_NAME = 'SeIncreaseQuotaPrivilege';
 SE_LOAD_DRIVER_NAME = 'SeLoadDriverPrivilege';
 SE_LOCK_MEMORY_NAME = 'SeLockMemoryPrivilege';
 SE_MACHINE_ACCOUNT_NAME = 'SeMachineAccountPrivilege';
 SE_MANAGE_VOLUME_NAME = 'SeManageVolumePrivilege';
 SE_PROF_SINGLE_PROCESS_NAME = 'SeProfileSingleProcessPrivilege';
 SE_REMOTE_SHUTDOWN_NAME = 'SeRemoteShutdownPrivilege';
 SE_RESTORE_NAME = 'SeRestorePrivilege';
 SE_SECURITY_NAME = 'SeSecurityPrivilege';
 SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
 SE_SYNC_AGENT_NAME = 'SeSyncAgentPrivilege';
 SE_SYSTEM_ENVIRONMENT_NAME = 'SeSystemEnvironment';
 SE_SYSTEM_PROFILE_NAME = 'SeSystemProfilePrivilege';
 SE_SYSTEMTIME_NAME = 'SeSystemtimePrivilege';
 SE_TAKE_OWNERSHIP_NAME = 'SeTakeOwnershipPrivilege';
 SE_TCB_NAME = 'SeTcbPrivilege';
 SE_UNDOCK_NAME = 'SeUndockPrivilege';
 SE_UNSOLICITED_INPUT_NAME = 'SeUnsolicitedInputPrivilege';

// Privileges functions
function EnablePrivilegeEx(Process: THandle; Name: String; Enable: Boolean): Boolean;
function EnablePrivilege(Name: String; Enable: Boolean): Boolean;
function IsPrivilegeEx(Process, Thread: THandle; Name: String): Boolean;
function IsPrivilege(Name: String): Boolean;

implementation

procedure PrivilegeException;
begin
 raise EPrivilegeException.Create(SysErrorMessage(GetLastError));
end;

function EnablePrivilegeEx(Process: THandle; Name: String; Enable: Boolean): Boolean;
var
 LUID: TLargeInteger;
 Token: THandle;
 Privileges: TOKEN_PRIVILEGES;
 ReturnLength: Cardinal;
begin
 Result:=false;
 if LookupPrivilegeValue(nil,PChar(Name),LUID) then begin
   if OpenProcessToken(Process,TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES,Token) then begin
     Privileges.PrivilegeCount:=1;
     Privileges.Privileges[0].Luid:=LUID;
     if Enable then
       Privileges.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED
     else
       Privileges.Privileges[0].Attributes:=0;
     AdjustTokenPrivileges(Token,false,Privileges,SizeOf(TOKEN_PRIVILEGES),Privileges ,ReturnLength);
     if GetLastError = ERROR_SUCCESS then Result:=true;
     CloseHandle(Token);
   end
   else begin
     PrivilegeException;
   end;
 end
 else begin
   PrivilegeException;
 end;
end;

function EnablePrivilege(Name: String; Enable: Boolean): Boolean;
begin
 Result:=EnablePrivilegeEx(GetCurrentProcess,Name,Enable);
end;

function IsPrivilegeEx(Process, Thread: THandle; Name: String): Boolean;
var
 LUID: TLargeInteger;
 Token: THandle;
 TokenInformation: Pointer;
 Size, i: Cardinal;
begin
 Result:=false;
 if LookupPrivilegeValue(nil,PChar(Name),LUID) then begin
   Token:=0;
   try
     if not OpenThreadToken(Thread,TOKEN_QUERY,false,Token) then
       if GetLastError = ERROR_NO_TOKEN then
         if not OpenProcessToken(Process,TOKEN_QUERY,Token) then
           PrivilegeException;
     if not GetTokenInformation(Token,TokenPrivileges,nil,0,Size) then
       if GetLastError <> ERROR_INSUFFICIENT_BUFFER then
         PrivilegeException;
     GetMem(TokenInformation,Size);
     try
       if not GetTokenInformation(Token,TokenPrivileges,TokenInformation,Size,Size) then
         PrivilegeException;
       with PTokenPrivileges(TokenInformation)^ do begin
         for i:=0 to PrivilegeCount - 1 do begin
           if Privileges[i].Luid = LUID then begin
             Result:=true;
             Break;
           end;
         end;
       end;
     finally
       FreeMem(TokenInformation,Size);
     end;
   finally
     if Token<>0 then CloseHandle(Token);
   end;
 end
 else begin
   PrivilegeException;
 end;
end;

function IsPrivilege(Name: String): Boolean;
begin
 Result:=IsPrivilegeEx(GetCurrentProcess,GetCurrentThread,Name);
end;

end.


А использовать так:

uses ExSecurity;

...

EnablePrivilege(SE_SHUTDOWN_SYSTEM,true);


Anatoly Podgoretsky   (2007-06-19 19:25:00) [2]

> Alexey SVD  (19.06.2007 16:05:00)  [0]

Вырубает все, думаю и Висту вырубает, но как минимум до Windows 2003 работает, но нужны права.


tesseract   (2007-06-19 17:37:00) [3]

Вырубает, вырубает. Посмотри - может у тебя привилегий не хватает.


SLoW.AlfaMoon.Com   (2007-06-19 17:06:00) [4]

NtShutdownSystem + соответствующая привилегия SE_SHUTDOWN_SYSTEM, емнип


Наверх

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