如何让windows2000重启(200分)

  • 主题发起人 主题发起人 caowei
  • 开始时间 开始时间
C

caowei

Unregistered / Unconfirmed
GUEST, unregistred user!
用ExitWindows这样的函数,加上FORCE参数,是可行的。
但是有时候系统出问题了,重启的时候系统就停在2000的蓝色背景桌面,不动了。
就象从2000的开始菜单里面选择“重新启动”一样,应该很多人都碰到过无法启动的现象吧。
比如某个程序死机就有可能造成系统无法重启。
不知道有没有更彻底的办法,就象按下reset一样,不管怎么都能重启。
 
嗯,try this
function SetPrivilege(aPrivilegeName : string;
aEnabled : boolean ): boolean;
var
TPPrev,
TP : TTokenPrivileges;
Token : THandle;
dwRetLen : DWord;
begin
Result := False;
OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY, @Token );

TP.PrivilegeCount := 1;
if( LookupPrivilegeValue(nil, PChar( aPrivilegeName ),
TP.Privileges[ 0 ].LUID ) ) then
begin
if( aEnabled )then
TP.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
else
TP.Privileges[0].Attributes:= 0;

dwRetLen := 0;
Result := AdjustTokenPrivileges(Token,False,TP,
SizeOf( TPPrev ),
TPPrev,dwRetLen );
end;

CloseHandle( Token );
end;


function WinExit( iFlags : integer ) : boolean;
// possible Flags:
// EWX_LOGOFF
// EWX_REBOOT
// EWX_SHUTDOWN
begin
Result := True;
if( SetPrivilege( 'SeShutdownPrivilege', true ) ) then
begin
if( not ExitWindowsEx( iFlags, 0 ) )then
begin
Result := False;
end;
SetPrivilege( 'SeShutdownPrivilege', False )
end
else
begin
Result := False;
end;
end;


 
楼上的乱说话,
人家要的是reset键的功能.
 
谁能给出2K或NT下普通权限用户能关机


注意上面的普通用户


我给同样的分!我是守信誉的人!
 
我以前也用过2000重启功能!但是用API编程有时效果不好,特别是有时个别程序不能
及时退出,导致机器半天没反应(特别是有个别杀毒程序在运行时)!
后来找到一个简单的方法!不过用的是C编写一个非常小的程序,就可以非常有效的完成
重启功能!(我用LCC编译才3K多一点)对2000专业版、服务器版都有效!
代码如下!

int main()
{
for(;;)
{
printf("Reboot/t/t/b/b/b/b/b/b");
}
return 0;
}
 
pcspace说的我曾经测试过。好象是去年的时候有人发现的windows的漏洞,
就是循环printf("/t/b/b");但是我实际执行的结果是死机并没有重启。
 
那这个函数呢?
ExitWindowsEx(EWX_POWEROFF,EWX_FORCE);
 
都说了不行啦....正常情况下没问题,但是有时候会死锁。
 
XP,delphi 7.0

{$I-}
while true do
begin
writeln('Reboot/t/t/b/b/b/b/b/b');
if (ioresult<>0) then asm nop end;
end;
等了5分钟也没有动静!
 
在2000professional下,死机。
 
进来笑一下,哈哈。
 
没有答案了?
 
还有办法吗?
 
To wql:
上述代码用C编译器,编译成exe文件,
在2000 专业版、服务器版都运行良好!
这是根据2000的漏洞作出来的,百试不爽!Delphi里面不行!
编译机制不一样! 我用C++ Bulider5、LCC 都试过!
 
我用VC6编译的,不行啊...
 
难得用TurboC编译?
 
//以下代码请仅供参考:

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;

 
后退
顶部