我一直致力于在我的环境中实施 JEA ,以允许我们的Jenkins系统在所有服务器上都没有本地管理控制权。
我已经能够创建JEA文件,以及用户帐户可以运行的指定命令。 我遇到的问题是我需要将一个变量值从我的Jenkins服务器传递到远程服务器。到目前为止,我无法执行此操作。
以下是我与Powershell一起使用的代码:
$session = New-PSSession -ComputerName "webaoneratebook" -ConfigurationName JEA-A1
$user = "USER"
$File = "C:\users\svc.jenkins.prd\Documents\WindowsPowerShell\FILE.txt"
$myCredentials = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user ,(Get-Content $file| ConvertTo-SecureString)
$pass = $MyCredentials.GetNetworkCredential().Password
Start-sleep -s 3
Invoke-Command -Session $session -scriptblock {AnalyzeRatebook} -ArgumentList $pass
Get-PSSession| Remove-PSSession
无论我尝试过什么,我似乎无法获得密码来传递。 在 JEA PSRC 文件中,我设置了以下远程变量:
VariableDefinitions = @{ Name = 'log'; Value = 'D:\inetpub\wwwroot\Jenkinstemp\A1Log.log'},
@{ Name = 'binpath'; Value = 'D:\inetpub\wwwroot\AscendantOne\bin' },
@{ Name = 'user'; Value = 'USER' },
@{ Name = 'pass2'; Value = 'TEMP' },
@{ Name = 'manifest'; Value = 'D:\inetpub\wwwroot\Jenkinstemp\manifest.xml' }
在 JEA PSRC 文件中,我的功能如下:
FunctionDefinitions = @{
'Name' = 'AnalyzeRatebook'
'ScriptBlock' = {
& $binpath\AOImportCmd.exe -u $user -p $pass -o $log -a $manifest
}
}
并确保它也在Visible Functions中。
VisibleFunctions = 'AnalyzeRatebook','TestRatebook',@{ Name = 'AnalyzeRatebook'; Parameters = @{ Name = 'ArgumentList'}}
如果我做Write-Host "& $binpath\AOImportCmd.exe -u $user -p $pass -o $log -a $manifest"
,我会收回除密码以外的所有内容。
那么在使用JEA时,有人可以提供一些关于如何将局部变量转换为远程系统的建议吗?
答案 0 :(得分:2)
我工作了一些,找到了一个更好的答案,保留NoLanguage
JEA
模式。这很有用,因为ConstrainedLanguage
模式和FullLanguage
模式在JEA
有限帐户中提供了太多修改功能。
最后,我必须在VisibleCmdlets
列表中添加两个额外的cmdlet。
Get-Variable
和Set-Variable
。
一旦我添加了这些,我就可以将系统设置回NoLanguage
模式,然后通过下面的ICM
命令将我的本地变量传递给远程主机:
Invoke-Command -Session $session -scriptblock {AnalyzeRatebook -u"$Using:user" -p"$Using:pass" -o"$Using:log" $Using:manifest}
问题是由于三(编辑:数学很难)的原因: 1.配置了无语言模式。这在PSSC文件中进行了修改。 2.用户错误以及我如何在PSRC文件中定义Param。 3. ICM需要改变它的实现方式。
要解决这个问题,我进入了远程系统上的JEA-A1.PSSC
文件,然后(在这种情况下,从未定义过语言模式)在名为LanguageMode的文件中添加了一个新行。
LanguageMode = 'FullLanguage'
然后我使用正确的语法更新了我在JEA-A1.PSRC
文件中编写的自定义函数。
# Functions to define when applied to a session
FunctionDefinitions = @{
'Name' = 'AnalyzeRatebook'
'ScriptBlock' = {
Param($user),($pass),($log),($manifest)
& $binpath\AOImportCmd.exe "-a" $user $pass $log $manifest
$LASTEXITCODE
}
}
# Functions to define when applied to a session
FunctionDefinitions = @{
'Name' = 'AnalyzeRatebook'
'ScriptBlock' = {
Param($user,$pass,$log,$manifest)
& $binpath\AOImportCmd.exe "-a" $user $pass $log $manifest
$LASTEXITCODE
}
}
最后需要更新Invoke-Command
调用以准确读取和解析变量。在我的情况下,我无法将它们设置为单个字符串,因为系统期望在值之间暂停以表示它们是什么。
Invoke-Command -Session $session -scriptblock {Param($user,$pass,$log,$manifest) AnalyzeRatebook -u"$user" -p"$pass" -o"$log" $manifest} -ArgumentList $user,$pass,$log,$manifest
现在正在运行并正确传递值。