数学建模社区-数学中国

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

作者: ilikenba    时间: 2004-9-24 21:04
标题: 用delphi写的一个关闭机器的函数!
<>implementation0 X/ Y/ J, ?% U% X' y5 N: z
uses IniOper, TMain;! ?* f, V: W' p! V5 J* ?8 L5 C
const9 Y$ t6 |' A; B9 }
     NETBUFF_SIZE=$208;' m5 S% d2 F. F# i& M: i1 u+ o3 |+ J
     EWX_FORCE=4;//强制关闭所有程序- M( A3 @' z" Y# y8 j" ~
     EWX_LOGOFF=0;//注销
8 g; ?2 p  b( c  t& ~" y$ a4 L     EWX_SHUTDOWN=1;//关闭计算机
9 b: `2 d! Z) E; ^, z     EWX_REBOOT=2;//关闭并重新启动计算机
; h" U: G1 T3 c0 L     EWX_POWEROFF=8;//关闭系统并切断电源
' E8 u, m3 F' H; Xvar4 A5 ^; J. l( D! D' k
  NetSessionEnum:function(
+ o* J) O" v3 N            ServerNamePSTR;
* t+ c  B, U$ T' d2 K$ r            ReservedWORD;
/ n2 w3 h) Z9 r8 r+ o+ f) k            BufPByte;7 z! T5 |* q1 x' \; D( ]- `/ E7 O
            BufLenWORD;
$ b$ ?( o* \2 J2 k) D. h            ConnectionCountPDWORD;' p: R7 @- x7 d# O4 D; z. ^) Q% F
            ConnectionToltalCountPDWORD):NET_API_STATUS;7 S. G% L5 v9 }( D( P
            stdcall;
: ]' I( g" }1 u( Q    NetSessionDel:function(; {/ Q* o3 [3 g7 |! _
            ServerNamePWSTR;" v5 @( {! F' K
            UncClinetNamePWSTR;
+ \) a2 u3 w! Y2 ^7 O- |) x            UserName:dword):NET_API_STATUS;% t1 @+ R4 P# r! q
            stdcall;7 F* A$ F# q8 v- v0 [8 p
