【发布时间】: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-PSDriveis a known bug 使用 PowerShell v2。我认为您的WScript.Network方法中的变量存在范围问题,但不能确定。 -
我所有的变量都是从一开始就定义为全局变量,我只将它们作为全局变量调用。不仅如此,无论我在脚本的哪个位置调用他们打印的变量。实际上,还有另一件事会让您感到困惑:如果我在调用 WScript.Network 对象之前以纯文本形式打印出变量 $global:username 和 $global:password 那么它不会给我关于我的凭据错误的错误,即使它不起作用。
标签: windows powershell com powercli