数学建模社区-数学中国

标题: 用delphi写的一个关闭机器的函数! [打印本页]

作者: ilikenba    时间: 2004-9-24 21:04
标题: 用delphi写的一个关闭机器的函数!
<>implementation
: K5 G0 O9 [) e7 ~uses IniOper, TMain;8 e0 Q! D4 U: U
const
  {+ P: I/ O* o     NETBUFF_SIZE=$208;" a- l' V# A6 {- c
     EWX_FORCE=4;//强制关闭所有程序* I( I+ w& N* }2 O7 r+ `
     EWX_LOGOFF=0;//注销9 F! X( J* p5 Z0 M8 u
     EWX_SHUTDOWN=1;//关闭计算机
! m' @* J3 n8 a* Z# b     EWX_REBOOT=2;//关闭并重新启动计算机
; H7 A# e2 H; Q& [4 m$ o8 n     EWX_POWEROFF=8;//关闭系统并切断电源
/ ?" z! N  k* D, ovar' i/ [; V% L1 {$ H. ~) J1 R
  NetSessionEnum:function(
( K) P8 z0 y# t$ [            ServerNamePSTR;
- d: N+ S  T( u# c& j: Q            ReservedWORD;
" |0 z% u  o# q8 b            BufPByte;) m/ K& p- i3 N0 ?5 R
            BufLenWORD;; V. T2 r& l' i! `+ Y( ?. V" v
            ConnectionCountPDWORD;
; s+ q; p) A) W            ConnectionToltalCountPDWORD):NET_API_STATUS;
; u. h7 f- C$ z" z3 w  Z            stdcall;
5 L4 l0 z/ V. S( t    NetSessionDel:function(
) y0 k- O6 ~$ w8 H! l            ServerNamePWSTR;
9 K" M6 L& k! g% p1 q            UncClinetNamePWSTR;/ B7 L. N% ]- H, |/ I) u
            UserName:dword):NET_API_STATUS;
