낮은 권한으로 powershell에서 탐색기 로드

낮은 권한으로 powershell에서 탐색기 로드

다음과 같은 방식으로 작동하는 Powershell 관리 스크립트가 있습니다.

kill explorer
do things
restart explorer

이 스크립트는 관리자 모드에서 실행되지만 관리자 권한 없이 탐색기를 다시 시작해야 합니다. 어떤 아이디어?

감사해요

답변1

내가 아는 한, 승격된 프로세스에서 승격되지 않은 프로세스(예: 표준 낮은 권한 토큰 사용)를 직접 시작하는 것은 불가능합니다. 이는 PowerShell 제한이 아니라 Windows의 UAC 작동 방식입니다.

에서http://msdn.microsoft.com/en-us/library/windows/desktop/bb756914.aspx:

자주 묻는 질문은 승격된 프로세스에서 승격되지 않은 애플리케이션을 시작하는 방법 또는 더 근본적으로 승격된 프로세스를 실행한 후 승격되지 않은 토큰을 사용하여 프로세스를 시작하는 방법입니다. 이를 수행할 수 있는 직접적인 방법이 없기 때문에 일반적으로 원래 응용 프로그램을 표준 사용자로 시작하고 관리 권한이 필요한 응용 프로그램 부분만 승격시키면 이러한 상황을 피할 수 있습니다. 이렇게 하면 현재 로그온한 데스크톱 사용자로 추가 응용 프로그램을 시작하는 데 사용할 수 있는 승격되지 않은 프로세스가 항상 존재합니다. 그러나 때로는 승격된 프로세스에서 승격되지 않은 다른 애플리케이션을 실행해야 하는 경우도 있습니다. 이는 Windows Vista®의 작업 스케줄러를 사용하여 수행할 수 있습니다. 승격된 프로세스는 현재 로그온한 데스크톱 사용자로 실행할 작업을 등록할 수 있습니다.

해당 기사에서는 두 가지 가능한 솔루션을 언급합니다.

  1. 가능한 한 승격되지 않은 모드에서 많은 스크립트를 실행하고 필요한 부분에 대해서만 승격하세요. 즉, 승격되지 않은 스크립트에서 탐색기를 종료하고 다시 시작하고 승격된 모드에서 두 번째 스크립트를 실행하여 "일을 수행"합니다.

    Stop-Process -ProcessName explorer
    Start-Process PowerShell.exe -Verb Runas -ArgumentList "-File path_to_script\script.ps1"
    Start-Process explorer.exe
    

    동사 Runas를 사용하면 두 번째 PowerShell 프로세스가 관리자 모드에서 시작됩니다. 그러나 이렇게 하면 UAC 프롬프트가 트리거되므로 이 스크립트를 완전히 자동화하여 실행하려면 좋은 솔루션이 아닙니다.

  2. 관리자 권한 작업이 완료되면 탐색기를 시작하는 예약된 작업을 생성하고 작업을 실행한 후 삭제합니다. 당신이 사용할 수있는schtasks.exe이것을하기 위해:

    schtasks /Create /TN "foobar" /TR explorer.exe /SC OnLogon
    schtasks /Run /TN "foobar"
    schtasks /Delete /TN "foobar" /F
    

    다른 작업과 충돌하지 않는 작업 이름을 선택하세요.

위의 두 가지 방법을 결합하여 관리자 모드에서 두 번째 PowerShell 스크립트를 실행하고 나머지는 관리자 모드에서 실행하는 예약된 작업을 만들 수도 있습니다. 이는 UAC 프롬프트를 생성하지 않는다는 장점이 있지만 스크립트에 대한 쓰기 액세스 권한이 있는 사람은 누구나 컴퓨터에서 거의 모든 작업을 수행할 수 있다는 보안 위험이 있습니다. 그러나 현재 스크립트를 얼마나 정확하게 실행하고 향상시키는지에 따라 이는 논쟁의 여지가 있는 문제일 수 있습니다.

세 번째 옵션은 스크립트를 직접 실행하는 경우 자격 증명을 사용하여 새 explorer.exe 프로세스를 시작하도록 구성하는 것입니다.

$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList @("username", (ConvertTo-SecureString -String "password" -AsPlainText -Force))
Start-Process explorer.exe -Credential $Cred

여기서 단점은 비밀번호가 스크립트에 일반 텍스트로 저장되어 있다는 것입니다. PowerShell 프롬프트에 다음을 입력하여 암호화된 형식으로 별도의 파일에 저장할 수도 있습니다.

Read-Host -AsSecureString | ConvertFrom-SecureString | Out-File C:\pw_encrypted.txt

그런 다음 비밀번호를 입력하고(PS 프롬프트에서는 별표로 표시됨) Enter 키를 누르세요. 이제 다음과 같이 스크립트에서 사용할 수 있습니다.

$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList @("username", (Get-Content C:\pw_encrypted.txt | ConvertTo-SecureString))
Start-Process explorer.exe -Credential $Cred

답변2

마음에 떠오르는 유일한 것은 작업 스케줄러를 사용하여 탐색기를 다시 시작하는 것입니다. 시작 프로세스 또는 다른 방법으로 상승된 상태를 유지하는 것 같습니다.

관련 정보