【问题标题】:Unable to pass command properly to remote computers in Powershell无法将命令正确传递给 Powershell 中的远程计算机
【发布时间】:2015-04-15 01:18:40
【问题描述】:

我有一个 Powershell 脚本,当它复制到本地远程服务器并使用 PSExec 远程执行时,它可以正确运行并执行我需要它执行的操作。我试图调整相同的脚本以便能够远程运行,而不依赖于使用 PSExec 远程复制和执行的脚本。它是让 Citrix XenApp 服务器加入其 Farm 的命令。

# Establish Variables
$ZoneName = "MyZone"
$OdbcUserName = "MyCitrixUserAcct"
$OdbcPassword = "MyPassword"
$LicenseServerName = "mylicenseserver.company.com"
$XAConfigConsoleExe = "C:\Progra~2\Citrix\XenApp\ServerConfig\XenAppConfigConsole.exe"
$Servers = Get-Content -path .\serverlist.txt
ForEach ($Server in $Servers)
{
# Creating mf20.dsn File
if ((Test-Path \\$Server\c$\temp\mf20.dsn) -eq $true)
{
remove-item \\$Server\c$\temp\mf20.dsn
}
add-Content \\$Server\c$\temp\mf20.dsn "[ODBC]"
add-content \\$Server\c$\temp\mf20.dsn "DRIVER=SQL Server"
add-content \\$Server\c$\temp\mf20.dsn "DATABASE=MyDB"
add-content \\$Server\c$\temp\mf20.dsn "APP=Citrix IMA"
add-content \\$Server\c$\temp\mf20.dsn "UID="
add-content \\$Server\c$\temp\mf20.dsn "SERVER=dbserver.company.com,1433" 
add-content \\$Server\c$\temp\mf20.dsn "Trusted_Connection=No"

# Setting setup arguments

[Array]$XAArguments = @()

$XAArguments += "/ExecutionMode:Join"
$XAArguments += "/ZoneName:$ZoneName"
$XAArguments += "/ImaWorkerMode:True"
$XAArguments += "/DsnFile:c:\temp\mf20.dsn"
$XAArguments += "/AuthenticationType:Sql"
$XAArguments += "/OdbcUserName:$OdbcUserName"
$XAArguments += "/OdbcPassword:$OdbcPassword"
$XAArguments += "/LicenseServerName:$LicenseServerName"
$XAArguments += "/LicenseServerPort:27000"
$XAArguments += "/LicenseModel:XA"
$XAArguments += "/CustomXMLServicePort:8080"

# running setup with arguments

Invoke-Command -ComputerName $Server {$XAConfigConsoleExe + $XAArguments}
}

我已经尝试了很多不同的排列和组合(即使用 -scriptblock,使用 pssessions)我通过搜索找到的东西。我知道我的命令行很好,因为如果我将 write-host $XAConfigConsoleExe $XAArguments 的输出传递给服务器的 Powershell 控制台,它就可以工作。

我确定我遗漏了一些明显的东西。我没有写原始脚本。我无法捍卫诸如如何构建论点之类的事情,因此,如果有更好(更可靠的方法),那么我在这里所做的事情我对任何想法都持开放态度。

我可以使用 PSExec 远程执行的原始脚本如下所示:

# Establish Variables
$ZoneName = "MyZone"
$OdbcUserName = "MyCitrixUserAcct"
$OdbcPassword = "MyPassword"
$LicenseServerName = "mylicenseserver.company.com"
$XAConfigConsoleExe = "C:\Program Files (x86)\Citrix\XenApp\ServerConfig\XenAppConfigConsole.exe"

# Creating mf20.dsn File
if ((Test-Path C:\temp\mf20.dsn) -eq $true)
{
remove-item C:\temp\mf20.dsn
}
add-Content C:\temp\mf20.dsn "[ODBC]"
add-content C:\temp\mf20.dsn "DRIVER=SQL Server"
add-content C:\temp\mf20.dsn "DATABASE=MyDB"
add-content C:\temp\mf20.dsn "APP=Citrix IMA"
add-content C:\temp\mf20.dsn "UID="
add-content C:\temp\mf20.dsn "SERVER=mydbserver.company.com,1433" 
add-content C:\temp\mf20.dsn "Trusted_Connection=No"

# Setting setup arguments
[Array]$XAArguments = @()

$XAArguments += "/ExecutionMode:Join"
$XAArguments += "/ZoneName:$ZoneName"
$XAArguments += "/ImaWorkerMode:True"
$XAArguments += "/DsnFile:C:\Temp\mf20.dsn"
$XAArguments += "/AuthenticationType:Sql"
$XAArguments += "/OdbcUserName:$OdbcUserName"
$XAArguments += "/OdbcPassword:$OdbcPassword"
$XAArguments += "/LicenseServerName:$LicenseServerName"
$XAArguments += "/LicenseServerPort:27000"
$XAArguments += "/LicenseModel:XA"
$XAArguments += "/CustomXMLServicePort:8080"

# running setup with arguments

& $XAConfigConsoleExe $XAArguments

【问题讨论】:

  • 你试过Invoke-Command -ComputerName $Server $XAConfigConsoleExe -ArgumentList $XAArguments吗?
  • 我试过了,但它出错了。 Invoke-Command : Only PowerShell script files are allowed for FilePath parameter. Specify a file with .ps1 extension. Parameter name: filePath。所以该方法不适用于调用不是 .PS1 的东西。

标签: powershell citrix xenapp


【解决方案1】:

我已编辑此答案以反映我的脚本的最终版本 一起去了。我没有改变任何逻辑或方法。我只是清理 一些东西并添加了更多变量以使脚本更灵活 以供日后编辑。

嗯,它不是最漂亮的解决方案,但它是我能找到的唯一可靠的解决方案,它是完全独立的(在服务器列表的输入 .txt 文件之外)。没有任何东西可以从任何地方复制到任何地方,一切都是动态创建的。任何有冒险精神的人都可以随意查看并提出更好/更清洁的方法来实现我的目标。

# Establish Variables
$ZoneName = Read-Host 'Zone Name?'
$OdbcUserName = "Citrixuser"
$OdbcPassword = Read-Host 'Password for Citrixuser?'
$LicenseServerName = "MyLicenseServer.company.com"
$DataBase= "DBName"
$DBServer= "MyDBServer.company.com"
$EdgeSightServer = "MyEdgeSightServer.company.com"

$XAConfigConsoleExe = "C:\Program Files (x86)\Citrix\XenApp\ServerConfig\XenAppConfigConsole.exe"
$Servers = Get-Content -path .\serverlist.txt

# Setting setup arguments

[Array]$XAArguments = @()

$XAArguments += "/ExecutionMode:Join"
$XAArguments += "/ZoneName:$ZoneName"
$XAArguments += "/ImaWorkerMode:True"
$XAArguments += "/DsnFile:C:\temp\mf20.dsn"
$XAArguments += "/AuthenticationType:Sql"
$XAArguments += "/OdbcUserName:$OdbcUserName"
$XAArguments += "/OdbcPassword:$OdbcPassword"
$XAArguments += "/LicenseServerName:$LicenseServerName"
$XAArguments += "/LicenseServerPort:27000"
$XAArguments += "/LicenseModel:XA"
$XAArguments += "/CustomXMLServicePort:8080"
$XAArguments += "/EdgeSightCompanyName:CompanyName"
$XAArguments += "/EdgeSightServerName:$EdgeSightServer"
$XAArguments += "/EdgeSightServerPort:80"

# Running against server list

ForEach ($Server in $Servers)
{
# Creating joinfarm.bat file on the remote server
if ((Test-Path \\$Server\c$\temp\joinfarm.bat) -eq $true) {Remove-Item \\$Server\c$\temp\joinfarm.bat}
Add-Content \\$Server\c$\temp\joinfarm.bat "$([char]34)$XAConfigConsoleExe$([char]34) $XAArguments"
Add-Content \\$Server\c$\temp\joinfarm.bat "shutdown.exe /r /f /t 10"
Add-Content \\$Server\c$\temp\joinfarm.bat "del c:\temp\mf20.dsn /q"
Add-Content \\$Server\c$\temp\joinfarm.bat "del c:\temp\joinfarm.bat /q"

# Creating mf20.dsn file on the remote server
if ((Test-Path \\$Server\c$\temp\mf20.dsn) -eq $true) {remove-item \\$Server\c$\temp\mf20.dsn}
add-Content \\$Server\c$\temp\mf20.dsn "[ODBC]"
add-content \\$Server\c$\temp\mf20.dsn "DRIVER=SQL Server"
add-content \\$Server\c$\temp\mf20.dsn "DATABASE=$DataBase"
add-content \\$Server\c$\temp\mf20.dsn "APP=Citrix IMA"
add-content \\$Server\c$\temp\mf20.dsn "UID="
add-content \\$Server\c$\temp\mf20.dsn "SERVER=$DBServer,1433" 
add-content \\$Server\c$\temp\mf20.dsn "Trusted_Connection=No"

# running setup with arguments
Invoke-Command -ComputerName $Server -ScriptBlock {c:\temp\joinfarm.bat} -AsJob
}

我正在做的是编写一个批处理文件(我尝试编写一个 PS1 文件,但是当我运行 PS1 -AsJob 时它在初始命令之后没有运行任何命令,即使如果我没有它似乎也可以工作' t 使用-AsJob) 到远程服务器并使用-AsJob 开关执行批处理,这样我就可以同时加入多个服务器。如果没有-AsJob,每个服务器都必须在处理下一个服务器之前完成。批处理会自行清理 dsn 文件,然后重新启动服务器。

【讨论】:

  • 我很冒险...我稍后会看看。
  • @JamesQMurphy 将不胜感激。
猜你喜欢
  • 1970-01-01
  • 2014-03-12
  • 2014-02-19
  • 2015-07-05
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
相关资源
最近更新 更多