



看看這個,就明白了,不要再刪除了% g8 j- y8 r9 T- ]
嗨,WW。我可以回答您的问题,是的,可以。WMI 和 ADSI 都提供了一种使用替代安全凭据运行脚本的方法;即它们都允许您指定运行脚本使用的用户名和密码。此外,这两种技术都提供了一种方法,确保加密此用户名和密码并且不 使用明文在网络中传递用户名和密码。感谢您提出这个问题,希望这会对您有所帮助。
8 u( j* ?% J& u* I0 b
- R5 J4 q& ~1 u# u3 c9 k嗨,我是在开玩笑!您真正想知道的可能是如何 使用替代安全凭据来运行脚本。让我们先看一个 WMI 脚本,它连接到远程计算机(“atl-ws-01”),并获取该计算机上安装的操作系统名称。另外,使用“Administrator”帐户来运行此脚本,在此示例中,该帐户具有密码“4rTGh2#1”:8 _# f, S+ P7 d8 s5 }. B
5 {" D6 v) Q: x# c+ c4 j' d* H' p+ m/ E
Const WbemAuthenticationLevelPktPrivacy = 6: i2 ]' x5 L0 p" Z5 `% \5 k. i
+ U& J# }/ }0 q3 }! {strComputer = "atl-ws-01"
0 q5 u) z# a0 o% G5 sstrNamespace = “root\cimv2”
2 c" h# a% v1 hstrUser = "Administrator"2 H: ^, a4 p2 d0 n% X% `
strPassword = "4rTGh2#1"/ K* d& \( I3 A" P& ]% A, _
; z) N% _+ _3 d) q( p0 X- vSet objWbemLocator = CreateObject("WbemScripting.SWbemLocator")
! u8 o% u0 o9 v. z8 `1 [) ASet objWMIService = objwbemLocator.ConnectServer _
* ]# x4 P7 S% P% Z9 T3 S (strComputer, strNamespace, strUser, strPassword)1 l# _/ Q u, p$ t8 q! X
objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy
" i6 h& o4 `' E1 j" e0 B G* v6 Q: K/ B% o& t" ~8 V
Set colItems = objWMIService.ExecQuery _
: {8 R1 v; Z# T$ Z4 E3 F. R ("Select * From Win32_OperatingSystem")
+ i" ~: V+ h6 s+ U2 E- ^For Each objItem in ColItems4 P" N, z/ h7 D3 G
Wscript.Echo strComputer & ": " & objItem.Caption
& ^1 y1 o7 d3 N: D/ y+ q4 VNext
, \8 _) b+ w6 f; M9 F8 I. t/ o$ D: L) T3 A' @: L. y+ t D
正如您所看到的一样,我们先创建一个名为 WbemAuthenticationLevelPktPrivacy 的常量,并为其分配值 6;该值将用于加密我们的计算机和远程计算机之间的通讯。然后,我们定义四个变量:strComputer、strNamespace、strUser 和 strPassword。这些变量用来存储远程计算机的名称、我们要连接到的 WMI 命名空间、运行脚本使用的用户帐户以及该用户帐户的密码。
$ x& P1 a, f+ P7 V g
$ X$ W& _7 k/ @+ a现在,我们就可以使用这些替代凭据连接到远程计算机了。这就是以下几行代码所完成的操作:
3 g5 A) M2 V! H4 _" y, Y
0 F- P6 `" k% A/ D. L) s* e. `Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator"), A* s8 b+ D! h! l! T- C8 Y; I
Set objWMIService = objwbemLocator.ConnectServer _4 G3 \: ? } d4 P1 m
(strComputer, strNamespace, strUser, strPassword)( ? U; n) R" a6 v
objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy* ]) d* K4 z1 O8 Q& e
' ^3 Y: T/ b0 P& _. P' q
我们先创建一个 SWbemLocator 对象实例,然后调用 ConnectServer 方法。我们为 ConnectServer 传递了四个参数,它们恰好对应于刚才创建的四个变量。然后,我们将“Security_authenticationLevel”属性设置为 WbemAuthenticationLevelPktPrivacy,以使两台计算机之间的连接更加安全。. O4 a! ~" q4 l4 @6 s" S) O
$ _/ h$ A* J5 a, R, d2 N- b3 y
从现在开始,代码的其余部分与您所熟知并喜爱的旧 WMI 代码完全相同。
& D i! H5 |- [! A. S
3 s7 e. Q) |+ ]; p0 f一个重要的注意事项:此方法(使用替代凭据来运行脚本)只 适用于远程计算机。由于某种原因,WMI 不允许在您自己的计算机上使用替代凭据来运行脚本。让我们解决这个问题。5 X8 w' P" h# f/ u. M( d2 [" P% ]7 a0 C
8 A L& d1 h- L0 U- s现在,让我们看一下此脚本的 ADSI 版本。此示例脚本绑定到 Active Directory 中的 Ken Myer 用户帐户,并告诉我们是否禁用了此帐户。此脚本使用“fabrikam\Administrator”连接到 Active Directory,该帐户的密码是“4rTGh2#1”:
4 b6 n% X; V2 B; Y. J8 }. N% g1 B8 x
Const ADS_SECURE_AUTHENTICATION = 1
7 Y* X- D7 m" y& DConst ADS_USE_ENCRYPTION = 2
) |! V; r$ ~( y" g
3 u) ~% n. `6 H. S( Z" DstrPath = "LDAP://cn=kenmyer,ou=Finance,dc=fabrikam,dc=com"2 Q1 n2 i, N% I8 k' t& O* s( ~
strUser = "fabrikam\Administrator"
8 X% N8 X+ B5 E; IstrPassword = "4rTGh2#1"4 [+ f' q5 r) O* P0 X; s! K0 _4 q |
6 f) z3 R9 E" q7 L& v1 C0 dSet objDSO = GetObject("LDAP:")
% Y" V' E3 _0 m! ]3 NSet objUser = objDSO.OpenDSObject _: j% ^# B! p( N0 A: ~; H8 s
(strPath, strUser, strPassword, _
: e+ U5 N" {5 N. ?9 W ADS_USE_ENCRYPTION AND ADS_SECURE_AUTHENTICATION)
9 j% }" H. ^ c7 A. H" M: M6 S
, e' q2 }5 W% E% u. r4 GWscript.Echo objUser.AccountDisabled
% y% R- z) Q1 v( [, ?1 X9 X2 W* V5 B
在此脚本中,我们创建了两个常量(ADS_SECURE_AUTHENTICATION 和 ADS_USE_ENCRYPTION),以确保加密在计算机和域之间传递的信息。然后,我们创建三个变量:strPath、strUser 和 strPassword;这些变量存储要绑定到 Active Directory 的对象(此处为 Ken Myer 用户帐户)的 Active Directory 路径、连接到 Active Directory 时要使用的帐户名称以及该帐户的密码。5 ~- z+ O K5 b* c* p1 J
) I! v+ i8 b. T& `2 ^ ~1 p8 T
然后,我们绑定到 LDAP 提供程序;我们从此处入手的原因是,LDAP 提供程序接受匿名绑定。连接到 LDAP 对象后,我们可以随后调用 OpenDSObject 方法以绑定到 Ken Myer 用户帐户。注意,我们必须为 OpenDSObject 传递四个参数:Active Directory 对象的 Active Directory 路径、连接到 Active Directory 时要使用的用户名称、该帐户的密码以及此前定义的两个常量。与 WMI 相同,在建立连接后,脚本的其余部分与任何其他 ADSI 脚本别无两样。
1 S; u& E( d8 h! v& v* g! I+ [* s1 ]" n: J) b6 m* E: h
顺便提一下,OpenDSObject 还可以用于本地用户帐户;主要差别在于您绑定到 WinNT 提供程序,而不是 LDAP 提供程序(当然了,Active Directory 路径也会有所不同)。以下是用于连接到本地计算机的脚本中的几行相关代码:1 p1 t; ]% ~ X% x. k
+ E1 m: _% L/ O% K3 dstrComputer = "WinNT://atl-ws-01”8 J& i, m# F% n( o
strUser = "Administrator"* o4 @1 a! N, X
strPassword = "4rTGh2#1"
+ U( e5 G n6 U* C$ I/ w# q8 T# d
; q7 f ^0 W/ R% J" j: USet objDSO = GetObject("WinNT:")! L* }3 p6 L2 c
Set objComputer = objDSO.OpenDSObject _- P0 b! ~) w% n: r/ T9 y
(strComputer, strUser, strPassword, _3 i0 B+ N8 T" R+ c
ADS_SECURE_AUTHENTICATION AND ADS_USE_ENCRYPTION)5 F+ _7 N" h+ r) p4 ]0 ^2 j" @2 o
& f% k; p3 b A6 N# o- ^$ \, x我还要补充一句,我们建议您不要在脚本中硬编码密码(尤其是 Administrator 密码)。而应该考虑将密码作为命令行参数输入,或者通过输入框输入密码,也可以使用任何适用的方法进行输入。