source

다른 사용자로 PowerShell 실행 및 스크립트 실행

ittop 2023. 4. 22. 10:30
반응형

다른 사용자로 PowerShell 실행 및 스크립트 실행

필요한 이유에 대해 자세히 설명하지는 않겠지만 사용자는 서비스 계정으로 PowerShell을 시작할 수 있어야 하며 PowerShell이 로드되면 스크립트를 실행해야 합니다.저장된 자격 증명(보안 문자열로 저장됨)으로 이미 PowerShell을 시작할 수 있지만 아무리 해도 스크립트($args에 위치)를 실행할 수 없습니다.여러 가지 시도를 해봤는데, 현재 제가 있는 곳은 아래와 같습니다.어떤 도움이라도 주시면 감사하겠습니다.

$user = "domain\service.account" 
$pwd1 = "big long huge string of characters"
$pwd = ($pwd1 | ConvertTo-SecureString)
$Credential = New-Object System.Management.Automation.PSCredential $user, $pwd
$args = "\\domain.local\location\location\location\Script\script.ps1"
Start-Process powershell.exe -Credential $Credential -ArgumentList ("-file $args")

다음과 같이 지정된 사용자 credential로 새 powershell 창을 열 수 있습니다.

start powershell -credential ""

여기에 이미지 설명 입력

난 이게 나한테 효과가 있다는 걸 알았어.

$username = 'user'
$password = 'password'

$securePassword = ConvertTo-SecureString $password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword
Start-Process Notepad.exe -Credential $credential

업데이트: Pady가 지적한 특수 문자 문제를 피하기 위해 작은 따옴표를 사용하는 것으로 변경되었습니다.

UI를 통해 이를 실현하는 좋은 방법도 있습니다.

0) 태스크바에서 PowerShell 아이콘을 오른쪽 클릭합니다.

1) Shift + Windows PowerShell 우클릭

2) "다른 사용자로 실행"

사진

를 추가해 보겠습니다.RunAs선택 사항Start-Process

Start-Process powershell.exe -Credential $Credential -Verb RunAs -ArgumentList ("-file $args")

Windows Server 2012 또는 2016에서 Windows PowerShell을 검색한 다음 "시작에 고정"을 검색할 수 있습니다.그런 다음 시작 페이지 타일을 마우스 오른쪽 버튼으로 클릭하면 "다른 사용자로 실행" 옵션이 표시됩니다.

credential 팝업이 뜨면 다음과 같은 문자열로 사용자 이름과 비밀번호를 얻을 수 있습니다.

여기에 이미지 설명 입력

#Get credentials
$credential = Get-Credential
$username = $credential.Username
$password = $credential.GetNetworkCredential().Password

그런 다음 스크립트에서 변수 $username과 $password를 사용할 수 있습니다.

이 명령어는 나에게 유효합니다.

Start-Process powershell.exe -Credential $Credential -ArgumentList "-file $FILE"

이 경우,$FILE네트워크에 접속되어 있는 경우는, 실행 유저가 파일에 액세스 할 수 있는 것을 확인합니다.


대본

자동화를 용이하게 하기 위해 스크립트를 작성했습니다.

 <#

.SYNOPSIS

Run command as another user.

.DESCRIPTION

Run batch or PowerShell command as another user.

.PARAMETER Command

The batch command you'd like to execute as another user.

.PARAMETER ScriptBlock

The PowerShell command you'd like to execute as another user.

.PARAMETER Username

Run the command as what user.

.PARAMETER Password

Password of the user.

.PARAMETER Credential

PowerShell credential of the user, it can be generated by `Get-Credential`.

.PARAMETER Wait

Wait command to complete or not.
Command output would not be displayed if it is not specified.

#>

Param (
    [Parameter(Mandatory = $true, ParameterSetName = "bat-user-password")]
    [Parameter(Mandatory = $true, ParameterSetName = "bat-credential")]
    [ValidateNotNullOrEmpty()]
    [String]
    $Command,

    [Parameter(Mandatory = $true, ParameterSetName = "ps-user-password")]
    [Parameter(Mandatory = $true, ParameterSetName = "ps-credential")]
    [ScriptBlock]
    $ScriptBlock,

    [Parameter(Mandatory = $true, ParameterSetName = "bat-user-password")]
    [Parameter(Mandatory = $true, ParameterSetName = "ps-user-password")]
    [ValidateNotNullOrEmpty()]
    [String]
    $Username,

    [Parameter(Mandatory = $true, ParameterSetName = "bat-user-password")]
    [Parameter(Mandatory = $true, ParameterSetName = "ps-user-password")]
    [ValidateNotNullOrEmpty()]
    [String]
    $Password,

    [Parameter(Mandatory = $true, ParameterSetName = "bat-credential")]
    [Parameter(Mandatory = $true, ParameterSetName = "ps-credential")]
    [PSCredential]
    $Credential,

    [Switch]
    $Wait
)

