gpt4 book ai didi

file - 尝试使用 WMI 将文件从一台 XP PC 复制到另一台 PC,因为 RPC 和 UNC 不可用

转载 作者:行者123 更新时间:2023-12-01 01:16:33 25 4
gpt4 key购买 nike

我是 VBScript 的新手。我找不到在 VBS 中使用 WMI 将文件从一台 XP 主机复制到另一台主机的方法。复制文件的常用方法(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

最佳答案

我了解到 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"

您需要四样东西才能使用以下所有 scriptlet,它们相互构建以使用 psexec 在远程主机上运行“普通”VBScript 或批处理脚本:
  • 远程主机的管理员权限;
  • 在远程主机上启用 WMI
  • 您的远程主机可以访问的网络共享(使用 RPC、UNC、FTP 等,但不是 DFS!(“分布式文件系统” - 请参阅注释);和
  • psexec.exe 和网络共享上的“普通”脚本。

  • 重要提示:不是 使用 DFS来图网络共享!它 如果您将分布式文件系统用于网络共享,则失败。根据您的尝试方式,您可能会得到的错误代码是 "System error 1312" ,无论您使用哪种操作系统(例如 XP、Win 7)。

    当远程主机上的 RPC 不可用而 WMI 可用时,以下方法将在远程主机的 c:\temp 文件夹中创建一个本地 ASCII 文件,其中包含文本“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

    你完成了。您已成功映射驱动器,针对远程主机运行例程脚本,并上传其输出。

    请注意,此方法也适用于带有 UAC 的 Windows 7 和 Windows 2008。

    这是完整的“示例”集成脚本。随意提出修复、改进等建议。
    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

    关于file - 尝试使用 WMI 将文件从一台 XP PC 复制到另一台 PC,因为 RPC 和 UNC 不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11769129/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com