我尝试编写一个简单的脚本,允许员工在不是本地管理员的计算机上重置Citrix会话。以下完美地作为.ps1。但是当使用PS2EXE转换为.exe并且运行时,它不会重置会话。
使用.exe背后的想法是我可以隐藏运行命令所需的服务帐户的密码(它是Citrix服务器上的本地管理员)。是的,我已经意识到风险,并且.ps1可以很容易地从.exe中提取出来。我确信我们可以在GP中这样做,但我想用这种方法。
那么,为什么在以.exe运行时不会重置会话? (我已尝试对服务器和会话的值进行硬编码,因此我认为这可能是凭据问题,而不是变量或ScriptBlock问题。)
$strScriptUser = "DOMAIN/svcacct"
$strPass = "password"
$PSS = ConvertTo-SecureString $strPass -AsPlainText -Force
$cred = new-object system.management.automation.PSCredential
$strScriptUser,$PSS
$server = Read-Host 'Which Citrix server?'
$sid = Read-Host 'What session number to reset? (be very careful!)'
Start-Job -ScriptBlock {
reset session $using:sid /server $using:server > /temp2/result.txt
} -Credential $cred
答案 0 :(得分:0)
感谢对原始问题的评论,我能够实现这一目标。我认为问题是它在重置有时间完成之前过早退出。使用Start-Job
和Wait-Job
似乎可以解决这个问题。
这是最终的工作版本。我添加了会话列表和一些导航。我确定有更优雅的方式,但这在我的最终。如果有任何罪过于令人难以忽视,请告诉我。
$strPass = "password"
$PSS = ConvertTo-SecureString $strPass -AsPlainText -Force
$credential = new-object -typename System.Management.Automation.PSCredential `
-argumentlist "domain\svcacct",$PSS
$sid=0
Write-Host "***Session Destroyer(!) v1***"
while ($sid -eq "0" -Or $sid -eq "n" -Or $sid -eq "N") {
$server = Read-Host 'Which Citrix server? (or q to quit)'
if ($server -eq "q" -Or $server -eq "Q") {exit}
query session /server $server
$sid = Read-Host 'What session number to reset? Be very careful! `
(or q quits, n for new server)'
if ($sid -eq "q" -Or $sid -eq "Q") {exit}
}
$job = Start-Job -credential $credential –scriptblock {
reset session $using:sid /server $using:server
}
Wait-Job $job
Write-Host "Done. Check below to make sure."
query session /server $server
pause