Форум: "Система";
Текущий архив: 2004.02.02;
Скачать: [xml.tar.bz2];
ВнизСделать Выкл. виндам Найти похожие ветки
← →
Cash (2003-11-12 21:43) [0]Я точно не знаю, к какой теме это относится, но мне надо:
Сделать Выключение Виндов 9х, NT, XP.
Взял все три потаму, что, на мой взгляд, под 9x и NT,XP команды должны быть разными. Пишите, разъясняйте.
← →
WithOut Any ... (2003-11-12 22:02) [1]Считаю, что для Win9x и WinMe проблем не должно возникать (rundll). А с WinNt (Win2k и WinXP) просто можно найти в FAQ (просто не интересовался)
← →
Narayan (2003-11-12 22:47) [2]типа того...
procedure TForm1.Button1Click(Sender: TObject);
var hToken: THandle;
tkpNew: TTokenPrivileges;
RetLen: DWORD;
begin
If LookupPrivilegeValue(nil,"SeShutdownPrivilege",tkpNew.Privileges[0].Luid) Then
begin
tkpNew.PrivilegeCount := 1;
tkpNew.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
If OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES, hToken) Then
If AdjustTokenPrivileges(hToken, FALSE, tkpNew, 0, nil, RetLen) Then
ExitWindowsEx(EWX_FORCE,0);
end;
end;
← →
Вадим (2003-11-13 00:02) [3]
unit WinST;
interface
uses
Windows, SysUtils;
type
TWinType = (wtWindows95, wtWindowsNT, wtWin32s, wtUnknown);
TWinExitType = (weNone, weLogoff, weReboot, weShutDown, wePowerOff);
function WinSTExecute(WinExitType: TWinExitType): Boolean;
function GetWinType: TWinType;
implementation
const
WinExitFlagsArr: array[TWinExitType] of Word =
(666, EWX_LOGOFF, EWX_REBOOT, EWX_SHUTDOWN, EWX_POWEROFF);
function SetPrivilege(sPrivilegeName: string;
bEnabled: Boolean): Boolean;
var
TPPrev,
TP: TTokenPrivileges;
Token: THandle;
dwRetLen: DWord;
begin
Result := False;
if not OpenProcessToken(GetCurrentProcess,
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token) then
begin
//FLastError := "Error: OpenProcessToken";
Exit;
end;
TP.PrivilegeCount := 1;
if LookupPrivilegeValue(nil, PChar(sPrivilegeName), TP.Privileges[0].LUID) then
begin
if bEnabled then
TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
TP.Privileges[0].Attributes := 0;
dwRetLen := 0;
if AdjustTokenPrivileges(Token, False, TP, SizeOf(TPPrev),
TPPrev, dwRetLen) then
Result := True
else
//FLastError := "Error: AdjustTokenPrivileges";
end;
CloseHandle(Token);
end;
function WinSTExecute(WinExitType: TWinExitType): Boolean;
var
Flags: Word;
begin
Result := False;
Flags := WinExitFlagsArr[WinExitType];
if Flags = 0 then Exit;
// if Unconditional then Flags := Flags or EWX_FORCE;
if GetWinType <> wtWindowsNT then
ExitWindowsEx(Flags, 0)
else
if SetPrivilege("SeShutdownPrivilege", True) then
begin
Result := ExitWindowsEx(Flags, 0);
SetPrivilege("SeShutdownPrivilege", False);
end;
// if not Result then
// FLastError := "Error: " + IntToStr(GetLastError);
end;
function GetWinType: TWinType;
var
VersionInfo: TOSVersionInfo;
begin
Result := wtUnknown;
VersionInfo.dwOSVersionInfoSize := SizeOf(VersionInfo);
GetVersionEx(VersionInfo);
case VersionInfo.dwPlatformId of
VER_PLATFORM_WIN32S: Result := wtWin32s;
VER_PLATFORM_WIN32_WINDOWS: Result := wtWindows95;
VER_PLATFORM_WIN32_NT: Result := wtWindowsNT;
end;
end;
end.
← →
Cash (2003-11-13 14:06) [4]Товарищи. Товарищи. Как на счет разъяснений. Могу даже шаблон привести:
1. - О.С. {желательно; ели О.С. любая, то так и пшите}
2. - Типа, сам код. И все, что к нему приклеивается.
3. - Если не лень, то коментарии. :)
Да, и в общем, назрел тут вопросик, Как определить, в каких виндах обитает моя прога?(быть может несущественный, но тем не менее.)
← →
clickmaker (2003-11-13 14:08) [5]
> Cash © (13.11.03 14:06) [4]
> Да, и в общем, назрел тут вопросик, Как определить, в каких
> виндах обитает моя прога?(быть может несущественный, но
> тем не менее.)
Тебе ж Вадим © (13.11.03 00:02) [3] все написал. Читай внематочней
← →
Cash (2003-11-13 14:34) [6]Сколько раз мне мама говорила, читать сообщения, а после писать ответы.
clickmaker: Да я на секунду выскочил в сеть. Пять минут назад все прочитал, далее сам додумывай. (время создания записи)
Объявляю благодарность Вадиму
← →
Моджахедос (2003-11-14 23:00) [7]Ну, держи, может и мне благодарность объявишь :)
program SD;
uses
Windows;
{$R *.RES}
procedure ShutDown95;
begin
if NOT ExitWindowsEx (EWX_POWEROFF or EWX_FORCE,0) then
ExitWindowsEx (EWX_SHUTDOWN or EWX_FORCE,0)
end;
procedure ShutDownNT;
var
Dummy, Priv: TTokenPrivileges; TH: Cardinal;
LUID: TLargeInteger; RL: Cardinal;
begin
OpenProcessToken(GetCurrentProcess, TOKEN_ALL_ACCESS or TOKEN_QUERY, TH);
LookUpPrivilegeValue(nil, "SESHUTDOWNPRIVILEGE", LUID);
Priv.PrivilegeCount:= 1;
Priv.Privileges[0].Luid:= LUID;
Priv.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(TH,false,Priv,SizeOf(Priv),Dummy,RL);
if GetLastError <> ERROR_SUCCESS then
MessageBox (0,"Can not get SHUT DOWN privileges",
"Выключай кнопкой",MB_OK)
else
begin
if NOT ExitWindowsEx (EWX_POWEROFF or EWX_FORCE,0) then
ExitWindowsEx (EWX_SHUTDOWN,0)
end;
end;
{----------Main block------------}
var
OSRecord: OSVERSIONINFO;
begin
OSRecord.dwOSVersionInfoSize := SizeOf (OSVERSIONINFO);
GetVersionEx(OSRecord);
Case OSRecord.dwPlatformId of
VER_PLATFORM_WIN32_WINDOWS,
VER_PLATFORM_WIN32s: ShutDown95;
VER_PLATFORM_WIN32_NT: ShutDownNT;
end;
end.
← →
Моджахедос (2003-11-14 23:02) [8]Как раз еще увидишь, как платформу определять.
← →
Cash (2003-11-14 23:04) [9]Моджахедос: Твоя взяла.
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2004.02.02;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c