ilikenba 发表于 2004-9-24 21:04

用delphi写的一个关闭机器的函数!

<P>implementation
uses 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&lt;&gt;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>

发表于 1970-1-1 08:00

页: [1]
查看完整版本: 用delphi写的一个关闭机器的函数!