JEA调用命令问题

时间:2018-04-26 22:57:54

标签: powershell

我一直致力于在我的环境中实施 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时,有人可以提供一些关于如何将局部变量转换为远程系统的建议吗?

1 个答案:

答案 0 :(得分:2)

更安全的解决方案:

我工作了一些,找到了一个更好的答案,保留NoLanguage JEA模式。这很有用,因为ConstrainedLanguage模式和FullLanguage模式在JEA有限帐户中提供了太多修改功能。

最后,我必须在VisibleCmdlets列表中添加两个额外的cmdlet。 Get-VariableSet-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需要改变它的实现方式。

第1项:

要解决这个问题,我进入了远程系统上的JEA-A1.PSSC文件,然后(在这种情况下,从未定义过语言模式)在名为LanguageMode的文件中添加了一个新行。 LanguageMode = 'FullLanguage'

第2项

然后我使用正确的语法更新了我在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

    }
}

第3项:

最后需要更新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

现在正在运行并正确传递值。