【问题标题】:Powershell run privileged commands from non privileged user by passing credentialsPowershell 通过传递凭据从非特权用户运行特权命令
【发布时间】:2018-01-29 12:49:34
【问题描述】:

我在执行需要比调用用户更多权限的命令时遇到了一些麻烦。

出于管理原因,我编写了一个包含 powershell 脚本和 sn-ps 的“管理存储库”。如果我发布一个新标签,我会创建一个自动导入器脚本和一个自动更新。像魅力一样工作!

但我们决定将一些权限分配给其他用户以满足JEA 的一些要求。

现在我们的非特权“工作”用户正在导入存储库,并且不允许运行每个命令。 (例如查询 DHCP 服务器)

我认为这不会有问题 - 认为 Get-Credential 只是与 priv 用户一起运行 priv 功能......但我错了......这并不像我想象的那么简单。

第一个问题是该命令不接受 -credential 参数。 我最终得到了这样的结果:

$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = "powershell"
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.Domain = $cred.UserName.Split('\')[0] 
$pinfo.Password = $cred.Password
$pinfo.UserName = $cred.UserName.Split('\')[1]
$pinfo.CreateNoWindow = $true
$pinfo.Arguments = "Get-DhcpServerv4Scope -computername $server"
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
$stdout = $p.StandardOutput.ReadToEnd()
$stderr = $p.StandardError.ReadToEnd()
$p.WaitForExit()

我花了一些时间将此会话的输出转换为变量... 拳头我将输出写入一个 tmp 文件并在另一个会话中将其变红,但感觉就像我做错了。

现在我必须解析输出,创建模板并再次构建对象 - 我必须更改一半的脚本,它变得很慢,我不喜欢这种方式....

我无法摆脱有更好方法的感觉 - 所以我问你:)

最好的问候

大卫·布拉

【问题讨论】:

  • 如果您已经在使用 JEA 会话配置,为什么不添加另一个允许非特权用户运行命令的配置?
  • 在这一点上我支持你,但我必须走很长的路才能实现 JEA 概念。一个早期的步骤是为需要比默认权限更多的用户创建第二个用户。我将逐步缩小(更高权限用户的)权限,以保证对生产的影响更小。

标签: powershell credentials runas


【解决方案1】:

Invoke-Command 允许传递凭据。

Invoke-Command -ScriptBlock {
    # put your code here
    Write-Host "Hello World!"
} -Credential (Get-Credential)

【讨论】:

  • 哦,是的 - 这是我的第一次尝试,但如果您还传递 -computername,invoke-command 只接受 -credentials,这需要远程处理或/和其他功能。像 $return_val = invoke_command_as_other_user -scriptblock {..} -creds 这样“调用命令”会很棒,但这需要远程访问
【解决方案2】:

我切换到start-job,因为它允许传递凭据但不使用远程功能:

$variable_needs_to_be_passed

$a_job = start-job -ScriptBlock{param($var) Do-Stuff-With-Other-User $var} `
-Arg $variable_needs_to_be_passed -credentials $cred

while((get-job -Id ($a_job.id)).State -eq "Running") {sleep(0.5)}

$return_value = Recieve-Job -Id ($a_job.id)

但是与直接运行命令(由于迭代调用)相比,它的速度非常慢,也许调用完整的脚本而不是使用它来执行单个命令会更好。

为了更好地理解它,这部分搜索所有 dns 和 dhcp 服务器以查找特定客户端。 示例代码:

if(check_permission){ GetAllDhcpScopes }else{ runas ... GetAllDhcpScopes }
foreach( AllDhcpScopes ){ if(check_permission){ GetDhcpLeases $_ }else{ runas ... GetDhcpLeases $_ }

这对性能很不利,所以我一开始就开始做permission_check,而不是正常运行脚本或将其作为具有更高权限的工作启动!

【讨论】:

    猜你喜欢
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    相关资源
    最近更新 更多