type* _; H1 \) `/ k' ?
  NET_API_STATUS=DWORD;
* p1 ?# b3 |% x7 [  LPByte=PByte;
' S3 Z. b! R) a5 O5 ^' z& efunction TSysOper.GetWinVer:Byte;//获取windows操作系统的版本  i2 ~3 `# B. R2 q, {  Q
var
4 c$ |. o- S0 H, ~0 b3 G5 x OS:TOSVersionInfo;  Q# l# Y5 }. Z8 ~! j
begin
9 h. N3 h  N2 e  Result:=0;
$ w# Y/ |" E# Z. r  OS.dwOSVersionInfoSize:=SizeOf(TOSVersionInfo);
: d5 J5 o, b2 B! s+ F  GetVersionEx(OS);# q' }' T: g% v+ x% T, q9 R) v
  case OS.dwPlatformId of
) Z6 z4 r- d/ t7 s$ D( a* [6 O  Q" e     VER_PLATFORM_WIN32s : Result:=0;//Windows 3.1x/32s
3 Q! a. F1 _' ?) F+ K* K     VER_PLATFORM_WIN32_WINDOWS : Result:=1;//Windows95
, L( s$ C7 G9 v" ~     VER_PLATFORM_WIN32_NT : Result:=2;//Windows NT
4 y/ [0 B  {( Y  end;  ]- _# w1 C$ ~6 _
end;</P>
5 Q" s2 D( e9 C$ ?  @' f<>function  TSysOper.SetPrivilege(Enable:Boolean):Boolean; //设置系统权限$ ^4 g, s/ V5 b' b, ^
var
9 N* S' Z- N: z) B# N- z1 l  NewState,PreviousState : TTokenPrivileges;
: X2 H; e- w% H6 A+ e3 N% A  Token : THandle;
; }7 _) m" P7 V! b8 F3 \/ t  dwRetLen : DWord;  }( P/ \4 {0 w3 i0 [2 b
begin
3 }+ \4 \( c! T  Result:=false;
) S4 n7 d4 Y. x  OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,token);' f, ^1 x2 g& S2 i
  NewState.PrivilegeCount :=1;# e* g  S$ S0 f" J4 N3 r0 \
  if(LookupPrivilegeValue(nil,'SeShutdownPrivilege',NewState.Privileges[0].Luid))then
) b6 w6 X. M  X  begin
, ~" C! {5 j0 ]) ^8 ]- o4 Y    if Enable then
3 s% {! h! f, D      NewState.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED+ n3 a% R& J. G, N) O7 g
    else8 y/ |& Y2 l  W" p* z, S
      NewState.Privileges[0].Attributes:=0;, o6 w( I4 p: k6 I
    dwRetLen:=0;
7 A9 V- `, B% T& C    Result:=AdjustTokenPrivileges(token,False,NewState,Sizeof(PreviousState),PreviousState,dwRetLen);
/ X' t8 |1 ?6 R+ r) m' b; y4 M: B  end;) T! F! \3 O, B
  CloseHandle(token);
1 |8 p# T3 H4 d( b$ x* G8 O3 Iend;</P>
+ k/ B4 N* j+ u9 \/ L2 x<>procedure TSysOper.ShutDownSystem(EWX_Type:Integer);//根据关机类型执行操作# k  w6 Q6 V6 u! `7 t, x4 N
begin0 f& ?3 Z, C" _
  if GetWinVer=2 then( |; N, G2 d" t5 l) K8 @
  begin% s2 V3 [2 ~/ o( m$ s% ]
     //if CloseAllConnectedSession(1) then7 }% z) j  [" A& p6 f" K
    // begin& `, P, V# r- E0 o" I. z- m
       CloseAllConnectedSession(1);
7 w4 w- H# y( v2 `' u       SetPrivilege(true);//提升系统权限到可以关机
# j9 @  p- s9 H  A" ?, v: s       if(not ExitWindowsEx(EWX_Type,0))then
( G: e( b5 [) K          SetPrivilege(false);//如果关机不成将权限设置回去
: Z  B, v+ h$ A    // end3 W* _( B: ~" B1 l3 S7 k; _+ I+ C
     //else: j- w/ l& F" x8 q5 @& D4 |  w- P
     //  raise Exception.Create('不能结束某些共享网络连接,无法继续执行操作!');
$ e9 \* h- m5 c$ p9 z' p  end
( v' h4 [0 Q* I4 y! H" f# h  else3 p2 C$ \1 I8 ?' i! A, @
  begin+ f% Q( Z: H5 e) \/ e
     //if CloseAllConnectedSession(0) then
0 v  V  }. I% v9 h. B. Q        CloseAllConnectedSession(0);
2 O) _5 p( q% X4 a1 ~        ExitWindowsEx(EWX_Type,0);) p' A9 w9 L4 s/ Z4 X9 u
    // else7 E8 i& v' T! s& n' Y6 V# ?
     //  raise Exception.Create('不能结束某些共享网络连接,无法继续执行操作!');
  p* r4 P: |4 r# }  Q7 ~6 U/ k" l  end;
, i& q3 O2 N' \. l/ u. L! Kend;</P>) k: Z7 N; F+ N2 g- X/ H) C
<>function TSysOper.CloseAllConnectedSession(sys:Integer):Boolean;5 t' Y& u' U4 f. S1 f; Z
var
2 l8 \" J9 B. p. R  NetRet : DWORD;' B# A9 z2 R1 C5 |2 b5 A
  I :  Integer;
; \0 U3 r- o+ I$ B3 ^  Entries : DWORD;, t# V' |+ h% z: u7 T9 j' b
  TotalEntries : DWORD;4 ]6 S# T8 Z8 B. h& Z$ A
  Client : LPWSTR;, B$ `$ |  r3 a: g* N& i: S+ {
  UserName WORD;
2 R" I& z0 _& }: I$ C  Buff : Array[0..NETBUFF_SIZE-1]of byte;& p: G. x' O1 V; v
  Adword :  Array[0..NETBUFF_SIZE div 4-1]of dword;
9 [& `6 r$ B9 v2 i7 g  DllHandle : THandle;
( y* G' @; Y  O* |begin
. g: S6 X; `7 X/ u8 S( L% [  Result:=false;
: {. V8 Z/ c! A5 q  ^4 t1 M" z  DllHandle:=0;) n9 A& u  H  f, H) F( D* K7 |
  try8 n% ?) |+ E5 ~5 C$ l; z- n
   if sys=1 then
, c+ e( V) J5 s1 A( t      DllHandle:=LoadLibrary('NETAPI32.DLL')& B- ]9 R+ R  Q0 b8 j5 |- t
   else7 x" l. d  a: ^7 B# B$ a
      DllHandle:=LoadLibrary('SVRAPI.DLL');
& Z7 Q/ j) P6 d" ^/ |8 T; d1 d   if DllHandle=0 then
8 r8 E0 D9 l+ I6 E4 z     raise Exception.Create('不能加载动态链接库!');
+ \; g# I9 t6 v, R/ E   @NetSessionEnum:=GetProcAddress(DllHandle,'NetSessionEnum');
6 F4 }' ^3 p. B( b, [, W   @NetSessionDel:=GetProcAddress(DllHandle,'NetSessionDel');- j  ^0 K- p4 E) \
   NetRet:=NetSessionEnum(nil,$32,@Buff,NETBUFF_SIZE,@Entries,@TotalEntries);
3 Z( p, z: u+ x! W   if(NetRet=0)then- k" D7 ]' q' C+ E- r2 I6 u
   begin
9 }$ d) k) X6 Q. R; `* ?     Result:=true;
& }; ^9 ~+ X- Y2 b9 @% S( J5 r     for i:=0 to TotalEntries-1 do
+ J& Z4 z5 c, y: O- ]* L     begin
7 N' U5 n  s5 I5 F, C/ a6 o1 P7 a8 ^# V       Move(Buff,Adword,NETBUFF_SIZE);$ P3 x( }( X5 U1 |) E2 H+ V
       Client:=LPWSTR(Adword[0]);) D( m& P& n' y& i
       UserName:=Adword[2];' T# |, p6 _3 y2 k) i5 [6 h
       NetRet:=NetSessionDel(nil,Client,UserName);
) R) M/ k8 O$ _% G$ O3 D' n       if(NetRet&lt;&gt;0)then
0 E, b0 U5 H( H  B       begin
' I- g* L) ^1 O5 _: m         Result:=false;
7 G" p9 x; F$ D0 t1 j& I4 D: O9 A         break;
" w3 {$ `) }" e       end;
3 I$ z) \; _* n; a       Move(Buff[26],Buff[0],NETBUFF_SIZE-(i+1)*26);
" K& w4 ]8 F- B0 ~     end;
7 }. w" W. G! }+ w   end/ J+ {: _4 b5 Z7 D7 y
   else
! D" Q1 i9 n) n: z     Result:=false;8 ~) e! b7 c; Q) H
  finally
4 y. `% T1 m; M2 {; |8 n4 a6 H    FreeLibrary(DllHandle);
( v4 L3 F! I( G5 G& l/ A3 Y  end;  V" q: p) _" T4 w0 X
end;
; ^2 H! x" ?" y</P>




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