Powershell通过传递凭据来运行来自非特权用户的特权命令

时间:2018-01-29 12:49:34

标签: powershell credentials runas

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

我写了一个powershell脚本的“管理存储库”&片段由于管理原因。如果我发布新标签,我会创建一个自动导入程序脚本以及自动更新。像魅力一样工作!

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

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

我认为这不是问题 - 考虑Get-Credential只是使用priv用户运行私有功能....但我错了......这并不像我想的那么简单。

第一个问题是该命令不接受-credential param。 我最终得到了这样的东西:

$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文件并用另一个会话重写它,但感觉我做错了。

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

我无法逃避有更好的方式的感觉 - 所以我问你:)

最好的问候

David Bla

2 个答案:

答案 0 :(得分:1)

Invoke-Command允许传递凭证。

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

答案 1 :(得分:0)

我切换到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,而不是正常运行脚本或将其作为具有更高权限的作业进行工作!