簡體   English   中英

需要以不同用戶身份在 Powershell 腳本中運行命令

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM