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

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

shut down,restart windows for ws XP,NT [D7]


Anis ©   (2004-11-18 22:29:00) 

Помогите не могу перегрузить и вырубить комп в XP,она просто открывает окно для смены пользователя.
exitwindowsex(ewx_force,0)и т.д. не работает.Спасибо


vertal   (2004-12-30 20:39:00) [1]

По моему этот код будет попроще и покороче чем в [5]

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;


_Nikolay   (2004-12-30 14:31:00) [2]

как настроить включение системного блока?


pavel_guzhanov   (2004-11-24 09:04:00) [3]

если использовать wmi, то компьютер с winXP и 2000 вырубается влегкую, как свой собственный, так и удаленный. В этом форуме неоднократно давалась ссылка на статью про wmi, в статье есть описание и пример такой программки:
http://delphi.olympus.ru/dk/mastering/wmi.htm


XProger   (2004-11-24 02:58:00) [4]

ShellExecute(0, 'open', 'shutdown -s', nil, nil, SW_NORMAL);
;)


_Дельфин_   (2004-11-22 21:12:00) [5]

Просто так в WinХР ты комп не выключишь. Я в свое время сам с этим мучился - а потом нашел в нете вот что:

function GetWinVersion: string;
var
 VersionInfo: TOSVersionInfo;
 OSName: string;
begin
 // устанавливаем размер записи
 VersionInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );
 if Windows.GetVersionEx( VersionInfo ) then
 begin
   with VersionInfo do
   begin
     case dwPlatformId of
       VER_PLATFORM_WIN32s: OSName := 'Win32s';
       VER_PLATFORM_WIN32_WINDOWS: OSName := 'Windows 95';
       VER_PLATFORM_WIN32_NT: OSName := 'Windows NT';
     end; // case dwPlatformId
     Result := OSName + ' Version ' + IntToStr( dwMajorVersion ) + '.' + IntToStr( dwMinorVersion ) +
     #13#10' (Build ' + IntToStr( dwBuildNumber ) + ': ' + szCSDVersion + ')';
   end; // with VersionInfo
 end // if GetVersionEx
 else
 Result := '';
end;

procedure ShutDown;
const
 SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; // Borland forgot this declaration
var
 hToken: THandle;
 tkp: TTokenPrivileges;
 tkpo: TTokenPrivileges;
 zero: DWORD;
begin
 if Pos('Windows NT', GetWinVersion) = 1 then // we've got to do a whole buch of things
 begin
   zero := 0;
   if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
   begin
     MessageBox(0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK);
     Exit;
   end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)

   if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
   begin
     MessageBox(0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK);
     Exit;
   end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)

   // SE_SHUTDOWN_NAME
   if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid ) then
   begin
     MessageBox(0, 'Exit Error', 'LookupPrivilegeValue() Failed', MB_OK);
     Exit;
   end; // if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid )

   tkp.PrivilegeCount := 1;
   tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

   AdjustTokenPrivileges(hToken, False, tkp, SizeOf( TTokenPrivileges ), tkpo, zero);
   if Boolean(GetLastError()) then
   begin
     MessageBox(0, 'Exit Error', 'AdjustTokenPrivileges() Failed', MB_OK);
     Exit;
   end // if Boolean( GetLastError() )
   else
     ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );

 end // if OSVersion = 'Windows NT'
 else
 begin // just shut the machine down
   ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
 end; // else
end;


Vaitek   (2004-11-22 20:50:00) [6]

А в хелпе еще написано что:

Windows NT: To shut down or restart the system, the calling process must use the AdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege. For more information about security privileges, see Privileges.

Так ли это важно? Или если я в своей системе администратор, то всо в прядке?


Vaitek   (2004-11-22 20:50:00) [7]

А в хелпе еще написано что:

Windows NT: To shut down or restart the system, the calling process must use the AdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege. For more information about security privileges, see Privileges.

Так ли это важно? Или если я в своей системе администратор, то всо в прядке?


Просто Джо   (2004-11-19 00:15:00) [8]

Да уж, к флагу EWX_FORCE нужно приорить флаг, который бы указывал на действие, напр:

 EWX_FORCE or EWX_REBOOT


Anatoly Podgoretsky   (2004-11-18 22:36:00) [9]

EWX_FORCE - принудительное выполнение операций, без сохранения  данных.
А операций у тебя нет.


Наверх

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