- z% R* w7 |2 N5 }9 V9 A- q            stdcall;7 T% ^+ `3 D2 o& h  _6 C0 D, z
type
/ b5 U% L7 B( S" p  NET_API_STATUS=DWORD;  k& e' K, R, [7 ~2 f. Y2 g
  LPByte=PByte;# U! R3 I" o# w2 ^" e) G
function TSysOper.GetWinVer:Byte;//获取windows操作系统的版本
, s0 Q. k9 o; P/ x! ivar! d9 a: I" ]  a5 k2 q
OS:TOSVersionInfo;: o( a8 m, D% \! `1 {( W( t3 t
begin
- m8 M9 Y+ [$ [# X7 X, m  Result:=0;
) K0 k% i3 s9 x. x# Y  OS.dwOSVersionInfoSize:=SizeOf(TOSVersionInfo);
' s& a5 x2 A+ U' G1 ~, V  GetVersionEx(OS);
; P! t/ A$ m; C3 E7 l- t  case OS.dwPlatformId of( e# }/ ^0 u& R) v, N8 v; O: j
     VER_PLATFORM_WIN32s : Result:=0;//Windows 3.1x/32s
% k/ P9 u1 d0 J" {     VER_PLATFORM_WIN32_WINDOWS : Result:=1;//Windows95
* i* W  j3 T7 F& a* D8 x- r% f     VER_PLATFORM_WIN32_NT : Result:=2;//Windows NT0 `8 I7 A7 p' R, j  ~; ]8 Z
  end;" I4 q8 ?  M0 |/ ~6 V0 P$ f
end;</P>
; L3 h; h- B" N  Z  m. g<>function  TSysOper.SetPrivilege(Enable:Boolean):Boolean; //设置系统权限
$ R4 P7 H4 E- X+ S4 M0 bvar8 b% `$ A, p( {# D) y
  NewState,PreviousState : TTokenPrivileges;
" s& G, Y2 k3 d, r4 {2 n5 m  Token : THandle;( `' l* \8 |1 D- J2 f; D9 `
  dwRetLen : DWord;
! F8 v4 C- N9 B2 B8 `# u8 Dbegin
# A, D4 D3 H3 ?* u/ B- H  Result:=false;
' A& ^" [8 L" S7 T* K* f0 g6 M2 l# j  OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,token);
  R- M* F/ V1 \& b  NewState.PrivilegeCount :=1;
! ^) J# z) r/ m% S  _$ W0 e6 r  if(LookupPrivilegeValue(nil,'SeShutdownPrivilege',NewState.Privileges[0].Luid))then
$ k( S% b  B* X  begin1 z+ L  [9 i% A) L
    if Enable then
$ I2 r: }2 z% ?3 W3 \  u: _      NewState.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED( [9 Y5 y3 ]6 ]- }( w2 t! [0 n. I
    else, e# m4 R1 `6 n
      NewState.Privileges[0].Attributes:=0;
4 R0 m: C( Z1 X: a# M  Q' q2 k    dwRetLen:=0;; H# F( O( I; C! K4 ^& P
    Result:=AdjustTokenPrivileges(token,False,NewState,Sizeof(PreviousState),PreviousState,dwRetLen);
  n) Y0 ^5 a% ^9 l. p  end;6 ~5 G& V% \; w6 |
  CloseHandle(token);1 g( G! H3 k7 M  g( Z
end;</P>( ^3 I. l% i- _4 n6 k
<>procedure TSysOper.ShutDownSystem(EWX_Type:Integer);//根据关机类型执行操作+ V6 o+ @+ }9 `* }! E; Q4 P
begin6 t) I9 V5 i$ b, s
  if GetWinVer=2 then9 E3 J) W  P2 n( Z+ _: h
  begin
: F: u: E$ P  D/ x7 R     //if CloseAllConnectedSession(1) then
" o1 x+ m( e8 b9 o7 l5 g' }    // begin
' X' k9 i7 N* \; ?& j  j+ c       CloseAllConnectedSession(1);5 O% g1 q$ \3 r8 b+ O" @2 x
       SetPrivilege(true);//提升系统权限到可以关机
' P* }( P" J; P% {8 m       if(not ExitWindowsEx(EWX_Type,0))then, ~" w, F: r4 s) d2 D8 \8 a, J
          SetPrivilege(false);//如果关机不成将权限设置回去6 I7 y% M; d3 H3 P3 p# P) K7 o! j
    // end
! E7 f5 S- T7 f     //else; F5 t$ f! A. a: G) [: f
     //  raise Exception.Create('不能结束某些共享网络连接,无法继续执行操作!');
% S5 s1 o- U/ `! {% E  end) u* h$ |0 C* h0 L
  else
  v3 R/ t4 [" d" M0 I! U7 A  begin
0 X4 p* G) ?* ^( F9 ?' u6 W4 S, N     //if CloseAllConnectedSession(0) then
9 I) `: t) }9 X8 Y. p  o* U9 v        CloseAllConnectedSession(0);
5 d- p0 Y% B" d, u$ C        ExitWindowsEx(EWX_Type,0);
8 Q, e0 `8 P7 a: n    // else
; y* x' B& V- g3 ?5 E     //  raise Exception.Create('不能结束某些共享网络连接,无法继续执行操作!');
; [6 g3 E$ l" b3 H3 m/ y$ D9 i5 U  end;
1 a1 P1 a* g5 ]* q( jend;</P>; g6 b; S) Y* c$ B! R! \# k* h
<>function TSysOper.CloseAllConnectedSession(sys:Integer):Boolean;/ {( h& K+ i6 _; `; g7 Z- o: u8 r
var" F. m3 X3 ]0 s7 _
  NetRet : DWORD;2 f4 |( e1 V; H8 P
  I :  Integer;
- \. F: T  }8 |, l$ w' E' n  Entries : DWORD;
( g: \8 o  ?0 r7 L* i  TotalEntries : DWORD;6 ]# p% w6 q3 s3 z
  Client : LPWSTR;
& \/ j' i% b+ \, L2 c0 p  UserName WORD;- {: x5 o9 m( _/ _" k) z
  Buff : Array[0..NETBUFF_SIZE-1]of byte;7 H+ L7 r2 l* e# g: W
  Adword :  Array[0..NETBUFF_SIZE div 4-1]of dword;
; s* z4 B: z& x& x0 Q  DllHandle : THandle;
1 U4 w% d0 e3 x- ?. w+ E9 B- `begin
0 ?( |6 J9 ~8 \4 _6 I0 @  Result:=false;. Y; M$ {4 b! p9 j
  DllHandle:=0;6 `. K$ H9 X2 N" z# ]
  try* `$ S6 A- t/ ^4 W. ~
   if sys=1 then$ _" b9 s3 ~- K  l
      DllHandle:=LoadLibrary('NETAPI32.DLL')
$ F3 `, Z1 _8 e* O7 u9 l   else# ~- P' y2 G9 N8 [1 s5 g+ s# [8 J
      DllHandle:=LoadLibrary('SVRAPI.DLL');
& w7 Q* ~- Q$ ~8 l   if DllHandle=0 then. G% s3 {& O* i" H4 D" R8 J
     raise Exception.Create('不能加载动态链接库!');
( k& n: K0 V$ M+ T   @NetSessionEnum:=GetProcAddress(DllHandle,'NetSessionEnum');  h* V+ {7 o' d
   @NetSessionDel:=GetProcAddress(DllHandle,'NetSessionDel');8 O+ o" P3 Y7 g' v6 E
   NetRet:=NetSessionEnum(nil,$32,@Buff,NETBUFF_SIZE,@Entries,@TotalEntries);
! ^9 c  ]: P, X1 y' I3 X# S9 n( [   if(NetRet=0)then- r0 ^. H7 m' {% t
   begin
, B5 W( F0 f- t     Result:=true;
$ c* K! {( \- B& j5 n' D     for i:=0 to TotalEntries-1 do' h7 [' O7 Z5 j1 \% t
     begin0 g# M$ S5 E4 `* }( n6 w
       Move(Buff,Adword,NETBUFF_SIZE);% G1 z3 Y9 \- S) W( f7 L
       Client:=LPWSTR(Adword[0]);" |5 o3 x2 W+ M: x) M3 ]4 L8 h
       UserName:=Adword[2];
' v7 ]( g, u5 ]3 n+ u       NetRet:=NetSessionDel(nil,Client,UserName);
$ b3 R: H7 |7 Y( M7 l9 H: ?8 ?       if(NetRet&lt;&gt;0)then7 A- }; Q; ^! }8 Y; q) Y$ }3 w4 p" }
       begin
# y9 p* e6 @# W  a! m         Result:=false;8 t1 E% {8 T. s7 R, Q. M0 z. \
         break;1 D8 y3 \5 C7 j# Y5 b" l$ l
       end;8 N0 H# B/ }! _- W. w2 u
       Move(Buff[26],Buff[0],NETBUFF_SIZE-(i+1)*26);) s$ E: V% `  E! }  x; c' U9 m
     end;- ~/ l! c  {* i7 n* `
   end2 h, N1 z. u  Z( Q+ u  [
   else5 i0 h# W* ^7 w* U' A/ a! t
     Result:=false;0 S% T: x3 v* W8 L6 c5 ~# e
  finally
$ m4 d8 ]9 C  [; Z    FreeLibrary(DllHandle);) m: O& ^  e9 K, V/ E5 d
  end;2 g8 Z3 I5 j; B2 T, A! n" Q
end;
8 i, v% M" [- B</P>




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5