1

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

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

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

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

这也不起作用。即使是硬编码值。原因是它给了我一个关于没有名称为“Credentials”或“Presist”的参数的错误,尽管已经尝试在安装了所有 Windows 更新的 Windows Server 2008 R2 上运行它。我什至在服务器和我的本地计算机上运行了 $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")

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

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

在vm上远程运行脚本的功能

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”它就会在列表中显示它,但是如果我去我的电脑驱动器不在那里,我的任何功能都无法达到它。

4

2 回答 2

0

您应该能够通过以下方式连接驱动器:

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

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

于 2013-08-28T10:36:02.290 回答
0

我也遇到过同样的问题。我的 Invoke-VMScript 不工作。在深入研究之后,我发现我的 vCenter 服务器(在我的情况下是目标服务器)具有 ipv6 配置。我删除了 ipv6 配置并将其更改为 ipv4 配置。

我的问题得到了解决。

于 2015-03-11T11:05:32.593 回答