0

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

# 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
4

1 回答 1

0

我已经编辑了这个答案以反映我使用的脚本的最终版本。我没有改变任何逻辑或方法。我只是清理了一些东西并添加了更多变量,以使脚本在将来更灵活地进行编辑。

好吧,它不是最漂亮的解决方案,但它是我能找到的唯一可靠的解决方案,它是完全独立的(在服务器列表的输入 .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即使如果我不使用它似乎可以工作-AsJob)到遥控器服务器并使用开关执行批处理,-AsJob以便我可以同时加入多个服务器。如果没有-AsJob每个服务器必须在下一个处理之前完成。批处理会自行清理 dsn 文件,然后重新启动服务器。

于 2015-04-15T19:23:54.877 回答