【问题标题】:Remotely mounting network drives not working远程安装网络驱动器不起作用
【发布时间】:2013-08-31 00:26:47
【问题描述】:

就是这样,我受够了,我在过去的 16 个小时里一直在努力解决这个问题,但在完成之前我无法入睡,请有人帮帮我!

我正在编写一个脚本来自动在虚拟机上安装一个软件,它使用 PowerCLI 和 PowerShell 连接到多个虚拟机,并将我的 PowerShell 脚本复制到所有虚拟机并运行该脚本。该脚本安装一个网络驱动器,复制一些文件,然后运行安装程序(稍后还会进行一些验证)。好吧,它应该安装一个网络驱动器,问题是它没有。

我尝试过 net use 无济于事,即使我对某些内容进行硬编码并且 net use 在列表中显示驱动器,我也无法访问它。

net use z: $global:NetDir /user:domain\$global:username $global:password

这不起作用。我也尝试过使用硬编码值,虽然它们确实有效,但我的下一个功能无法访问驱动器。如果您知道如何使其工作,请告诉我。

我也试过PowerShell方法New-PSDrive

New-PSDrive -Name "z" -PSProvider FileSystem -Root $global:NetDir -Credential $creds -Persist

这也不起作用。即使是硬编码值。原因是即使it clearly does 我已经尝试在安装了所有 Windows 更新的 Windows Server 2008 R2 上运行它,但它给了我一个关于没有名称为“凭据”或“Presist”的参数的错误。我什至在服务器和我的本地计算机上运行了 $psversiontable.psversion 和 $host.version,这在 PS2 和 PS3 上都给出了相同的错误。再次,如果有人有任何线索,请,请,请告诉我。

最后,你会认为这是我的专长,是久经考验的真正 WScript.Network 对象,但可惜这也失败了,这在很大程度上是我睡眠不足的原因。

$net = new-object -ComObject WScript.Network
$net.MapNetworkDrive("z:", "$global:NetDir", $false, "domain\$global:username", "$global:password")

这是关于这个的事情,它的行为非常奇怪,但如果我将值硬编码到其中,我可以让它工作,但只有在 VM 上手动运行我的 ps1 脚本时,使用 Invoke-VMScript 不起作用,也不会调用运行它的 ps1 文件,它会运行该函数并告诉我凭据错误(即使在我使用它们连接到网络之前一秒钟)。

我已经无计可施了,我无处可求助,请帮助我! 根据请求,我正在添加脚本的一些额外部分,脚本本身有几百行长,而且我知道其中大部分都可以工作,所以我不想用数千行代码向这个地方发送垃圾邮件。

在虚拟机上远程运行脚本的功能

