数学建模社区-数学中国

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

作者: ilikenba    时间: 2004-9-24 21:04
标题: 用delphi写的一个关闭机器的函数!
<>implementation
0 a: A0 l+ y' a" _  @uses IniOper, TMain;
! x# Z8 S% B- x4 O, Y8 B: R  Iconst
( @; H2 [# F( h9 r7 @     NETBUFF_SIZE=$208;
+ p2 u$ w4 k9 T) @0 e$ g     EWX_FORCE=4;//强制关闭所有程序- b: H* D: D& @5 |1 B
     EWX_LOGOFF=0;//注销
2 c0 S$ J8 ~4 N% w     EWX_SHUTDOWN=1;//关闭计算机4 U0 ]9 f0 H" V" @6 H6 K
     EWX_REBOOT=2;//关闭并重新启动计算机8 ^) c2 P) M- m7 T3 ~
     EWX_POWEROFF=8;//关闭系统并切断电源+ X. ^% b: z* @. M
var. q( e1 a- }& f
  NetSessionEnum:function(
$ e3 c, V0 z8 I$ n! D' j            ServerNamePSTR;4 c7 g5 U# c2 a  c- C: \
            ReservedWORD;
* X, W6 Z: z/ r4 X/ u' m  c            BufPByte;
. B( q* i/ n% X6 B/ Z            BufLenWORD;0 T# t1 F& {5 l9 q  \, Y
            ConnectionCountPDWORD;
  a/ X  Z: A, U7 K& ?            ConnectionToltalCountPDWORD):NET_API_STATUS;
/ j9 l6 v' R8 U% m' g            stdcall;
, X* j- @* f/ f, I    NetSessionDel:function(1 [3 J/ W) D" z7 o/ _
            ServerNamePWSTR;1 _3 G3 c$ Q, M# S2 I* I) D
            UncClinetNamePWSTR;
, z) o0 A' O) t5 r! m            UserName:dword):NET_API_STATUS;
9 t7 ]0 z6 m  e' B* \6 i% ~$ n$ B            stdcall;
# [- C5 f) D) q# ^$ }3 d7 gtype9 R2 F. H) [' s" L5 g
  NET_API_STATUS=DWORD;% g% V* R0 {6 F8 e! ?  o
  LPByte=PByte;8 ]; U; O( V' E, _5 f' c3 Q
function TSysOper.GetWinVer:Byte;//获取windows操作系统的版本
) M! s/ K- L4 o2 K3 S/ {; R0 p+ t. }* avar
2 q3 J# A! m, r/ [6 ? OS:TOSVersionInfo;7 \, p2 f8 s7 O9 h
begin# H. w( H3 g0 R. a& l+ Q5 x7 n
  Result:=0;
6 |* P$ f4 c1 b% H0 K8 @/ ?% F  A  OS.dwOSVersionInfoSize:=SizeOf(TOSVersionInfo);
+ H0 C7 ]7 o! N# g9 H3 D  GetVersionEx(OS);: ~8 r* C- Y4 e0 _# l# j* x% l- \
  case OS.dwPlatformId of* a6 Q4 X2 r5 @5 n- {5 K' i
     VER_PLATFORM_WIN32s : Result:=0;//Windows 3.1x/32s
& O" a+ Y/ r+ [2 S& L) H     VER_PLATFORM_WIN32_WINDOWS : Result:=1;//Windows95# R  _7 x6 N6 c& {
     VER_PLATFORM_WIN32_NT : Result:=2;//Windows NT
' s9 i, Z7 n' t- u1 h& B/ G& Q  end;, s8 _( S+ }# f; T' P9 O! ]
end;</P>7 P* J; Q* m" P7 p* }6 z2 x9 u
<>function  TSysOper.SetPrivilege(Enable:Boolean):Boolean; //设置系统权限
! t) e# M# E% L- x. f' ~var: J" q& [; l# i3 D
  NewState,PreviousState : TTokenPrivileges;
