[英]Need to run commands within a Powershell script as different user
我需要處理一個相當復雜的腳本,該腳本涉及到不同 API 的多個服務帳戶,並且在大多數情況下,該腳本工作正常,但我遇到了一個讓我發瘋的問題。 我無法以其他用戶身份運行腳本,因為運行節點的 powershell 只能以 NT 權限運行腳本。
所以我的腳本的一部分看起來像這樣:
Foreach ($i in $AllUsers) {
$ConID = (Get-ADUser -Identity $i -Properties ExtensionAttribute2 -Credential $svcPOSHCreds).ExtensionAttribute2
$ConDN = (get-aduser -filter {EmployeeID -eq $ManagerEID} -Credential $svcPOSHCreds).DistinguishedName
Set-ADUser -Identity $i -Manager $ConDN-Credential $svcPOSHCreds
Get-ADPrincipalGroupMembership $i -Credential $svcPOSHCreds | foreach {Remove-ADGroupMember $_ -Members $i - Confirm:$false -Credential $svcPOSHCreds}
Add-ADGroupMember -Identity 'Identity Con User' -Members $i -Credential $svcPOSHCreds
}
如您所見,我必須為我運行的每個命令指定 -Credential,因為運行此腳本的用戶無權執行某些操作。
到目前為止,我可以為不同 API 和 AD 等之間的所有命令計算大約 108 個“-Credential”參數。
有沒有辦法可以將命令組合在一起,以便它們使用相同的“憑據”,這樣我就不必每次運行每個命令時都指定它? 我無法指定腳本的運行方式:(我的限制僅限於 PS1 內部。所以沒有“runas”......等等。
有沒有辦法可以將命令組合在一起,以便它們使用相同的“憑據”,這樣我就不必每次運行每個命令時都指定它?
是的,您可以使用首選項變量$PSDefaultParameterValues
來自動執行此過程。
這是一個簡單的例子來演示它是如何工作的,首先我們可以定義來測試函數:
function Set-Something {
[CmdletBinding()]
param([pscredential] $Credential, [string] $SomeParam)
[pscustomobject]@{
SomeParam = $SomeParam
UserName = $Credential.UserName
Password = [Net.NetworkCredential]::new('', $Credential.Password).Password
}
}
function Get-Something {
[CmdletBinding()]
param([pscredential] $Credential, [string] $SomeParam)
[pscustomobject]@{
SomeParam = $SomeParam
UserName = $Credential.UserName
Password = [Net.NetworkCredential]::new('', $Credential.Password).Password
}
}
對於這兩個函數,我們將它們的-Credential
參數設置為默認參數:
$cred = [pscredential]::new('hello', (ConvertTo-SecureString 'world' -AsPlainText))
$PSDefaultParameterValues = @{
'Set-Something:Credential' = $cred
'Get-Something:Credential' = $cred
}
然后我們可以測試它是否正常工作,在這里我們可以假設$cred
變量將作為默認值傳遞給兩個函數:
Get-Something -SomeParam 123
Set-Something -SomeParam 123
結果是:
SomeParam UserName Password
--------- -------- --------
123 hello world
123 hello world
您也可以在此處使用通配符,例如:
$PSDefaultParameterValues = @{
'*-Something:Credential' = $cred
}
將針對所有帶有名詞Something
的函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.