$IsCurrentAdminUser = $([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')

# Find a dir that every user have full access to
$TempDir = "$env:SystemDrive\Users\Public\run_as"
if (-not (Test-Path -Path $TempDir)) {
    $null = New-Item -Path $TempDir -ItemType Directory
    attrib +h $TempDir
}

# Generate a uniq id for problem tracking
$ExecId = Get-Random -Maximum 99999999 -Minimum 10000000

# Temp files
$UserScriptPrefix = "$TempDir\$ExecId-UserScript"
$UserStdOut = "$TempDir\$ExecId-UserStdOut.log"
$UserErrOut = "$TempDir\$ExecId-UserErrOut.log"
$WaitFile = "$TempDir\$ExecId-Running"

$ExecScript = "$TempDir\$ExecId-Exec.ps1"
$CmdToExec = "Start-Process"

if ($PsCmdlet.ParameterSetName.StartsWith('bat')) {
    $UserScript = $UserScriptPrefix + '.bat'
    $Command |Out-File -FilePath $UserScript -Encoding ascii

    $CmdToExec += " cmd.exe -ArgumentList '/c $UserScript'"
} elseif ($PsCmdlet.ParameterSetName.StartsWith('ps')) {
    $UserScript = $UserScriptPrefix + '.ps1'
    $ScriptBlock |Out-File -FilePath $UserScript -Encoding ascii

    $CmdToExec += " PowerShell.exe -ArgumentList '-file $UserScript'"
}

if ($PsCmdlet.ParameterSetName.EndsWith('user-password')) {
    $SecPassword = ConvertTo-SecureString -String $Password -AsPlainText -Force
    $Credential = New-Object -TypeName System.Management.Automation.PSCredential ($Username, $SecPassword)
}

$CmdToExec += " -WorkingDirectory $env:SystemDrive\"

if ($Wait) {
    # Redirect output only if -Wait flag is set
    $CmdToExec += " -RedirectStandardError $UserErrOut"
    $CmdToExec += " -RedirectStandardOutput $UserStdOut"

    if ($IsCurrentAdminUser) {
        # -Wait parameter of Start-Process only works with admin users
        # Using it with non-admin users will get an "Access is denied" error
        $CmdToExec += " -Wait"
    }
}

$script = @'
Param($Cred)
"" | Out-File -FilePath {0}

try {{
    {1} -Credential $Cred
}} catch {{
    Write-Host $_
}} finally {{
    Remove-Item -Path {0} -Force -Confirm:$false
}}
'@ -f $WaitFile, $CmdToExec

$Script |Out-File -FilePath $ExecScript -Encoding ascii

try {
    & $ExecScript -Cred $Credential
} catch {
    Write-Host $_
} finally {
    if ($Wait) {
        if (-not $IsCurrentAdminUser) {
            # Impelment the wait by file monitoring for non-admin users
            do {
                Start-Sleep -Seconds 1
            } while (Test-Path -Path $WaitFile)
    
            # Wait output are write to files completely
            Start-Sleep -Seconds 1
        }

        # Read command output from files
        if (Test-Path -Path $UserStdOut) {
            Get-Content -Path $UserStdOut
        }

        if (Test-Path -Path $UserErrOut) {
            Get-Content -Path $UserErrOut
        }
    }

    Remove-Item -Path "$TempDir\$ExecId-*" -Force -Confirm:$false -ErrorAction SilentlyContinue
}

콘텐츠를 복사하여 에 저장합니다.*.ps1파일, 예를 들어run_as.ps1.

문서

빌트인 데이터 표시:

PS C:\> Get-Help C:\run_as.ps1 -detailed

NAME
    C:\run_as.ps1

SYNOPSIS
    Run command as another user.


SYNTAX
    C:\run_as.ps1 -Command <String> -Credential <PSCredential> [-Wait] [<CommonParameters>]

    C:\run_as.ps1 -Command <String> -Username <String> -Password <String> [-Wait] [<CommonParameters>]

    C:\run_as.ps1 -ScriptBlock <ScriptBlock> -Credential <PSCredential> [-Wait] [<CommonParameters>]

    C:\run_as.ps1 -ScriptBlock <ScriptBlock> -Username <String> -Password <String> [-Wait] [<CommonParameters>]


DESCRIPTION
    Run batch or PowerShell command as another user.


PARAMETERS
......

01

현재 사용자가 관리자이므로 비밀번호를 사용하여 user01로 배치명령어를 실행합니다.

주의: 실제 가동 환경에서는 일반 비밀번호를 사용하지 마십시오.테스트에 사용할 수 있습니다.실가동 환경에서는-Credential옵션을 선택합니다.

PS C:\> whoami
test-win-1\administrator
PS C:\> .\run_as.ps1 -Command 'whoami' -Username 'user01' -Password 'password1'
PS C:\> 
PS C:\> # Add -Wait to get command output
PS C:\> .\run_as.ps1 -Command 'whoami' -Username 'user01' -Password 'password1' -Wait

C:\>whoami
test-win-1\user01
PS C:\> 
PS C:\> # Add '@' to batch command to avoid the header lines
PS C:\> .\run_as.ps1 -Command '@whoami' -Username 'user01' -Password 'password1' -Wait
test-win-1\user01
PS C:\>

02

현재 사용자는 관리자이므로 비밀번호를 사용하여 PowerShell 명령을 user02로 실행합니다.

주의: 실제 가동 환경에서는 일반 비밀번호를 사용하지 마십시오.테스트에 사용할 수 있습니다.실가동 환경에서는-Credential옵션을 선택합니다.

PS C:\> $env:USERPROFILE
C:\Users\Administrator
PS C:\> .\run_as.ps1 -ScriptBlock {$env:USERPROFILE} -Username 'user02' -Password 'password2' -Wait
C:\Users\user02
PS C:\>

03

현재 사용자는 관리자이며 자격 증명을 사용하여 PowerShell 명령을 user02로 실행합니다.

PS C:\> $env:USERPROFILE
C:\Users\Administrator
PS C:\> $cred = Get-Credential user02    # input user02's password in the pop-up window
PS C:\> .\run_as.ps1 -ScriptBlock {$env:USERPROFILE} -Credential $cred -Wait
C:\Users\user02
PS C:\>

04

현재 사용자는 user01입니다.관리자로서 PowerShell 명령어를 실행합니다.

PS C:\> $(Get-ChildItem C:\Users\Administrator\).FullName                                                                                 
Get-ChildItem : Access to the path 'C:\Users\Administrator' is denied.                                                                    
At line:1 char:3                                                                                                                          
+ $(Get-ChildItem C:\Users\Administrator\).FullName                                                                                       
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                                                                                                 
    + CategoryInfo          : PermissionDenied: (C:\Users\Administrator\:String) [Get-ChildItem], UnauthorizedAccessException             
    + FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand                                
                                                                                                                                        
PS C:\> whoami                                                                                                                            
test-win-1\user01                                                                                                                         
PS C:\> # Standard user cannot access administrator user's home directory
PS C:\> 
PS C:\> .\run_as.ps1 -ScriptBlock {$(Get-ChildItem C:\Users\Administrator\).FullName} -Username Administrator -Password 'adminpasswd' -Wait  
C:\Users\Administrator\.vscode                                                                                                            
C:\Users\Administrator\3D Objects                                                                                                         
C:\Users\Administrator\Contacts                                                                                                           
C:\Users\Administrator\Desktop                                                                                                            
C:\Users\Administrator\Documents                                                                                                          
C:\Users\Administrator\Downloads                                                                                                          
C:\Users\Administrator\Favorites                                                                                                          
C:\Users\Administrator\Links                                                                                                              
C:\Users\Administrator\Music                                                                                                              
C:\Users\Administrator\Pictures                                                                                                           
C:\Users\Administrator\Saved Games                                                                                                        
C:\Users\Administrator\Searches                                                                                                           
C:\Users\Administrator\Videos                                                                                                             
PS C:\>                                                                                                                                   

이건 나한테 효과가 있었어.이것은 리모트 명령줄 툴을 사용할 수 있는 리모트서버에서 도움이 됩니다.

runas /user:Administrator "powershell Start-Transcript -Path C:\Users\m\testlog.txt;import-module 'C:\Users\m\script.ps1';Stop-Transcript"

도 확실하게 수 .testlog.txt

언급URL : https://stackoverflow.com/questions/28989750/running-powershell-as-another-user-and-launching-a-script

반응형