关于win98程序控制关机的问题

yingshang 2004-10-12 01:13:52
procedure TzlUtils.ExitWindows32(AShutDownFlag: Word);
// ShutDownFlag in [EWX_REBOOT, EWX_SHUTDOWN, EWX_LOGOFF, EWX_POWEROFF]

function ChangeNTSecurityForShutdown: Boolean;
var
hToken : THandle;
tkp, Newt : TTokenPrivileges;
retlength : DWORD;
begin
Result := False;
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES +
TOKEN_QUERY, hToken) <> False then
begin
if LookupPrivilegeValue(nil, 'SeShutdownPrivilege',
tkp.Privileges[0].Luid) = True then
begin
tkp.PrivilegeCount := 1; // One to set
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
Result := AdjustTokenPrivileges(hToken, False, tkp,
SizeOf(TTokenPrivileges),
Newt, retlength);
end;
end;
end;

begin
if Win32PlatForm = VER_PLATFORM_WIN32_NT then
begin
if ChangeNTSecurityForShutdown then
ExitWindowsEx(AShutDownFlag, 0);
end
else if Win32PlatForm = VER_PLATFORM_WIN32_WINDOWS then
ExitWindows(AShutDownFlag, 0);
end;

我用上面的函数在win2000或winxp都可以成功的关机、重起、注销,但是在win98下所有的操作都变成了注销,不知道为什么,请问各位大侠该如何解决?
...全文
73 6 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Rex_love_Burger 2004-10-12
  • 打赏
  • 举报
回复
在win98中不需要提升权限,下面的函数适合所有Windows版本
function GetWinVersion: String;

var

VersionInfo : TOSVersionInfo;

OSName : String;

begin

// set the size of the record

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;
yingshang 2004-10-12
  • 打赏
  • 举报
回复
else if Win32PlatForm = VER_PLATFORM_WIN32_WINDOWS then
ExitWindows(AShutDownFlag, 0);

请看这段,我不是用ExitWindows的吗?不行啊!
zwb666 2004-10-12
  • 打赏
  • 举报
回复
直接用ExitWindows
beyondsun 2004-10-12
  • 打赏
  • 举报
回复
直接用ExitWindows,不要提升权限了,NT系统才要提升咯.
yueyixing 2004-10-12
  • 打赏
  • 举报
回复
在98中是不需要提升权限的,直接使
yingshang 2004-10-12
  • 打赏
  • 举报
回复
顺便再问一个问题,在没有关机等操作的权限的时候,该如何关机、重起、注销?
发帖
Windows SDK/API

1177

社区成员

Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
帖子事件
创建了帖子
2004-10-12 01:13
社区公告
暂无公告