使用不同的凭据运行ScriptBlock

时间:2014-01-25 01:16:31

标签: powershell

我有一个确定用户ID的脚本,一旦我拥有该用户ID,我想使用不同的凭据针对该用户ID运行脚本块。这可能吗?谁能告诉我这方面的例子?我很感激。 提前致谢。 : - )

4 个答案:

答案 0 :(得分:9)

我得到了它,感谢Trevor Sullivan指出我正确的方向。我最后只是将我的第二个ps1文件放入一个scriptblock,并将其作为一个作业运行,然后从主脚本中传递参数,就像这样

$job = Start-Job -scriptblock {
param ($username)
some code to run against the variable that was passed in
} -Args $target -credential $Cred

$ target是我要传递给我的scriptblock的变量。 $ username是scriptblock接受的参数,谢谢。

答案 1 :(得分:3)

我知道很久以前就已经回答了这个问题,但是我想为那些无需返回数据即可返回数据的用户添加另一个选择。

我们可以创建一个帮助脚本,该脚本创建一个pscredential,然后使用它来启动本地PSSession,以在其他用户的上下文中运行脚本或脚本块。您需要从某个地方获取用户密码,最好以安全字符串形式输入或从Key Vault中获取用户密码,但是对于本示例,我们的帮助程序脚本会将其作为字符串参数。

脚本内容:

param ([string]$username,[string]$password)

$Username   = 'username@domain.com'
$Password   = ConvertTo-SecureString -String $password -AsPlainText -Force
$Credential = New-Object -Type PSCredential($Username,$Password)
$Session    = New-PSSession -Credential $Credential

Invoke-Command -Session $Session -FilePath C:\Path\to\some\script.ps1

如果您要运行的代码很简单,或者已将脚本转换为脚本块,则也可以使用-ScriptBlock代替-FilePath

希望这可以帮助某人!

答案 2 :(得分:0)

会话初始化时建立会话的安全上下文。您不能在会话中的不同上下文中任意运行命令。要在不同的安全上下文(凭据集)下运行,您需要在这些凭据下初始化新会话并在那里运行它。

如果您查看Invoke-Command的帮助,您会注意到-Credential参数仅在通过computername,uri或session指定远程会话的参数集中有效。您还可以将-credentialStart-Job一起使用,这将在本地计算机上的新会话中运行该命令。

答案 3 :(得分:0)

此代码将使用提供的凭据在管理员模式下启动PowerShell,然后在脚本块中运行该代码。可能还有其他方法,但这对我有用。

$account= # AD account 
$password =  # AD user password
$passwordSecure = ConvertTo-SecureString ($password) -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential ($account, $passwordSecure)

$ScriptBlock = { 
    whoami
    start-sleep 3
}
 
# Run PowerShell as Administrator with Custom Crednetails
start-Process powershell.exe -Credential $Cred -ArgumentList "-Command Start-Process powershell.exe -Verb Runas -ArgumentList '-Command $ScriptBlock'" -Wait