다른 사용자로 PowerShell 스크립트를 실행하고 관리자 권한으로 실행하세요.

다른 사용자로 PowerShell 스크립트를 실행하고 관리자 권한으로 실행하세요.

중복된 질문인 것 같지만 해결 방법을 시도해 보았으나 효과가 없었습니다.

도메인 계정으로 스크립트를 실행해야 하지만 승격된 권한으로도 실행해야 합니다. 바로가기는 관리자 권한으로 실행되고 자격 증명을 묻는 메시지를 표시하므로 대부분의 장치에서는 문제가 되지 않습니다. 그러나 사용자가 로컬 관리자인 경우 자격 증명을 묻는 메시지가 표시되지 않습니다(단지 예/아니요 UAC 프롬프트만 표시됨).

왜 이것이 작동하지 않는지 혼란스러워요.

# Get identity of script user
$identity = [Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()

# Elevate the script if not already
if ($identity.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Write-Host -F Green 'ELEVATED'
} else {
    Start-Process PowerShell -Verb RunAs "-NoProfile -ExecutionPolicy Bypass -Command `"& '$PSCommandPath'`""
    Exit
}

# Ensure the script has domain privileges
if ($identity.IsInRole('[domain]\[admin group]')) {
    Write-Host -F Green 'DOMAIN ADMIN'
} else {
    Start-Process PowerShell -Verb RunAsUser "-NoProfile -ExecutionPolicy Bypass -Command `"& '$PSCommandPath'`""
    Pause # required, otherwise the Exit below closes the UAC prompt
    Exit
}
Pause

사용자 및 도메인 자격 증명이 입력될 때 자체 승격된 스크립트가 실행되면 승격이 손실됩니다. 즉, Start-Process -Verb RunAsUser powershell승격된 PowerShell에서 실행되면 자체적으로 승격되지 않습니다.

또한 다음을 시도했습니다.

Start-Process powershell -verb RunAs -argumentlist "Start-Process powershell.exe -Verb RunAsUser `"& path\to\script.ps1`""

도메인 관리자가 승격되지 않는 한 스크립트 디렉터리에 액세스할 수 없기 때문에 실패합니다.

답변1

무언가를 자동화하고 있습니까, 아니면 가끔 스크립트를 실행하고 있습니까? 스크립트 디렉터리가 로컬에 있습니까, 아니면 네트워크에 있습니까?

아시다시피, 새로운 powershell 인스턴스를 시작해도 runas사용자가 변경되지 않으며 runasuser프로세스가 향상되지 않습니다. 두 가지를 모두 반대 순서로 수행해야 합니다. 로컬 관리자로 로그인한 경우 RunAsUser를 사용하거나 다음을 통해 Powershell을 시작합니다.

  • Shift+마우스 오른쪽 버튼 클릭 > 다른 사용자로 실행 > 도메인 관리자

그런 다음 runas를 수행하여 거기에서 도메인 관리자로 권한을 높이세요.

Start-Process PowerShell -Verb RunAs

현재 어떤 사용자로 실행되고 있는지 확인할 수 있습니다 whoami. 승격된 경우에도 결과는 귀하의 도메인 계정이어야 합니다.

또는

PC를 원격으로 관리하고 이미 powershell을 사용하고 있는 경우 세션이 항상 승격되므로 대신 powershell을 사용하여 연결하세요.

Enter-PSSession MyPCName -credential (get-credential -username domain\MyAdmin)
# remote session:
[MyPCName]: PS C:\WINDOWS\system32>

또한 가능하다면 로컬 관리자 계정을 절대 사용하지 않는 것이 좋습니다.

답변2

대체 도구는 무료 sysinternals 도구입니다. PsExec.

명령은 다음과 같습니다:

psexec -u domain\user -h -i command [arguments]

매개변수는 다음과 같습니다.

  • -i: 원격 시스템에서 지정된 세션의 데스크탑과 상호작용하도록 프로그램을 실행합니다. 세션이 지정되지 않으면 프로세스는 콘솔 세션에서 실행됩니다.
  • -h: 대상 시스템이 Vista 이상인 경우 가능한 경우 계정의 승격된 토큰을 사용하여 프로세스를 실행합니다.

안전하지 않은 방법은 비밀번호를 지정하는 것입니다.

-p: 사용자 이름에 대한 선택적 비밀번호를 지정합니다. 이를 생략하면 숨겨진 비밀번호를 입력하라는 메시지가 표시됩니다.

답변3

간단한 해결책은 먼저 도메인 자격 증명이 필요한 위치에서 스크립트를 복사하는 것입니다.당신은 이미 다음 계정으로 로그인되어 있습니다.관리자 권한에서 실행해야 하는 컴퓨터의 로컬 파일 시스템에. 그런 다음 해당 로컬 복사본에서 승격된 스크립트를 대신 실행하십시오.

Start-Process Powershell상승된 실행 중에도 스크립트 논리의 작업을 수행하려면 실행했던 것과 약간 다르게 실행하십시오 . 매개변수를 추가 ExecutionPolicy Bypass -NoProfile -File하고 그 후에 스크립트를 실행하면 작동합니다.

메모:C:\아래 예제 PowerShell 솔루션은 모두 로컬 파일 시스템의 "C" 드라이브 루트를 사용 하지만 이에 맞게 조정할 수 있습니다.

PowerShell(솔루션 1)

Copy-Item "path\to\script.ps1" -Destination "C:\" -Force;
Start-Process Powershell -Argumentlist '-ExecutionPolicy Bypass -NoProfile -File "C:\script.ps1"' -Verb RunAs;

스크립트 경로 위치에 액세스하기 위해 도메인 자격 증명으로 인증해야 하는 경우invoke-command처음에는 매개변수 와 함께 사용하여 -credential복사 작업을 수행 할 수 있습니다 . 그런 다음 해당 방식으로 상승된 로컬 파일 시스템 복사 스크립트를 실행할 수 있습니다.

PowerShell(솔루션 2)

$cred = Get-Credential "domain\username";
Invoke-Command -ScriptBlock {
    Copy-Item "path\to\script.ps1" -Destination "C:\" -Force;
    } -Credential $cred;

Start-Process Powershell -Argumentlist '-ExecutionPolicy Bypass -NoProfile -File "C:\script.ps1"' -Verb RunAs;

지원 리소스

답변4

일반적으로 현재 프로세스의 실행 사용자와 권한은 프로세스가 실행되는 동안에는 변경할 수 없지만, 프로세스 시작 시점에 운영체제 커널에 의해 설정되는 것으로 알고 있습니다.
따라서 관리자 권한으로 실행하려는 코드 블록을 분리하고 RunAs(또는 해당 유효성 검사)를 사용하여 실행해야 합니다.
프로세스 내에서 권한을 변경하는 것이 가능하다면 운영 체제의 매우 위험한 보안 허점이 됩니다.

또한 로컬 권한( local administrator)과 도메인 권한( [domain]\[admin group])이 별도로 정의됩니다. AND 를 모두
허용하려면 다음을 모두 수행해야 합니다.DomainA\User01local administratorDomainA\AdminGroup

  • DomainA\User01로컬 컴퓨터 보안 그룹에 권한 부여 local administrator
  • DomainA\User01도메인 보안 그룹에 부여DomainA\AdminGroup

그런 다음 RunAs를 사용하여 스크립트를 실행합니다.

관련 정보