Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 221
  • Last Modified:

A componnent to shutdown Windows NT

Hello,
Does anyone knows about a componnent for Delphi 4 to shutdown Windows NT?
Thanks a lot in advance,  Libby
0
libbysharf
Asked:
libbysharf
  • 3
  • 2
1 Solution
 
intheCommented:
here is a unit you can use with win9* and nt ,it will check and set the right privileges etc if os is nt
just stick unit in lib or your project dir so delphi cna find it and add unit name to uses and call

ExitWindowsF(flags)
//same flags as exitwindowsex see win32.hlp for details



unit ExitWin;

interface

uses
Windows;

function PlatformNT : boolean;
{ Betriebssystemplattform ermitteln
Funktionsergebnis false: Windows 95
true : Windows NT }

function ExitWindowsF(uFlags : word) : boolean;
{ Windows (95/NT) herunterfahren
uFlags: siehe Windows-SDK ExitWindowsEx }

implementation

const
{ in Delphi nicht deklariertes }
ANYSIZE_ARRAY = 1;
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';

var
IsNT : boolean;

function PlatformNT : boolean;
begin
PlatformNT:=IsNT;
end;

function ExitWindowsNT(uFlags : word) : boolean;
// Routine für Windows NT
var
hToken : THandle;
ptkp, ptkpold : PTokenPrivileges;
r : dword;
begin
// Token Handle des aktuellen Prozesses ermitteln
if OpenProcessToken(GetCurrentProcess,
{$IFDEF DELPHI2}
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, @hToken) then
{$ELSE}
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
{$ENDIF}
begin
// LUID für shut down ermitteln und Privileg setzen
GetMem(ptkp,sizeof(TTOKENPRIVILEGES) +
(1-ANYSIZE_ARRAY) * sizeof(TLUIDANDATTRIBUTES));
LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME,
ptkp^.Privileges[0].Luid);
ptkp^.PrivilegeCount:=1; // Anzahl zu setzender Privilegien ptkp^.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
// Privileg für diesen Prozess setzen
r:=0;
ptkpold:=nil;
if AdjustTokenPrivileges(hToken, false, ptkp^, 0, ptkpold^, r) then ExitWindowsNT:=ExitWindowsEx(uFlags,0);
end;
ExitWindowsNT:=GetLastError=ERROR_SUCCESS;
end;

function ExitWindowsF(uFlags : word) : boolean;
// Windows (95/NT) beenden
begin
if IsNT then ExitWindowsF:=ExitWindowsNT(uFlags)
else ExitWindowsF:=ExitWindowsEx(uFlags,0);
end;

procedure CheckOS;
// Betriebssystemplattform ermitteln
var
VerInfo : TOSVersionInfo;
begin
IsNT:=false;
VerInfo.dwOSVersionInfoSize:=sizeof(VerInfo);
if (GetVersionEx(VerInfo)) then
IsNT:=VerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT;
end;

begin
CheckOS;
end.
0
 
libbysharfAuthor Commented:
Thanks inthe, I'm sure it works, but it doesn't work on my computer.... People sent me some programs which are supposed to work on NT but it doesn't work when I try it .

Maybe it has something to do with the version? I have a
NT 4 Service Package 6 (workstation).
Regards, Libby
0
 
intheCommented:
hi,]
It doesnt matter what version of nt your using it will / should still work (also on win2k etc)

i just tested and noticed that if you paste the above unit into a new unit then the following line:
ptkp^.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
is commented out when it shouldnt be it is important line so i would double check that its not commented out.

or better just paste this version below into new unit and delete any dcu you already have of Exitwin so a new version is compiled then try :


unit ExitWin;

interface

uses
Windows;

function PlatformNT : boolean;

function ExitWindowsF(uFlags : word) : boolean;

implementation

const
ANYSIZE_ARRAY = 1;
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';

var
IsNT : boolean;

function PlatformNT : boolean;
begin
PlatformNT:=IsNT;
end;

function ExitWindowsNT(uFlags : word) : boolean;
var
hToken : THandle;
ptkp, ptkpold : PTokenPrivileges;
r : dword;
begin
if OpenProcessToken(GetCurrentProcess,
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
GetMem(ptkp,sizeof(TTOKENPRIVILEGES) +
(1-ANYSIZE_ARRAY) * sizeof(TLUIDANDATTRIBUTES));
LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME,
ptkp^.Privileges[0].Luid);
ptkp^.PrivilegeCount:=1;
ptkp^.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
r:=0;
ptkpold:=nil;
if AdjustTokenPrivileges(hToken, false, ptkp^, 0, ptkpold^, r) then
ExitWindowsNT:=ExitWindowsEx(uFlags,0);

end;
ExitWindowsNT:=GetLastError=ERROR_SUCCESS;
end;

function ExitWindowsF(uFlags : word) : boolean;
begin
if IsNT then ExitWindowsF:=ExitWindowsNT(uFlags)
else ExitWindowsF:=ExitWindowsEx(uFlags,0);
end;

procedure CheckOS;
var
VerInfo : TOSVersionInfo;
begin
IsNT:=false;
VerInfo.dwOSVersionInfoSize:=sizeof(VerInfo);
if (GetVersionEx(VerInfo)) then
IsNT:=VerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT;
end;

begin
CheckOS;
end.



useage :

uses Exitwin;

procedure TForm1.Button1Click(Sender: TObject);
begin
ExitWindowsF(EWX_POWEROFF or EWX_SHUTDOWN or EWX_FORCE);
end;
0
 
intheCommented:
note,
build the project save and close it and delphi then try running the exe .

(was just thinking that delphi may stop it from running if you run from inside the ide)
0
 
libbysharfAuthor Commented:
In the end I just used a program someone wrote me in C++, and called it within my application. Thanks anyway for the effort..
0

Featured Post

Vote for the Most Valuable Expert

It’s time to recognize experts that go above and beyond with helpful solutions and engagement on site. Choose from the top experts in the Hall of Fame or on the right rail of your favorite topic page. Look for the blue “Nominate” button on their profile to vote.

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now