* I6 h. l/ R% ~4 D0 W8 @6 r' q  Token : THandle;$ [: j* s; b7 ~
  dwRetLen : DWord;3 \' `) Q3 `4 Z
begin
2 B  d! B6 `$ L0 M  c# N  Result:=false;5 M# a% a# y9 ^
  OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,token);
. V) X- v2 ?! o  NewState.PrivilegeCount :=1;$ Q, Z3 E; K1 w) k* N
  if(LookupPrivilegeValue(nil,'SeShutdownPrivilege',NewState.Privileges[0].Luid))then7 q. V+ C2 e! \) B3 O4 y0 q1 T
  begin
+ Y, F# e% v% u, q    if Enable then, L' x. I! L% ^) [. M3 e
      NewState.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED
, Y; U8 O7 z' ?* Z6 |8 N; _    else5 d' d* L7 V9 {$ M2 x; \: P3 b
      NewState.Privileges[0].Attributes:=0;
* c: N& ?. R$ I9 M& a4 i( g0 |7 [    dwRetLen:=0;- l4 f/ P6 k" a: |- m& O$ Y" u
    Result:=AdjustTokenPrivileges(token,False,NewState,Sizeof(PreviousState),PreviousState,dwRetLen);
0 J; b$ h* C2 ~: t9 W( J  u  end;$ }7 i. j- a+ }+ C5 l  |9 S9 I' s
  CloseHandle(token);
# [7 O: @( `5 [9 Xend;</P>
4 f/ c  A- \8 q% p0 T' u0 R8 `' K<>procedure TSysOper.ShutDownSystem(EWX_Type:Integer);//根据关机类型执行操作
$ t$ N9 G, c" J" B( q* Y% U. Obegin/ W4 L3 ~6 N- G) J! Z
  if GetWinVer=2 then. ]  i1 L: O% E) o4 N: [" d
  begin  y8 ]' d  F" M/ r1 c- B
     //if CloseAllConnectedSession(1) then8 F% I5 Q3 B  T2 ~( f& `4 B; o' e
    // begin/ y, |) ]* w' ?# o# l% _5 ]
       CloseAllConnectedSession(1);  O. X7 T% X6 e, X
       SetPrivilege(true);//提升系统权限到可以关机8 U  n3 E+ A: C/ i% }2 Y+ l
       if(not ExitWindowsEx(EWX_Type,0))then2 p7 ~( A5 I( x" m
          SetPrivilege(false);//如果关机不成将权限设置回去- F3 I; o- {; ~0 Z+ a9 Z
    // end" k& S5 Z& P+ t6 O; t
     //else0 a+ H6 j" }7 ^; j" a) s  g4 t, r
     //  raise Exception.Create('不能结束某些共享网络连接,无法继续执行操作!');3 E5 F( g! H1 A5 z
  end, P" {( S5 t; U; |" p! c
  else
0 W* N8 K0 o0 I. `  D1 Z  begin
( S- h2 C: ^; q3 f6 @/ F9 w     //if CloseAllConnectedSession(0) then
) k* D! N0 j( Z! @% q5 j        CloseAllConnectedSession(0);9 M, O: r/ T: z0 u( H
        ExitWindowsEx(EWX_Type,0);1 d0 E2 f" \- K  T& K
    // else/ x  z2 |3 n! J* X
     //  raise Exception.Create('不能结束某些共享网络连接,无法继续执行操作!');
* f/ p9 D* t3 t% z1 i8 M  end;
$ {- x) Y4 {* P* e' y* P8 u5 a& [8 `end;</P>
+ L5 W+ v9 r# ?4 ?- }" I; n<>function TSysOper.CloseAllConnectedSession(sys:Integer):Boolean;
4 ~8 e% q3 z5 X- D: l% y8 ~var
3 H8 r( B& ~) m! c  NetRet : DWORD;" A( a7 a/ h4 y& R% b' a/ I% G9 C
  I :  Integer;! G+ L7 F$ }! M6 \' T
  Entries : DWORD;
6 ]7 B2 v: l% D  TotalEntries : DWORD;6 m; i# |& G1 k4 [+ E/ I) C' P
  Client : LPWSTR;
