0

多くの PowerShell スクリプトが実行するユーザー コンテキストを変更する必要がある特定のユース ケースがあります。確実に動作するコードがありますが、各スクリプトで繰り返すのではなく、関数に入れようとしています。

個別に、この関数の行は機能しますが、関数として実行すると、スクリプトでエラーは発生しませんが、結果は得られません。

誰かがこれで私が欠けているものを見つけることができれば、私はそれを大いに感謝します.

            Function Invoke-AsUser() {
            Param(
                [Parameter(Mandatory=$true)]
                [String]
                $ScriptBlock
                ,
                [Parameter(Mandatory=$true)]
                [String]
                $RunAsUser
                ,
                [Parameter(Mandatory=$true)]
                [String]
                $RunAsPassword
                ,
                [Switch]$credSSP=$false
                )

                #Get the execution policy and store
                    $ExecutionPolicy = Get-ExecutionPolicy
                #Set up WSMANCredSSP
                    Enable-WSManCredSSP -Role Server -Force | out-null
                    Enable-WSManCredSSP -Role Client -DelegateComputer $env:COMPUTERNAME -Force | Out-Null
                #Set WSMAN MaxMemoryPerShell
                    #The following Prevents "Out of memory" errors from occurring when running commands through a remote pssession.
                    set-item wsman:localhost\Shell\MaxMemoryPerShellMB 512
                #Enable PSRemoting
                    try
                    {
                        enable-psremoting -force | Out-Null
                    }
                    catch
                    {
                        Write-Host "Enabling PSRemoting returned a non fatal exception."            
                    }
                #Create Credentials
                    $cred = new-object System.Management.Automation.PsCredential($runasuser,(ConvertTo-SecureString $RunasPassword -AsPlaintext -force))
                    $cred

                #Create the pssession
                    If ($credSSP -eq $true) {
                            try {
                                write-host "Authenticating with CredSSP"
                                $s = new-pssession -ComputerName $ENV:COMPUTERNAME -Credential $cred -Authentication Credssp
                            }

                            Catch {
                                    Write-Error "Creating new-pssession failed"
                            }
                        }
                    Else {
                            try {
                                    Write-Host "Authenticating without CredSSP"
                                    $s = new-pssession -ComputerName $ENV:COMPUTERNAME -Credential $cred
                                }

                                Catch {
                                        Write-Error "Creating new-pssession failed"
                                }
                        }

                #Invoke the command using pssession
                    Write-host "Running Scriptblock as $RunAsUser"
                    Invoke-Command -Session $s -ScriptBlock {Set-executionpolicy Bypass -Force}
                    Write-Host $ScriptBlock
                    invoke-command -Session $s -ScriptBlock { $ScriptBlock }
                    Write-host "Running Scripblock as $RunAsUser has finished."

                #set executionpolicy back to original
                    $ScriptBlock = "Set-ExecutionPolicy $ExecutionPolicy -Force"
                    Invoke-Command -Session $s -ScriptBlock {$ScriptBlock}

                #Disable psremoting
                    Disable-PSRemoting -force -WarningAction SilentlyContinue
            }

            $ErrorActionPreference = "Stop"
            Invoke-AsUser -ScriptBlock "& C:\temp\test.ps1" -RunAsUser $ENV:RUNASUSER -RunAsPassword $ENV:RUNASPASSWORD -CredSSP
4

2 に答える 2

0

|out-nullスクリプトから " " を削除すると、より適切なデバッグ出力が得られるはずです。

于 2014-03-06T03:01:15.433 に答える