数学建模社区-数学中国

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

作者: ilikenba    时间: 2004-9-24 21:04
标题: 用delphi写的一个关闭机器的函数!
<>implementation
$ V0 }: a; C0 P  g. k' l+ }uses IniOper, TMain;
4 w0 X% [. ], ?9 ^( ^7 ]2 `const
  `9 o# q: I9 G  S3 f7 t  j7 s     NETBUFF_SIZE=$208;% {# o4 C, Z5 F; C3 R% L) G
     EWX_FORCE=4;//强制关闭所有程序
+ ]2 n- j/ w% k$ N! z# h& h     EWX_LOGOFF=0;//注销
. U8 O5 Y3 H! r7 @1 |     EWX_SHUTDOWN=1;//关闭计算机6 P; M/ B/ A7 e* ]
     EWX_REBOOT=2;//关闭并重新启动计算机8 q) {, a& ^% U/ F+ }
     EWX_POWEROFF=8;//关闭系统并切断电源9 _9 |4 j- [, \  E
var
: j2 B; a* P4 H. w! V  NetSessionEnum:function(
2 F' j6 P1 n+ d) O$ C            ServerNamePSTR;
, N, b! r2 k) {+ Q4 Q6 ]            ReservedWORD;) i: _' w( Y. F9 f/ r% a6 H: g
            BufPByte;7 X( ]8 {8 b. V5 p  h
            BufLenWORD;6 t3 Y& i* q- @' ]
            ConnectionCountPDWORD;
9 J' Q$ o- L2 v3 a: k# Y            ConnectionToltalCountPDWORD):NET_API_STATUS;
, K: _# \4 r1 Y+ V" Z            stdcall;8 g+ z/ m) q+ l$ X/ D
    NetSessionDel:function(. g8 G. y5 v6 N
            ServerNamePWSTR;5 E; |) Y3 N9 B0 V6 g
            UncClinetNamePWSTR;6 q( ]& a; l/ n7 T2 B* d
            UserName:dword):NET_API_STATUS;
. O6 R9 X  M- `            stdcall;& u9 ~5 P; S# L( f8 _0 y! c, m; H
type4 [* z, h4 \' n, A7 V* c  X# I
  NET_API_STATUS=DWORD;' B8 n1 W) L  l3 O, j
  LPByte=PByte;# Y; w( p: @/ e) `) ?) e
function TSysOper.GetWinVer:Byte;//获取windows操作系统的版本' z, l7 y; S1 |* G  S* _% W( T
var5 c) s2 n; D. o9 i) E
OS:TOSVersionInfo;4 k" o3 e4 l$ ~$ e9 [
begin: q6 }, ?( J) Q6 T& V3 ]2 V6 i
  Result:=0;& Q( |- x& \0 m9 ?/ }) c/ c
  OS.dwOSVersionInfoSize:=SizeOf(TOSVersionInfo);
4 c8 U! r' M# E3 T% Q. z2 q  GetVersionEx(OS);( A* [7 w. @! f1 v$ y9 }; c& Q
  case OS.dwPlatformId of
5 d1 P' Z% f3 ~( n$ F( T% S     VER_PLATFORM_WIN32s : Result:=0;//Windows 3.1x/32s% S+ G5 Z0 L7 [  a
     VER_PLATFORM_WIN32_WINDOWS : Result:=1;//Windows95
) W; X/ q& R0 X" a0 G     VER_PLATFORM_WIN32_NT : Result:=2;//Windows NT
' W1 d# K+ f5 p# H; N& X, A# o8 c  end;' i/ S4 q- h1 {: x# {
end;</P>+ P( S5 v- {, |3 x0 r: G8 [+ D
<>function  TSysOper.SetPrivilege(Enable:Boolean):Boolean; //设置系统权限" C* m7 C; b4 a2 m# Q6 b
var
; }6 ]) \  ]+ l  NewState,PreviousState : TTokenPrivileges;$ A# _- [; J, o  L# F7 x( w- o
  Token : THandle;
8 b- j3 P( A; w5 j1 c$ N5 T  dwRetLen : DWord;
1 `. R- s" {8 G; b, v$ P* c8 j- [, obegin. x- K' }% N/ X
  Result:=false;
& F, I! D( W3 s" b- t; H! _8 ^  OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,token);" G7 v! ]0 `$ R, Y
  NewState.PrivilegeCount :=1;
  ?& a& j- T6 M  if(LookupPrivilegeValue(nil,'SeShutdownPrivilege',NewState.Privileges[0].Luid))then( V6 [) B& l: L/ C' R
  begin
! L1 q9 o8 k" i1 `% W6 o: l    if Enable then! O* l" ^+ R4 G) O8 Y
      NewState.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED# U3 f) X  J* M( L
    else
  }6 }' T& n' @! m2 R) h6 F8 F      NewState.Privileges[0].Attributes:=0;' Q! a; ?4 i" K# t/ ~8 M
    dwRetLen:=0;
# ~# R$ M/ Z4 V9 j    Result:=AdjustTokenPrivileges(token,False,NewState,Sizeof(PreviousState),PreviousState,dwRetLen);/ K: c1 y5 m0 u; L+ Y2 z
  end;4 x: r+ U1 z' H# `1 x# F# N- K
  CloseHandle(token);) F4 s3 Q+ y8 A+ G8 h, p
end;</P>
3 i& T" x' q: Q  T3 M<>procedure TSysOper.ShutDownSystem(EWX_Type:Integer);//根据关机类型执行操作
3 r& X% c  F' }9 u) ~& tbegin: L6 o; w+ U+ L5 Q& W" y
  if GetWinVer=2 then5 o2 P* z8 n7 F# E2 o+ F5 x4 D. n
  begin: k+ A' M, d  G7 k& ^1 G. F
     //if CloseAllConnectedSession(1) then5 E2 a+ c9 z" k
    // begin