# v& U% \3 I# Q! T7 f6 F# X, l9 Q  UserName WORD;
! o. A8 l0 N5 t5 U/ x& h  Buff : Array[0..NETBUFF_SIZE-1]of byte;
( p3 a2 p; \; r% d$ P  Adword :  Array[0..NETBUFF_SIZE div 4-1]of dword;
" H! i! D* F* B! N5 ]) g  DllHandle : THandle;
+ f/ t, d) t1 }+ ~3 T3 ?begin# j7 ~7 l9 ^8 u  {5 |1 g' ~8 k7 z! z
  Result:=false;/ q) F! U. h& j' ^( }: T4 O# i2 N
  DllHandle:=0;5 F' S$ o, X. v' T3 Z6 N* x
  try
  Y9 ^' T9 o9 n8 W% E6 w   if sys=1 then
( S. {6 Y$ |. }, P; ?2 e/ u      DllHandle:=LoadLibrary('NETAPI32.DLL')( l1 O; v2 q0 c8 s3 }; E* ^- [; s
   else
% M+ T( i$ q5 B      DllHandle:=LoadLibrary('SVRAPI.DLL');
6 ~- K* a% n- S* {. _   if DllHandle=0 then6 [. p7 B2 B5 b) e9 J2 Z3 X3 ~
     raise Exception.Create('不能加载动态链接库!');
6 a) z; n. ^" X; Q2 @   @NetSessionEnum:=GetProcAddress(DllHandle,'NetSessionEnum');
! z% o6 p% p+ I6 M4 ?) V   @NetSessionDel:=GetProcAddress(DllHandle,'NetSessionDel');, X. M3 O$ `) }, f
   NetRet:=NetSessionEnum(nil,$32,@Buff,NETBUFF_SIZE,@Entries,@TotalEntries);% N* s! L4 B8 p& e- o6 D
   if(NetRet=0)then
1 M8 ]9 B  {$ u9 i8 A- @$ Q# \   begin% `5 `' t4 Q0 b
     Result:=true;' @( K5 ^: g2 o5 q4 I" h! A) A" ]
     for i:=0 to TotalEntries-1 do
) F# f0 ]6 f; v     begin
8 [- d/ A7 H$ v3 |7 R; ?       Move(Buff,Adword,NETBUFF_SIZE);
3 e2 d' Z& ?" J3 b9 g       Client:=LPWSTR(Adword[0]);2 D. a; k- W0 R$ ]0 ]( n6 H
       UserName:=Adword[2];
; C4 l) i& m8 `" N% u  [- M- t       NetRet:=NetSessionDel(nil,Client,UserName);7 F+ p/ u* |1 s% y  Y+ I
       if(NetRet&lt;&gt;0)then; u$ w% D: n. [6 o# f. m" k
       begin6 x/ A* b) }- f# h4 i) i; _
         Result:=false;
$ p9 B1 Y, W; C# U. L         break;. b  f1 c4 W. }6 o( f
       end;
" \$ S& p. T+ _7 ?       Move(Buff[26],Buff[0],NETBUFF_SIZE-(i+1)*26);8 _, R* I9 {3 D9 J- |
     end;
! O, Z- e; d+ @1 [9 x   end
: d/ l3 K# ?# Z/ ?/ y( m   else& _" |5 ]$ J* p5 g
     Result:=false;# E. \1 R- X4 ]$ z3 Y9 S$ T9 `/ \
  finally5 A3 W$ Q: a: C# ^* X
    FreeLibrary(DllHandle);
1 W+ ?- U3 A7 x" A$ z% H( Z# ]  end;# o7 Q, p5 m* w. A6 t: }2 ?- E2 M, ~6 o
end;8 {, ~' _  C% e( w
</P>




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