我有一个脚本,可以确定用户ID;一旦我有了该用户 ID,我想使用不同的凭据针对该用户 ID 运行脚本块。 这可能吗? 谁能告诉我这方面的例子吗?
我明白了,感谢 Trevor Sullivan 为我指明了正确的方向。我最终只是将第二个 ps1 文件放入脚本块中,并将其作为作业运行,并向其传递主脚本中的参数,如下所示
$job = Start-Job -scriptblock {
param ($username)
some code to run against the variable that was passed in
} -Args $target -credential $Cred
$target 是我想传递给脚本块的变量。 $username 是脚本块接受的参数谢谢。
我知道这个问题很久以前就得到了回答,但我想我应该为那些希望返回数据而无需检索数据的人添加另一个选项。
我们可以创建一个帮助程序脚本,该脚本创建 pcredential,然后使用它启动本地 PSSession 以在不同用户的上下文中运行脚本或脚本块。 您需要从某个地方获取用户密码,最好作为安全字符串输入或从 Key Vault 中检索,但对于示例,我们的帮助程序脚本会将其作为字符串参数。
脚本内容:
param ([string]$username,[string]$password)
$Username = '[email protected]'
$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
。
希望这可以帮助别人!
会话的安全上下文是在会话初始化时建立的。 您不能在会话中的不同上下文下任意运行命令。 要在不同的安全上下文(凭据集)下运行,您需要在这些凭据下初始化一个新会话并在那里运行它。
如果您查看
Invoke-Command
的帮助,您会注意到 -Credential
参数仅在通过计算机名、uri 或会话指定远程会话的参数集中有效。 您还可以将 -credential
与 Start-Job
一起使用,这将在本地计算机上的新会话中运行该命令。
快速而肮脏的解决方案:
$Var1 = 1
$Var2 = 2
$Var3 = 3
Start-Process -FilePath 'pwsh.exe' -Verb 'RunAs' "-Command & {
Some-Command -Arg $Var1
Some-Command -Arg $Var2
Some-Command -Arg $Var3
}"
创建一个
ScriptBlock
并通过传递给它的参数来调用它,相比之下是很痛苦的。
此代码将使用提供的凭据在管理员模式下启动 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