在不同域上的远程计算机上读取文本文件

时间:2014-01-12 10:26:59

标签: vbscript automation windows-xp wmi

我的下面代码是在服务器(\\10.0.1.22\C$\Logs\text.txt

的文本文件中查找单词

对于用户:SBICAD\user其工作正常。 (SBICAD是服务器中的域名)

对于用户:ThisComputer\user它失败(“登录失败:未知用户名或密码错误”)

Error message: Logon failure: unknown user name or bad password

注意:我在本地机器XP上运行脚本。 Server 2003和Local Machine XP位于同一网络中。

dim objService 
Set objShell = CreateObject("WScript.Shell")
strComputer = "10.0.1.22" 
strDomain = "SBICAD"
Const WbemAuthenticationLevelPktPrivacy = 6

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, _
  "root\cimv2:Win32_LogicalDisk='c:'", _
  "administrator", _
  "jan@2014", _
  "MS_409", _
  "ntlmdomain:" + strDomain)

objSWbemServices.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy
Const ForReading = 1
Const ForWriting = 2

Set objFSO = CreateObject("Scripting.FileSystemObject")

strFilePath = "\\" & strComputer & "\C$\Logs\text.txt"
Set objTextFile = objFSO.OpenTextFile(strFilePath , ForReading)

Do Until objTextFile.AtEndOfStream
  CurrentLine= objTextFile.ReadLine
  if ((InStr(1, CurrentLine, "James", 1) > 0) And (InStr(1, CurrentLine, "John", 1) > 0) )Then 
    Wscript.Echo "James and John Found"
  end if
Loop

objTextFile.Close

1 个答案:

答案 0 :(得分:1)

您的问题有点不清楚,因为您发布的代码第26行无法引发您所描述的错误。

但是,假设我正确理解了您的问题,问题是当您尝试使用本地计算机上的本地用户对远程服务器进行身份验证时,ConnectServer会引发错误。这不起作用,因为主机A上的本地用户在远程主机B上是未知的,因此无法在那里进行身份验证:

Authentication with local user on source host fails.

您需要两个主机上都知道的用户(域名提供者):

Authentication with domain user works.

或远程主机B上的本地用户:

Authentication with local user on destination host works.


说到这一点,你为什么要首先建立一个WMI连接?您永远不会在代码中的任何位置使用它,也不会验证您实际尝试使用的SMB连接。 SMB连接(访问文件共享)必须通过身份验证in a different way

Set net = CreateObject("WScript.Network")

username   = "user"  'domain user or user on the remote host!
password   = "pass"
drive      = "S:"
remotePath = "\\" & strComputer & "\C$\Logs"

net.MapNetworkDrive drive, remotePath, False, username, password

然后你可以在远程位置上读取文件,如下所示:

Set objTextFile = objFSO.OpenTextFile("S:\text.txt")

Do Until objTextFile.AtEndOfStream
  ...
Loop

objTextFile.Close

完成后,您可以删除网络驱动器,如下所示:

net.RemoveNetworkDrive drive, True

请注意,用户帐户必须具有远程主机的管理权限才能访问管理共享C$。创建一个允许非管理员访问日志目录的专用共享可能是个好主意。