试图从一个XP PC拷贝文件到另一个使用WMI,因为RPC和UNC不可用(Trying to cop

2019-06-17 14:50发布

我是新来的VBScript。 我不能找到一种方法,从一个XP主机在一个VBS文件复制到另一个使用WMI。 复制文件(RPC - 远程过程调用,SMB,UNC)通常使用的方法是不提供给多个主机,但WMI是提供给所有的主机,我需要从我的管理主机的文件复制到目标Windows主机。 我想我会找到一些示例代码在那里,但我发现它没有任何信息。 有没有发现什么告诉我,它无法做到的,无论是。

源文件是在我的管理电脑的“F:\ TEMP”的可执行文件和“test1.txt的”文件夹。 我希望把这些文件远程主机上HOST1的“C:\ TEMP”文件夹。 我有两个主机完整的管理权限。 这里是我到目前为止,只为一个文件(为了保持测试简单):

strComputer = "HOST1"
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery( _
    "Select * from Win32_Directory where Name = 'c:\\temp'")
For Each objFiles in colFiles
    errResults  = objFolder.Copy("f:\temp\test1.txt")
    Wscript.Echo errResults
Next

Answer 1:

我了解到,WMI不能在远程主机上创建的文件,它不能在网络连接复制文件: http://msdn.microsoft.com/en-us/library/windows/desktop/aa389288%28v=vs.85% 29.aspx

但是,它可以运行CMD进程。 这里是弗兰克·怀特的代码在C调,其次是他的榜样: https://stackoverflow.com/a/8913231/1569434

InputParameters("CommandLine") = "cmd /c echo myFTPCommands > c:\ftpscript.txt"

您将需要四样东西使用下面所有的小脚本,它建立在相互使用PSEXEC运行远程主机上的“正常”的VBScript或批处理脚本:

  1. 在远程主机上的管理权限;
  2. 在远程主机上启用WMI
  3. 网络共享(使用RPC,UNC,FTP等,但不是 DFS(“分布式文件系统” -见注),你的远程主机可以访问;!和
  4. psexec.exe和网络共享你的“正常”的脚本(S)。

重要提示: 不要使用DFS来映射网络共享! 如果你使用分布式文件系统为您的网络共享失败。 你可能会因错误代码你如何试图为“系统错误1312” ,无论是操作系统(例如,XP,Win 7的),你用哪个。

当RPC无法使用远程主机上,但WMI是,那么下面的方法将创建远程主机的C的局ASCII文件:\ temp文件夹,包含文本“myTextCommands”,不带引号。

' https://stackoverflow.com/questions/8884728/wmi-remote-process-to-copy-file
strCommand = "cmd /c echo myTextCommands > c:\temp\testscript.txt"
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
Set objProcess = objWMIService.Get("Win32_Process")
errReturn = objProcess.Create(strCommand, null, null, intProcessID)
' See following link for error codes returned by errReturn
' http://msdn.microsoft.com/en-us/library/windows/desktop/aa389388(v=vs.85).aspx

请注意在上面的脚本中重要的限制:它只能建立一个ASCII文件 - 而不是二进制。

让我们用这种技术来映射一个驱动器号:

strCommand = "cmd /c net use z: " & MyShare & " /user:%USERDOMAIN%\%USERNAME% " _
    & strPassword & ">" & strRemoteLog
Set objProcess = objWMIService.Get("Win32_Process")
Call errProcess

其中“strRemoteLog”被设置为类似“C:\ TEMP \ MyLog.txt”,“strPassword”被提示(查看完整脚本实例,并在底部参考),以及“errProcess”是使用运行下列处理的子程序上述 “CMD / C” 特技提到:

Sub errProcess
errReturn = objProcess.Create(strCommand, null, null, intProcessID)
If errReturn = 0 Then
    Wscript.Echo "Process was started with a process ID: " & intProcessID
    WScript.Sleep 5000
Else
    Wscript.Echo "Process could not be started due to error: " & errReturn
End If
End Sub

随着网络驱动器映射,你的脚本复制到主机:

strCommand="cmd /c xcopy Z:\scripts\SCRIPT1.bat c:\temp\ >>" & strRemoteLog
Call errProcess

SCRIPT1.bat准备,所以在远程主机上启动PSEXEC反对,通过你的脚本,将较早获得,在这里例如一个变量strUserID:

strCommand="cmd /c Z:\psexec \\%COMPUTERNAME% /accepteula -s -n 120 " _
    & cmd /c c:\temp\SCRIPT1.bat " & strUserID & ">>" & strRemoteLog
Call errProcess

一旦完成PSEXEC,你可能希望保存的结果。 所以你重命名日志文件,上传,取消映射驱动器,并清理残留文件:

strCommand="cmd /c REN " & strRemoteLog & " SCRIPT1-%COMPUTERNAME%.txt"
Call errProcess
strCommand="cmd /c MOVE /Y c:\temp\SCRIPT1*.txt Z:\scripts\LOGS\"
Call errProcess
strCommand="cmd /c net use * /del /Y"
Call errProcess
strCommand="cmd /c del c:\temp\SCRIPT1*.bat /q"
Call errProcess

你完成了。 您已经成功地映射驱动器,请对远程主机的程序脚本,并上传其输出。

注意:此方法也适用于Windows 7和Windows 2008与UAC。

下面是完整的“样本”集成脚本。 随时提出修正,改良等

On Error Resume Next

 MyShare="\\SHARE1"
 strRemoteLog="c:\temp\MapZ.txt"

' Set remote hostname
strComputer="HOST2"
'strComputer = InputBox("Enter Computer name", _
'"Find PC", strComputer)

' Set remote userid
strUserID="USERID1"
'strComputer = InputBox("Enter userid", _
'"Find User", strComputer)

' Enumerate cimv2 on remote host strComputer
Set objWMIService = GetObject("winmgmts:" & _
"{impersonationLevel=Impersonate}!//" & strComputer & "\root\cimv2")

' Verify remote host exists on domain
If( IsEmpty( objWMIService ) = True ) Then
    WScript.Echo( "OBJECT_NOT_INITIALIZED :: " & strComputer )
    WScript.Quit( OBJECT_NOT_INITIALIZED )
End If

' Prompt for masked password
strPassword=GetPass

' Build and run command to execute on strComputer
strCommand = "cmd /c net use z: " & MyShare & " /user:%USERDOMAIN%\%USERNAME% " & strPassword & ">" & strRemoteLog
Set objProcess = objWMIService.Get("Win32_Process")
Call errProcess

' Copy script(s) from MyShare to HOST2 since psexec cannot run scripts on shared drives
strCommand="cmd /c xcopy Z:\scripts\cleanpclocal.bat c:\temp\ /V /C /I /Q /H /R /Y>>" & strRemoteLog
Call errProcess

' Change directory to c:\temp
'strCommand="cmd /c cd c:\temp>" & strRemoteLog
'Call errProcess

' Start PSEXEC against script
strCommand="cmd /c Z:\psexec \\%COMPUTERNAME% /accepteula -s -n 120 cmd /c c:\temp\cleanpclocal.bat " & strUserID & ">>" & strRemoteLog
Call errProcess

' Rename logfile to include hostname, upload to share,  unmap networked drive, and delete script
strCommand="cmd /c REN " & strRemoteLog & " cleanpc-%COMPUTERNAME%.txt"
Call errProcess
strCommand="cmd /c MOVE /Y c:\temp\clean*.txt Z:\scripts\LOGS\"
Call errProcess
strCommand="cmd /c net use * /del /Y"
Call errProcess
strCommand="cmd /c del c:\temp\clean*.bat /q"
Call errProcess

WScript.Quit





' ***********
' APPENDIX
' Subroutines, functions
' ***********

' **SUBROUTINES**
'strCommand="cmd /c dir z:\scripts\>" & strRemoteLog ' Works to get dir of z:\scripts\

' Function to handle errReturn
Sub errProcess
WScript.Echo "strCommand=" & strCommand
errReturn = objProcess.Create(strCommand, null, null, intProcessID)

If errReturn = 0 Then
    Wscript.Echo "Process was started with a process ID: " & intProcessID
    WScript.Sleep 5000
Else
    Wscript.Echo "Process could not be started due to error: " & errReturn
End If
WScript.Echo

' Error return codes for Create method of the Win32_Process Class
' http://msdn.microsoft.com/en-us/library/windows/desktop/aa389388(v=vs.85).aspx
' 0=Successful Completion
' 2=Access Denied
' 3=Insufficient Privilege
' 8=Unknown failure
' 9=Path Not Found
' 21=Invalid Parameter

End Sub



' **FUNCTIONS**

' Subroutine to get masked password
Function GetPass
' Mask Passwords Using Internet Explorer
' Ensure you follow the technet.com instructions and create file password.htm
' http://blogs.technet.com/b/heyscriptingguy/archive/2005/02/04/how-can-i-mask-passwords-using-an-inputbox.aspx

Set objExplorer = WScript.CreateObject _
    ("InternetExplorer.Application", "IE_")

objExplorer.Navigate "file:///C:\SCRIPTS\password.htm"   
objExplorer.ToolBar = 0
objExplorer.StatusBar = 0
objExplorer.Width = 400
objExplorer.Height = 350 
objExplorer.Left = 300
objExplorer.Top = 200
objExplorer.Visible = 1             

Do While (objExplorer.Document.Body.All.OKClicked.Value = "")
    Wscript.Sleep 250                 
Loop 

strPassword = objExplorer.Document.Body.All.UserPassword.Value
strButton = objExplorer.Document.Body.All.OKClicked.Value
objExplorer.Quit
Wscript.Sleep 250

If strButton = "Cancelled" Then
    Wscript.Quit
'Else
'    Wscript.Echo strPassword
End If

' Return the password
GetPass = strPassword

End Function


Answer 2:

首先,我觉得有一个在你的代码中的错字,你已经写了:

errResults  = objFolder.Copy("f:\temp\test1.txt")

我觉得你的意思:

errResults  = objFiles.Copy("f:\temp\test1.txt")

其次,我不知道,如果你想要做什么是可能的。 我想你已经得到了代码可能从目录在远程计算机上的文件复制到另一个目录在远程计算机上。

对于虽然解决办法,如果WMI可远程使用的所有计算机,这意味着,至少一个端口是开放的。 如果是这样的话,还有没有其他的端口是开放的? 如果是这样,也许你可以设置端口X您的管理主机上的FTP服务器,然后让其他主机通过自动XP默认的FTP客户端发送的文件。



Answer 3:

我知道这个问题是旧的,但碰到的是当我试图找到这样想通将人们引向一个答案我写了并张贴在这里的解决方案:

.NET -复制整个LAN的可执行到另一台计算机,并执行该

总之,可以使用WMI回声的任何文件的base64转换(包括一个exe),然后将其与的certutil解码。



Answer 4:

你试过以下?

set fso = CreateObject("Scripting.FileSystemObject")
fso.CopyFile "f:\temp\test1.txt", "\\HOST1\C$\temp\test1.txt", true


Answer 5:

WMI是信息的数据库。 你不能用它来复制文件。



文章来源: Trying to copy file from one XP PC to another using WMI, since RPC and UNC are not available