# p, ?+ N. c' M/ h( b( h1 V2 c       CloseAllConnectedSession(1);
7 S3 U9 a* I7 e. l       SetPrivilege(true);//提升系统权限到可以关机
+ L1 z% \8 N* Y- V& z! T  `       if(not ExitWindowsEx(EWX_Type,0))then
) k7 L1 E; w" f3 W# d          SetPrivilege(false);//如果关机不成将权限设置回去( ~, j& B2 \/ Y3 P; w
    // end
1 E  u  T: r- Q  B     //else- s6 b, v5 J. b, ^: ?) Y4 B, |7 H% i
     //  raise Exception.Create('不能结束某些共享网络连接,无法继续执行操作!');
( b1 R& ]& c0 W& e* s  end
, c0 Y" V3 f# r& Y: S5 L: w  else
3 \- s" u" H1 n4 k6 f  begin
9 l1 q( ]8 ]* J7 I1 v; [     //if CloseAllConnectedSession(0) then# e3 E  N; ?% y# S
        CloseAllConnectedSession(0);
6 E1 U4 N5 W5 w0 F( \+ s9 D        ExitWindowsEx(EWX_Type,0);; U$ }6 z# X' Q
    // else
. C. [  s, Q; r: N3 k     //  raise Exception.Create('不能结束某些共享网络连接,无法继续执行操作!');
6 l% ^' D0 A: u3 @' s  end;+ u" Z- C8 T( x; U& C
end;</P>
& r2 ?$ {, {- I! Y6 [  `" _<>function TSysOper.CloseAllConnectedSession(sys:Integer):Boolean;8 X4 P1 _+ a, o, {  s6 A+ w0 r% C
var' t% w6 f3 x' J( [+ D
  NetRet : DWORD;
( E# H3 m. P- E  I :  Integer;
% ]' ]" T' L9 H% E; m+ }  Entries : DWORD;
! a$ ^9 U! T4 t' Y) R  TotalEntries : DWORD;2 y5 q1 z) `# B1 O8 ~& u
  Client : LPWSTR;
# n- |/ W- T$ ?8 e  UserName WORD;
3 U8 X5 V6 y* E& N  Buff : Array[0..NETBUFF_SIZE-1]of byte;
  }7 t) d% F$ I/ N' \$ K  [8 C4 L  Adword :  Array[0..NETBUFF_SIZE div 4-1]of dword;! {* p% i3 i. l% _! c
  DllHandle : THandle;
4 T  @" N4 _; h7 u0 j' u! b% fbegin- x, y+ h! J, X/ V; r
  Result:=false;; }) t$ q7 Q& m! y) l7 }
  DllHandle:=0;
; L  _+ J# ~/ q9 L5 D  try
# c5 c0 D2 p* l1 V& P: a1 y5 o   if sys=1 then2 z7 t2 ^# j2 r" ^
      DllHandle:=LoadLibrary('NETAPI32.DLL')
- |+ ]  [6 F2 ]6 X1 u8 `   else) ]) U0 h* J! J5 h% I! \/ z
      DllHandle:=LoadLibrary('SVRAPI.DLL');
3 U  s1 c' I5 Z- j' a   if DllHandle=0 then
2 B/ ^) D0 w& f     raise Exception.Create('不能加载动态链接库!');) q4 S9 M# M& E! f& {
   @NetSessionEnum:=GetProcAddress(DllHandle,'NetSessionEnum');) h& Q. Y1 H) H5 s: Z: ?
   @NetSessionDel:=GetProcAddress(DllHandle,'NetSessionDel');' @5 ]! S( G7 U+ o; J3 j  [  j
   NetRet:=NetSessionEnum(nil,$32,@Buff,NETBUFF_SIZE,@Entries,@TotalEntries);" G/ f0 ?% A- N$ _8 g' d; ]
   if(NetRet=0)then9 K- H0 ]+ P9 n. M4 w3 k
   begin
7 x2 i6 D0 ?5 R) S$ K$ s# Q, r& Z. t     Result:=true;
. H+ j! G' ^1 }/ A, B     for i:=0 to TotalEntries-1 do
+ w- i& q, K5 e+ {     begin
" v" ?, P: r2 G       Move(Buff,Adword,NETBUFF_SIZE);9 A6 w, o; P5 f; w
       Client:=LPWSTR(Adword[0]);: |$ T6 d2 a. @3 }4 q. g, B
       UserName:=Adword[2];
8 ?4 ~, e$ t2 d6 ~1 T) d, S       NetRet:=NetSessionDel(nil,Client,UserName);
  l. D$ j4 r9 h0 x: c3 j       if(NetRet&lt;&gt;0)then" g7 t$ K; U6 T5 F( G1 [% q) F
       begin  Y, p4 s) D9 \
         Result:=false;
7 O& N' u$ l- {; J* c  p         break;& t2 b4 B. ?: V
       end;
# o3 i1 E7 |- V* N1 z       Move(Buff[26],Buff[0],NETBUFF_SIZE-(i+1)*26);
+ w: x2 p5 z$ p8 d' O8 G     end;" P8 L  u( P  H% W" m
   end7 M1 X$ ]0 t, E% g' P" f! N
   else% c0 h" G$ x5 d5 V" ~$ g
     Result:=false;- J4 Z/ S2 d" J& M  w
  finally& O% L5 {5 _7 {9 `3 K2 Z
    FreeLibrary(DllHandle);
1 r, P" K7 x; D  end;
% k" i" |4 k2 y2 l+ H  qend;
. I! a6 P+ R1 N3 \* T</P>




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