function RunScript {
try
{
$Installer = "&`"c:\VM scripts\STAP Install\installer.ps1`""
$global:vmworklist |foreach-object {
Invoke-VMScript -ScriptText ($Installer) -VM "$_" -HostUser "$global:username" -HostPassword "$global:ViPassword" -GuestUser "encore\$global:Eusername" -GuestPassword "$global:Epassword" -confirm -ScriptType PowerShell
}
}
catch
{
write-host "Could not execute the script"
Write-Host "Returned:" $_.Exception.Message
}
}

复制脚本的函数

function CopyScript {
    $global:vmworklist |foreach-object {
net use * /delete /y > $null
net use y: \\$_.guard.swg.usma.ibm.com\c /user:encore\$Eusername $Epassword
if (Test-Path "y:\VM scripts")
     {
        Remove-Item "y:\VM scripts\" -recurse
     }
} 
try
    {        
    write-host
    $global:vmworklist |foreach-object {
    Copy-VMGuestFile -source "C:\tools\VM\" -destination "c:\" -VM $_ -HostUser "$global:username" -HostPassword "$global:ViPassword" -GuestUser "encore\$global:EUsername" -GuestPassword "$global:Epassword" -confirm -localtoguest
    }
    }
catch
    {
    write-host "Could not copy over the files"
    Write-Host "Returned:" $_.Exception.Message
    }
}

稍微解释一下,即使 VMWare API 声明 Copy-VMGuestFile 应该默认覆盖所有内容,但它没有,并且没有启用它的开关,因为我必须检查文件是否存在以及是否他们确实会删除它们,否则我会收到错误消息,并且不会传输最新版本的代码。为此,我将 VM 的 C 驱动器作为共享驱动器安装在运行此 PowerCLI/PowerShell 脚本的本地计算机上。在本地运行 net use 时,它​​确实有效,当我通过远程桌面登录 VM 并在那里运行我的 ps1 脚本时,这同样适用。问题是,当我通过我的 powershell 脚本在我的 VM 上运行 net use 时,powershell in 表示它成功,如果我有它,只需写出“Net Use”它就会在列表中显示它,但是如果我去我的电脑驱动器不在那里,我的任何功能都无法到达它。

【问题讨论】:

  • 展示你的整个脚本并解释你是如何运行它的(远程?本地?PSRemoting 还是 PSExec?)。单行并不能让人们继续前进。
  • 我确实有两个脚本,一个通过 PowerCLI 在我的机器上本地运行并使用 VMware API,另一个使用直接的 powershell 在 VM 上本地运行。我上面发布的所有行都来自第二个脚本。我运行它的方式是使用 VMWare VPI 将第二个脚本从本地计算机复制到 VM,我可以确认副本工作正常,如果有点慢,然后我只需执行脚本。有一个命令 (Invoke-VMScript) 可以远程启动应用程序和脚本,因此从技术上讲,这两个脚本都在各自的机器上本地运行。
  • 真正远程的只有 vSphere 管理(工作正常)和虚拟机中 ps1 脚本的执行。
  • Credentials not working with New-PSDrive is a known bug 使用 PowerShell v2。我认为您的 WScript.Network 方法中的变量存在范围问题,但不能确定。
  • 我所有的变量都是从一开始就定义为全局变量,我只将它们作为全局变量调用。不仅如此,无论我在脚本的哪个位置调用他们打印的变量。实际上,还有另一件事会让您感到困惑:如果我在调用 WScript.Network 对象之前以纯文本形式打印出变量 $global:username 和 $global:password 那么它不会给我关于我的凭据错误的错误,即使它不起作用。

标签: windows powershell com powercli


【解决方案1】:

您应该可以使用以下方式连接驱动器:

$params = 'use', 'z:', "$global:NetDir", "/user:domain\$global:username",
          "$global:password"
net @params

如果您在连接后无法访问驱动器,则需要提供更多详细信息(尤其是您遇到的错误)。 “不起作用”是一个不充分的问题描述。

【讨论】:

  • “不工作”是指我的下一个命令看不到驱动器的事实,错误确实只是说“复制项目:找不到驱动器。名称为 ' 的驱动器z' 不存在。 + CategoryInfo : ObjectNotFound: (z:String) [Copy-Item], DriveNotFoundException + FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell .Commands.CopyItemCommand" 我将尝试您现在发布的内容,看看是否可以工作。
  • net @params 返回 params 不是可识别的 cmdlet 的错误 :(
  • @MichaelRabinovsky 抱歉,我在第一行有错字。它必须是$params,而不是params。请再试一次。该代码应在 PowerShell v2 和 v3 中运行。
【解决方案2】:

我也遇到过同样的问题。我的 Invoke-VMScript 不工作。在深入研究之后,我发现我的 vCenter 服务器(在我的例子中是目标服务器)具有 ipv6 配置。我把 ipv6 配置去掉了,改成 ipv4 配置。

我的问题得到了解决。

【讨论】:

    猜你喜欢
    • 2014-06-23
    • 2017-01-06
    • 2019-07-30
    • 2018-08-27
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    相关资源
    最近更新 更多