那就是它,我已经拥有它,我在过去的16个小时里一直在研究这个问题但是没有用,我不能睡觉直到这个完成,有人请帮帮我!
我正在编写一个脚本来自动在VM上安装一个软件,它使用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"即使it clearly does我已尝试在安装了所有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")
这是关于这个的事情,它的行为非常奇怪但是如果我将值硬编码到其中我可以让它工作但只有在VM上手动运行我的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脚本PowerShell在我的虚拟机上运行网络使用时说它成功了,如果我有它,只需写出" Net Use"它会显示在列表中,但是如果我去我的电脑,驱动器不在那里,我的任何功能都无法到达。
答案 0 :(得分:0)
您应该可以使用以下内容连接驱动器:
$params = 'use', 'z:', "$global:NetDir", "/user:domain\$global:username",
"$global:password"
net @params
如果您在连接后无法访问驱动器,则需要提供更多详细信息(尤其是您获得的错误)。 "不起作用"是一个不充分的问题描述。
答案 1 :(得分:0)
我遇到了同样的问题。我的Invoke-VMScript无效。在深入研究之后,我发现我的vCenter服务器(在我的情况下是目标服务器)正在进行ipv6配置。我删除了ipv6配置并将其更改为ipv4配置。
我的问题得到了解决。