用delphi写的一个关闭机器的函数!
<P>implementationuses IniOper, TMain;
const
NETBUFF_SIZE=$208;
EWX_FORCE=4;//强制关闭所有程序
EWX_LOGOFF=0;//注销
EWX_SHUTDOWN=1;//关闭计算机
EWX_REBOOT=2;//关闭并重新启动计算机
EWX_POWEROFF=8;//关闭系统并切断电源
var
NetSessionEnum:function(
ServerName:LPSTR;
Reserved:DWORD;
Buf:LPByte;
BufLen:DWORD;
ConnectionCount:LPDWORD;
ConnectionToltalCount:LPDWORD):NET_API_STATUS;
stdcall;
NetSessionDel:function(
ServerName:LPWSTR;
UncClinetName:LPWSTR;
UserName:dword):NET_API_STATUS;
stdcall;
type
NET_API_STATUS=DWORD;
LPByte=PByte;
function TSysOper.GetWinVer:Byte;//获取windows操作系统的版本
var
OS:TOSVersionInfo;
begin
Result:=0;
OS.dwOSVersionInfoSize:=SizeOf(TOSVersionInfo);
GetVersionEx(OS);
case OS.dwPlatformId of
VER_PLATFORM_WIN32s : Result:=0;//Windows 3.1x/32s
VER_PLATFORM_WIN32_WINDOWS : Result:=1;//Windows95
VER_PLATFORM_WIN32_NT : Result:=2;//Windows NT
end;
end;</P>
<P>function TSysOper.SetPrivilege(Enable:Boolean):Boolean; //设置系统权限
var
NewState,PreviousState : TTokenPrivileges;
Token : THandle;
dwRetLen : DWord;
begin
Result:=false;
OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,token);
NewState.PrivilegeCount :=1;
if(LookupPrivilegeValue(nil,'SeShutdownPrivilege',NewState.Privileges.Luid))then
begin
if Enable then
NewState.Privileges.Attributes:=SE_PRIVILEGE_ENABLED
else
NewState.Privileges.Attributes:=0;
dwRetLen:=0;
Result:=AdjustTokenPrivileges(token,False,NewState,Sizeof(PreviousState),PreviousState,dwRetLen);
end;
CloseHandle(token);
end;</P>
<P>procedure TSysOper.ShutDownSystem(EWX_Type:Integer);//根据关机类型执行操作
begin
if GetWinVer=2 then
begin
//if CloseAllConnectedSession(1) then
// begin
CloseAllConnectedSession(1);
SetPrivilege(true);//提升系统权限到可以关机
if(not ExitWindowsEx(EWX_Type,0))then
SetPrivilege(false);//如果关机不成将权限设置回去
// end
//else
// raise Exception.Create('不能结束某些共享网络连接,无法继续执行操作!');
end
else
begin
//if CloseAllConnectedSession(0) then
CloseAllConnectedSession(0);
ExitWindowsEx(EWX_Type,0);
// else
// raise Exception.Create('不能结束某些共享网络连接,无法继续执行操作!');
end;
end;</P>
<P>function TSysOper.CloseAllConnectedSession(sys:Integer):Boolean;
var
NetRet : DWORD;
I : Integer;
Entries : DWORD;
TotalEntries : DWORD;
Client : LPWSTR;
UserName :DWORD;
Buff : Arrayof byte;
Adword : Arrayof dword;
DllHandle : THandle;
begin
Result:=false;
DllHandle:=0;
try
if sys=1 then
DllHandle:=LoadLibrary('NETAPI32.DLL')
else
DllHandle:=LoadLibrary('SVRAPI.DLL');
if DllHandle=0 then
raise Exception.Create('不能加载动态链接库!');
@NetSessionEnum:=GetProcAddress(DllHandle,'NetSessionEnum');
@NetSessionDel:=GetProcAddress(DllHandle,'NetSessionDel');
NetRet:=NetSessionEnum(nil,$32,@Buff,NETBUFF_SIZE,@Entries,@TotalEntries);
if(NetRet=0)then
begin
Result:=true;
for i:=0 to TotalEntries-1 do
begin
Move(Buff,Adword,NETBUFF_SIZE);
Client:=LPWSTR(Adword);
UserName:=Adword;
NetRet:=NetSessionDel(nil,Client,UserName);
if(NetRet<>0)then
begin
Result:=false;
break;
end;
Move(Buff,Buff,NETBUFF_SIZE-(i+1)*26);
end;
end
else
Result:=false;
finally
FreeLibrary(DllHandle);
end;
end;
</P>
页:
[1]