一个团队最需要什么:怎样用Delphi7.0编关机程序?

来源:百度文库 编辑:高校问答 时间:2024/04/19 22:04:01

98系统下用exitwindowsex挺好,在2000,XP,NT等已经加强内核安全性的操作系统下关机是
不太适合的。对后者,关键是要有管理员权限,如果无权限则不可避免用AdjustTokenPriv
ileges函数然后调用InitiateSystemShutdown关机比较妥当,下面是我调试通过的2000/x
p/Nt自动关机代码,你自己试试。若要扩展到98自己在加判断是98操作系统执行exitwind
owsex的代码。
implementation

{$R *.dfm}
{判断是哪类操作系统,以确定关机方式}
function GetOperatingSystem: Boolean;
var osVerInfo: TOSVersionInfo;
begin
Result :=False;
osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
if GetVersionEx(osVerInfo) then
case osVerInfo.dwPlatformId of
VER_PLATFORM_WIN32_NT:
begin
Result := True;
end;
VER_PLATFORM_WIN32_WINDOWS:
begin
Result := False;
end;
end;
end;

{获得计算机名}
function GetComputerName: string;
var
buffer: array[0..MAX_COMPUTERNAME_LENGTH + 1] of Char;
Size: Cardinal;
begin
Size := MAX_COMPUTERNAME_LENGTH + 1;
Windows.GetComputerName(@buffer, Size);
Result := strpas(buffer);
end;

{定时关机函数 ,各参数的意义如下:
Computer: 计算机名;Msg:显示的提示信息;
Time:时间延迟; Force:是否强制关机;
Reboot: 是否重启动}
function W2KShutDown(Computer: string; Msg: string;
Time: Word; Force: Boolean; Reboot: Boolean): Boolean;
var
rl: Cardinal;
hToken: Cardinal;
tkp: TOKEN_PRIVILEGES;
begin
{获得用户关机特权,仅对Windows NT/2000/XP}
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
hToken);
if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid)
then
begin
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
tkp.PrivilegeCount := 1;
AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
end;
Result := InitiateSystemShutdown(PChar(Computer), PChar(Msg), Time, Force, R
eboot)
end;
{重新启动计算机jamesread,在win2000ADVServer测试通过}
procedure TForm1.Button1Click(Sender: TObject);
begin
W2KShutDown('jamesread','shutdown',1,true,true);
end;

end.