PowerShell을 사용하여 관리자 권한으로 명령을 실행 하시겠습니까?


280

시스템 관리자 인 경우 배치 스크립트를 마우스 오른쪽 버튼으로 클릭하고 관리자 암호를 입력하지 않고 관리자로 실행할 수 있습니까?

PowerShell 스크립트 로이 작업을 수행하는 방법이 궁금합니다. 비밀번호를 입력하고 싶지 않습니다. 마우스 오른쪽 버튼을 클릭하여 실행 관리자 방식 을 모방하고 싶습니다 .

지금까지 읽은 모든 내용은 관리자 암호를 제공해야합니다.


시도하십시오 gsudo. 명령 행에서 관리자로 실행할 수있는 Windows 용 무료 오픈 소스 sudo. UAC 팝업이 나타납니다.
Gerardo Grignoli

답변:


312

현재 콘솔이 상승되어 있지 않고 수행하려는 작업에 상승 된 권한이 필요한 경우 다음 Run as administrator옵션을 사용하여 powershell을 시작할 수 있습니다 .

PS> Start-Process powershell -Verb runAs

1
그것이 성공적으로 수행하는 유일한 방법 인 것 같습니다. 그러나 추가 된 쉘 창은 많은 경우 문제가되는 것으로 판명되었습니다. 나는 스크립트를 관리자로 실행하기 위해 (예 : 레지스트리를 통해) 호출하는 것을 구성했습니다.
Jacek Gorgoń

17
다른 위치에 새 콘솔이 열립니다. 현재 작업 디렉토리에서 관리자로 실행할 수있는 방법이 있습니까?
코드화 된 컨테이너

11
start-process -verb runAs "<cmd>" -argumentlist "<args1> <args2>";)
Dev Anand Sadasivam


1
여기 문서를 찾을 수 있습니다 docs.microsoft.com/en-us/powershell/module/... .exe 파일에 대한은 동사가 될 수 있습니다 : 열기를 RunAs,하여 RunAsUser
케빈 시옹

114

다음은 Shay Levi의 제안에 대한 추가 사항입니다 (스크립트 시작 부분에 다음 행을 추가하십시오).

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))

{   
$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process powershell -Verb runAs -ArgumentList $arguments
Break
}

이로 인해 현재 스크립트가 관리자 모드에서 새 powershell 프로세스로 전달됩니다 (현재 사용자가 관리자 모드에 액세스 할 수 있고 스크립트가 관리자로 시작되지 않은 경우).


6
이것은 나를 위해 일했다 :if (-not (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)))
G. Lombard

관리자로 실행하지 않을 때 오류가 발생하도록 쉽게 수정되었습니다. 그냥 가지고 if문을과를 넣어 throw그 후에 블록 내부.
jpmc26

2
@ G.Lombard의 의견에는 미묘한 구문 오류가 있습니다. 이것은 나를 위해 일한 것입니다 :if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
angularsen

나를 위해 일한 유일한 구문은 G.Lombard 나 anjdreas가 아닌 원래 게시물에 있습니다.
Nicolas Mommaerts

2
[Security.Principal.WindowsBuiltInRole]::Administrator)문자열 값보다 enum 값 ( )을 사용하는 것이 좋습니다. "Administrator"기본 역할 이름이 변경된 보안 강화 환경이 발생했습니다.
eXavier

104

자체 승격 PowerShell 스크립트

Windows 8.1 / PowerShell 4.0 이상

한 줄 :)

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs; exit }

# Your script here

143
글쎄, 기술적으로 말하면, 모든 것이 "한 줄"입니다. 형식이
불법 이민자

3
단점 : 프롬프트에 관리자가 아닌 사람을 입력하면 무한 포크 종료 루프가 종료됩니다.
Manuel Faux

3
그러나 이것은 args를 전달하지 않습니다
kyb

2
인수를 전달하기 위해 다음과 같이 수정했습니다.if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`" `"$args`"" -Verb RunAs; exit }
ab.

2
이 답변은 작업 디렉토리를 유지하지 않습니다. 다음 중 하나를 참조하십시오 : stackoverflow.com/a/57035712/2441655
Venryx

45

Benjamin Armstrong은 자체 상승 PowerShell 스크립트에 대한 훌륭한 기사를 게시했습니다 . 그의 코드에는 몇 가지 사소한 문제가 있습니다. 의견에 제안 된 수정 사항을 기반으로 수정 된 버전은 다음과 같습니다.

기본적으로 현재 프로세스와 관련된 ID를 가져 와서 관리자인지 확인하고, 그렇지 않은 경우 관리자 권한으로 새 PowerShell 프로세스를 만들고 이전 프로세스를 종료합니다.

# Get the ID and security principal of the current user account
$myWindowsID = [System.Security.Principal.WindowsIdentity]::GetCurrent();
$myWindowsPrincipal = New-Object System.Security.Principal.WindowsPrincipal($myWindowsID);

# Get the security principal for the administrator role
$adminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator;

# Check to see if we are currently running as an administrator
if ($myWindowsPrincipal.IsInRole($adminRole))
{
    # We are running as an administrator, so change the title and background colour to indicate this
    $Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Elevated)";
    $Host.UI.RawUI.BackgroundColor = "DarkBlue";
    Clear-Host;
}
else {
    # We are not running as an administrator, so relaunch as administrator

    # Create a new process object that starts PowerShell
    $newProcess = New-Object System.Diagnostics.ProcessStartInfo "PowerShell";

    # Specify the current script path and name as a parameter with added scope and support for scripts with spaces in it's path
    $newProcess.Arguments = "& '" + $script:MyInvocation.MyCommand.Path + "'"

    # Indicate that the process should be elevated
    $newProcess.Verb = "runas";

    # Start the new process
    [System.Diagnostics.Process]::Start($newProcess);

    # Exit from the current, unelevated, process
    Exit;
}

# Run your code that needs to be elevated here...

Write-Host -NoNewLine "Press any key to continue...";
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown");

I / c에 cmd.exe를에서 실행을 감싸 그래서 나는, 스크립트 이름을 받고되지 않았으며 제대로 해결 PARAMS $newProcess = new-object System.Diagnostics.ProcessStartInfo “cmd.exe” $newProcess.Arguments = ‘/c ‘ + [System.Environment]::GetCommandLineArgs() $newProcess.WorkingDirectory = [environment]::CurrentDirectory
xverges

Start-Process 대신 이와 같이하면 이점이 있습니까? 이 방법과 위에 게시 된 다른 방법과 다른 스레드의 차이점에 대해 궁금합니다. 그들은 둘 다 .NET에 의존하지만,이 방법을 더 많이 ...
ZaxLofful

Armstrong의 게시물 (이 게시물의 초기 문장)에 대한 직접 링크와 관련된 다양한 의견이 매우 유용하다는 것을 알았습니다.
BentChainRing

2
이 답변은 작업 디렉토리를 유지하지 않습니다. 다음 중 하나를 참조하십시오 : stackoverflow.com/a/57035712/2441655
Venryx

22

*.bat두 번 클릭하면 관리자 권한으로 powershell 스크립트를 실행 하는 배치 파일 ( )을 만들 수 있습니다 . 이 방법으로 powershell 스크립트에서 아무것도 변경하지 않아도됩니다. 이렇게하려면 powershell 스크립트의 이름과 위치가 같은 배치 파일을 만든 후 다음 내용을 입력하십시오.

@echo off

set scriptFileName=%~n0
set scriptFolderPath=%~dp0
set powershellScriptFileName=%scriptFileName%.ps1

powershell -Command "Start-Process powershell \"-ExecutionPolicy Bypass -NoProfile -NoExit -Command `\"cd \`\"%scriptFolderPath%\`\"; & \`\".\%powershellScriptFileName%\`\"`\"\" -Verb RunAs"

그게 다야!

설명은 다음과 같습니다.

powershell 스크립트가 경로에 있다고 가정하면 C:\Temp\ScriptTest.ps1배치 파일에 경로가 있어야합니다 C:\Temp\ScriptTest.bat. 누군가이 배치 파일을 실행하면 다음 단계가 수행됩니다.

  1. cmd는 명령을 실행합니다

    powershell -Command "Start-Process powershell \"-ExecutionPolicy Bypass -NoProfile -NoExit -Command `\"cd \`\"C:\Temp\`\"; & \`\".\ScriptTest.ps1\`\"`\"\" -Verb RunAs"
  2. 새로운 powershell 세션이 열리고 다음 명령이 실행됩니다.

    Start-Process powershell "-ExecutionPolicy Bypass -NoProfile -NoExit -Command `"cd \`"C:\Temp\`"; & \`".\ScriptTest.ps1\`"`"" -Verb RunAs
  3. 관리 권한이있는 다른 새 powershell 세션이 system32폴더 에서 열리고 다음 인수가 전달됩니다.

    -ExecutionPolicy Bypass -NoProfile -NoExit -Command "cd \"C:\Temp\"; & \".\ScriptTest.ps1\""
  4. 다음 명령은 관리자 권한으로 실행됩니다.

    cd "C:\Temp"; & ".\ScriptTest.ps1"

    스크립트 경로와 이름 인수가 큰 따옴표로 묶이면 공백이나 작은 따옴표 문자 ( ')를 포함 할 수 있습니다 .

  5. 현재 폴더가에서 system32로 변경되고 C:\Temp스크립트 ScriptTest.ps1가 실행됩니다. 매개 변수 -NoExit가 전달 되면 powershell 스크립트에서 예외가 발생하더라도 창은 닫히지 않습니다.


이 작업을 수행하면 PowerShell에서 시스템을 변경할 수 있는지 묻는 팝업 창이 나타납니다. 이로 인해 자동화에 사용할 수 없습니다.
John Slegers

@JohnSlegers, 자동화해야하는 경우 자동화 된 프로세스를 관리자로 실행해야합니다. 사용자 개입없이 관리자가 아닌 프로세스를 관리자 프로세스로 자동으로 상승시킬 수 있다면 프로세스가 관리자 권한을 갖도록 요구하는 목적을 먼저 상실하게됩니다.
meustrus 2016 년

@meustrus : 릴리스 엔지니어 인 저의 업무는 주기적으로 또는 특정 기준을 충족 할 때 완전히 자동으로 실행되는 빌드 프로세스를 작성하고 유지 관리하는 것입니다. 이러한 프로세스 중 일부에는 관리자 권한이 필요하며 사용자 입력이 필요하면이 컨텍스트에서 프로세스를 사용할 수 없습니다. — Linux에서는 sudo명령 을 사용 NOPASSWD: ALL하고 sudoers파일 에서 자동화 된 프로세스에 사용하는 사용자를 구성 하여이를 달성 할 수 있습니다 .
John Slegers

1
이것은 작업 디렉토리를 유지하기 때문에 다른 것보다 더 나은 대답입니다. 이 접근 방식의 한 줄 변형을 여기에 모았습니다 (cmd / batch, 탐색기 컨텍스트 메뉴 항목 및 powershell). stackoverflow.com/a/57033941/2441655
Venryx

17

다음 은 작업 디렉토리를 유지하는 Powershell 스크립트의 자체 상승 스 니펫입니다 .

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Start-Process PowerShell -Verb RunAs "-NoProfile -ExecutionPolicy Bypass -Command `"cd '$pwd'; & '$PSCommandPath';`"";
    exit;
}

# Your script here

경로 관련 작업을 수행하는 스크립트의 경우 작업 디렉토리를 유지하는 것이 중요합니다. 다른 모든 답변은이 경로를 유지하지 않으므로 나머지 스크립트에서 예기치 않은 오류가 발생할 수 있습니다.

자체 상승 스크립트 / 스 니펫을 사용하지 않고 대신 관리자로 스크립트를 시작하는 쉬운 방법을 원한다면 (예 : Explorer 컨텍스트 메뉴에서) https : // stackoverflow .com / a / 57033941 / 2441655


16

사용

#Requires -RunAsAdministrator

아직 언급되지 않았습니다. PowerShell 4.0 이후로만 존재하는 것 같습니다.

http://technet.microsoft.com/en-us/library/hh847765.aspx

이 스위치 매개 변수가 require 문에 추가되면 스크립트를 실행중인 Windows PowerShell 세션을 관리자 권한으로 시작해야합니다 (관리자 권한으로 실행).

나에게 이것은 이것에 관한 좋은 방법처럼 보이지만 아직 현장 경험이 확실하지 않습니다. PowerShell 3.0 런타임은이를 무시하거나 더 나쁜 경우 오류를 발생시킵니다.

스크립트가 비 관리자로 실행되면 다음 오류가 발생합니다.

'StackOverflow.ps1'스크립트에는 관리자로 실행하기위한 "#requires"문이 포함되어 있으므로 실행할 수 없습니다. 현재 Windows PowerShell 세션이 관리자로 실행되고 있지 않습니다. 관리자 권한으로 실행 옵션을 사용하여 Windows PowerShell을 시작한 다음 스크립트를 다시 실행하십시오.

+ CategoryInfo          : PermissionDenied: (StackOverflow.ps1:String) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ScriptRequiresElevation

7
불행히도 쉘에 관리자 권한이 없으면 스크립트가 오류와 함께 실패하게됩니다. 자체적으로 상승하지 않습니다.
Jacek Gorgoń

PS3가 제안한대로 오류를 나타내는 것으로 보입니다. 나는 얻는다 Parameter RunAsAdministrator requires an argument. @akauppi 나는 그들이 항상 생각하고 있다고 확신하지 않습니다.
jpmc26

14

.ps1파일에 대한 "관리자 권한으로 실행"컨텍스트 메뉴를 얻기 위해 일부 레지스트리 항목을 쉽게 추가 할 수 있습니다 .

New-Item -Path "Registry::HKEY_CLASSES_ROOT\Microsoft.PowershellScript.1\Shell\runas\command" `
-Force -Name '' -Value '"c:\windows\system32\windowspowershell\v1.0\powershell.exe" -noexit "%1"'

(@Shay에서 더 간단한 스크립트로 업데이트)

기본적으로 HKCR:\Microsoft.PowershellScript.1\Shell\runas\commandPowershell을 사용하여 스크립트를 호출하도록 기본값 을 설정하십시오.


작동하지 않습니다. '(default)'키 값을 업데이트하지 않고 '(default)'키를 만들고 있습니다. 나는 코드를 하나의 라이너로 압축 할 수있었습니다. 당신은 그것을 테스트 할 수 있습니까? 새 항목-경로 "레지스트리 :: HKEY_CLASSES_ROOT \ Microsoft.PowershellScript.1 \ Shell \ runas \ command"-Force -Name ''-Value ' "c : \ windows \ system32 \ windowspowershell \ v1.0 \ powershell.exe" -noexit "% 1" '
Shay Levy

@Shay Levy-안녕하세요 Shay, 업데이트 된 하나 주셔서 감사합니다. 나는 그것으로 대답을 업데이트했다. 작동합니다. 그러나 내가 일한 것도 장황했지만. Powershell을 사용하여 많은 reg 편집을 수행하지는 않았지만 "(default)"로 수행하는 것은 예제로 보았습니다. 기본 키와 같은 새 키를 만들지 않았지만 기본 키를 예상대로 업데이트했습니다. 당신은 그것을 시도하거나 (default)부분 에서 추측 했습니까 ?
manojlds

나는 그것을 시도했다. 명령 키 아래에 '(기본값)'키를 만들었습니다.
Shay Levy

"c : \ windows \ system32 \ windowspowershell \ v1.0 \ powershell.exe"-ExecutionPolicy RemoteSigned -NoExit "& '% 1'"
MikeBaz-MSFT

1
대답의 레지스트리 값에는 모든 종류의 문제가 있습니다. 실제로 명령을 실행하지 않으며 스크립트 이름을 올바르게 인용하지 않습니다 (공백이있는 경로에서 중단됨). 나는 다음을 성공적으로 사용하고 있습니다."c:\windows\system32\windowspowershell\v1.0\powershell.exe" -noexit -command "& '%1'"
Kal Zekdor

10

Jonathan과 Shay Levy가 게시 한 코드는 나를 위해 작동하지 않았습니다.

아래에서 작업 코드를 찾으십시오.

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{   
#"No Administrative rights, it will display a popup window asking user for Admin rights"

$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process "$psHome\powershell.exe" -Verb runAs -ArgumentList $arguments

break
}
#"After user clicked Yes on the popup, your file will be reopened with Admin rights"
#"Put your code here"

2
매우 유용하고 실용적인 솔루션 : 그냥 내 스크립트에 의존하고 작동합니다.
CDuv

3
@Abatonime 독자의 이익을 위해 차이점을 놓치기 쉬운 방법은 어떻습니까? 솔직히, 그 변화는 다른 답변에 대한 언급보다 가치가 없습니다.
jpmc26

8

관리자 권한으로 스크립트를 다시 실행하고 해당 모드에서 스크립트가 시작되었는지 확인해야합니다. 아래에는 DoElevatedOperationsDoStandardOperations의 두 가지 기능이있는 스크립트를 작성했습니다 . 관리자 권한이 필요한 코드를 첫 번째 코드에 배치하고 표준 작업을 두 번째 코드에 배치해야합니다. IsRunAsAdmin의 변수는 관리자 모드를 식별하는 데 사용됩니다.

내 코드는 Windows 스토어 앱용 앱 패키지를 만들 때 자동으로 생성되는 Microsoft 스크립트에서 추출한 것입니다.

param(
    [switch]$IsRunAsAdmin = $false
)

# Get our script path
$ScriptPath = (Get-Variable MyInvocation).Value.MyCommand.Path

#
# Launches an elevated process running the current script to perform tasks
# that require administrative privileges.  This function waits until the
# elevated process terminates.
#
function LaunchElevated
{
    # Set up command line arguments to the elevated process
    $RelaunchArgs = '-ExecutionPolicy Unrestricted -file "' + $ScriptPath + '" -IsRunAsAdmin'

    # Launch the process and wait for it to finish
    try
    {
        $AdminProcess = Start-Process "$PsHome\PowerShell.exe" -Verb RunAs -ArgumentList $RelaunchArgs -PassThru
    }
    catch
    {
        $Error[0] # Dump details about the last error
        exit 1
    }

    # Wait until the elevated process terminates
    while (!($AdminProcess.HasExited))
    {
        Start-Sleep -Seconds 2
    }
}

function DoElevatedOperations
{
    Write-Host "Do elevated operations"
}

function DoStandardOperations
{
    Write-Host "Do standard operations"

    LaunchElevated
}


#
# Main script entry point
#

if ($IsRunAsAdmin)
{
    DoElevatedOperations
}
else
{
    DoStandardOperations
}

7

내 2 센트 추가하기. Windows 7 / Windows 10에서 지금까지 항상 작동하는 net session을 기반으로 한 간단한 버전입니다. 왜 그렇게 복잡합니까?

if (!(net session)) {$path =  "& '" + $myinvocation.mycommand.definition + "'" ; Start-Process powershell -Verb runAs -ArgumentList $path ; exit}

스크립트 상단에 추가하면 관리자 권한으로 실행됩니다.


1
"액세스가 거부되었습니다"가 표시된 후 사용자에게 메시지를 보내는 방법이 있습니까?
ycomp

... 또는 전혀 메시지를 피하기 위해
Günter Zöchbauer

1
@ GunterZöchbauer if (!(net session 2>&1 | Out-Null)) { ... @ycomp ... } else { echo "your message" }.
Matthieu

이것에 대한 오류를 받고,cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170.
user2305193

1
@ user2305193 Set-ExecutionPolicy -ExecutionPolicy <PolicyName>, 당신은 그것을 설정할 수 있습니다 bypass 그러나 bypass위험 할 수 있습니다. 다음으로 설정AllSigned
AliFurkan

5

이것은 의도적으로 설계된 동작입니다. Microsoft는 .ps1 파일을 최신 전자 메일 바이러스로 사용하고 싶지 않기 때문에 여러 보안 계층이 있습니다. 어떤 사람들은 이것이 작업 자동화라는 개념에 반하는 것으로 알고 있습니다. Vista + 보안 모델은 사물을 "자동화"하여 사용자가 만족하게 만드는 것입니다.

그러나 powershell 자체를 관리자 권한으로 시작하면 powershell을 닫을 때까지 암호를 다시 요청하지 않고 배치 파일을 실행할 수 있어야합니다.


5

관리자 계정이있는 경우 응용 프로그램을 관리자로 강제로 열 수도 있습니다.

여기에 이미지 설명을 입력하십시오

파일, 찾아 마우스 오른쪽 버튼으로 클릭> 속성> 바로 가기> 고급을 하고 확인 관리자 권한으로 실행을

그런 다음 확인을 클릭하십시오.


1
이것을 어떻게 스크립트합니까?
Dieter

4

C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShellPowerShell 의 바로 가기 가있는 위치 입니다. 실제 'exe'( %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe) 를 호출하기 위해 여전히 다른 위치로 이동합니다 .

권한과 관련하여 PowerShell은 사용자 프로필을 기반으로하기 때문에; 사용자 이름 / 프로필에 해당 프로필에서 수행 할 수있는 권한이 있으면 PowerShell에서 일반적으로 수행 할 수도 있습니다. 즉, 사용자 프로필 아래에있는 바로 가기를 변경하는 것이 좋습니다 C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell.

마우스 오른쪽 버튼을 클릭하고 속성을 클릭하십시오. "파일 위치 열기"및 "아이콘 변경"이라는 두 개의 다른 버튼 오른쪽에있는 "설명"텍스트 필드 바로 아래에있는 "바로 가기"탭 아래의 "고급"버튼을 클릭하십시오.

"관리자 권한으로 실행"이라는 확인란을 선택하십시오. 클릭 한 OK다음, ApplyOK. 다시 한번 'Windows PowerShell'에있는 아이콘을 마우스 오른쪽 단추로 클릭하고 C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell"시작 메뉴 / 작업 표시 줄에 고정"을 선택하십시오.

이제 해당 아이콘을 클릭 할 때마다 에스컬레이션을 위해 UAC 가 호출됩니다 . '예'를 선택하면 PowerShell 콘솔이 열리고 화면 상단에 "관리자"라는 레이블이 붙습니다.

한 단계 더 나아가려면 Windows PowerShell의 프로필 위치에서 동일한 아이콘 바로 가기를 마우스 오른쪽 단추로 클릭하고 최근에 추가 한 아이콘을 클릭 한 것과 똑같은 작업을 수행하는 키보드 바로 가기를 할당 할 수 있습니다. "Shortcut Key"라고 표시된 곳에 Ctrl+ Alt+ P P(PowerShell 용) 와 같은 키보드 키 / 버튼 조합을 입력하십시오 . 클릭 Apply하고 OK.

이제 지정한 버튼 조합을 누르면 UAC가 호출되는 것을 볼 수 있으며 'YES'를 선택하면 PowerShell 콘솔이 표시되고 제목 표시 줄에 "관리자"가 표시됩니다.


친구 :) OP의 질문에 키워드는 스크립팅입니다! 일부 UI 마우스 클릭 솔루션이 아닙니다.
Christian

3

나는 이것을 할 수있는 방법을 찾았다.

배치 파일을 만들어 스크립트를 엽니 다.

@echo off
START "" "C:\Scripts\ScriptName.ps1"

그런 다음 바탕 화면에 바로 가기를 만듭니다 ( 새로 만들기 -> 바로 가기 클릭 ).

그런 다음이 위치에 붙여 넣으십시오.

C:\Windows\System32\runas.exe /savecred /user:*DOMAIN*\*ADMIN USERNAME* C:\Scripts\BatchFileName.bat

처음 열 때 비밀번호를 한 번 입력해야합니다. 그러면 Windows 자격 증명 관리자에 저장됩니다.

그런 다음 관리자 이름이나 비밀번호를 입력하지 않아도 관리자로 실행할 수 있습니다.


/ savecred는 안전하지 않습니다!
Nathan Goings 2016 년

이것은 원격 세션에서 액세스 할 수없는 그래픽 표고 프롬프트를 사용하지 않는 유일한 솔루션입니다.
DustWolf

3

@pgk@Andrew Odri 의 대답 의 문제 는 스크립트 매개 변수가있을 때, 특히 필수적 일 때입니다. 다음 방법을 사용하여이 문제를 해결할 수 있습니다.

  1. 사용자는 .ps1 파일을 마우스 오른쪽 단추로 클릭하고 'PowerShell으로 실행'을 선택합니다. 입력 상자를 통해 매개 변수를 요청하십시오 ( HelpMessage 매개 변수 속성을 사용하는 것보다 훨씬 더 나은 옵션입니다 ).
  2. 사용자는 콘솔을 통해 스크립트를 실행합니다. 원하는 매개 변수를 전달하고 콘솔이 강제로 강제로 알려줍니다.

스크립트에 ComputerNamePort 필수 매개 변수 가있는 경우 코드는 다음과 같습니다 .

[CmdletBinding(DefaultParametersetName='RunWithPowerShellContextMenu')]
param (
    [parameter(ParameterSetName='CallFromCommandLine')]
    [switch] $CallFromCommandLine,

    [parameter(Mandatory=$false, ParameterSetName='RunWithPowerShellContextMenu')]
    [parameter(Mandatory=$true, ParameterSetName='CallFromCommandLine')]
    [string] $ComputerName,

    [parameter(Mandatory=$false, ParameterSetName='RunWithPowerShellContextMenu')]
    [parameter(Mandatory=$true, ParameterSetName='CallFromCommandLine')]
    [UInt16] $Port
)

function Assert-AdministrativePrivileges([bool] $CalledFromRunWithPowerShellMenu)
{
    $isAdministrator = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

    if ($isAdministrator)
    {
        if (!$CalledFromRunWithPowerShellMenu -and !$CallFromCommandLine)
        {
            # Must call itself asking for obligatory parameters
            & "$PSCommandPath" @script:PSBoundParameters -CallFromCommandLine
            Exit
        }
    }
    else
    {
        if (!$CalledFromRunWithPowerShellMenu -and !$CallFromCommandLine)
        {
            $serializedParams = [Management.Automation.PSSerializer]::Serialize($script:PSBoundParameters)

            $scriptStr = @"
                `$serializedParams = '$($serializedParams -replace "'", "''")'

                `$params = [Management.Automation.PSSerializer]::Deserialize(`$serializedParams)

                & "$PSCommandPath" @params -CallFromCommandLine
"@

            $scriptBytes = [System.Text.Encoding]::Unicode.GetBytes($scriptStr)
            $encodedCommand = [Convert]::ToBase64String($scriptBytes)

            # If this script is called from another one, the execution flow must wait for this script to finish.
            Start-Process -FilePath 'powershell' -ArgumentList "-ExecutionPolicy Bypass -NoProfile -EncodedCommand $encodedCommand" -Verb 'RunAs' -Wait
        }
        else
        {
            # When you use the "Run with PowerShell" feature, the Windows PowerShell console window appears only briefly.
            # The NoExit option makes the window stay visible, so the user can see the script result.
            Start-Process -FilePath 'powershell' -ArgumentList "-ExecutionPolicy Bypass -NoProfile -NoExit -File ""$PSCommandPath""" -Verb 'RunAs'
        }

        Exit
    }
}

function Get-UserParameters()
{
    [string] $script:ComputerName = [Microsoft.VisualBasic.Interaction]::InputBox('Enter a computer name:', 'Testing Network Connection')

    if ($script:ComputerName -eq '')
    {
        throw 'The computer name is required.'
    }

    [string] $inputPort = [Microsoft.VisualBasic.Interaction]::InputBox('Enter a TCP port:', 'Testing Network Connection')

    if ($inputPort -ne '')
    {
        if (-not [UInt16]::TryParse($inputPort, [ref]$script:Port))
        {
            throw "The value '$inputPort' is invalid for a port number."
        }
    }
    else
    {
        throw 'The TCP port is required.'
    }
}

# $MyInvocation.Line is empty in the second script execution, when a new powershell session
# is started for this script via Start-Process with the -File option.
$calledFromRunWithPowerShellMenu = $MyInvocation.Line -eq '' -or $MyInvocation.Line.StartsWith('if((Get-ExecutionPolicy')

Assert-AdministrativePrivileges $calledFromRunWithPowerShellMenu

# Necessary for InputBox
[System.Reflection.Assembly]::Load('Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a') | Out-Null

if ($calledFromRunWithPowerShellMenu)
{
    Get-UserParameters
}

# ... script code
Test-NetConnection -ComputerName $ComputerName -Port $Port

3

여기에 많은 대답이 가깝지만 필요한 것보다 약간 더 많은 작업이 있습니다.

스크립트 바로 가기를 작성하고 "관리자 권한으로 실행"으로 구성하십시오.

  • 바로 가기를 만듭니다.
  • 마우스 오른쪽 버튼으로 클릭하고 열기 Properties...
  • 편집 Target에서 <script-path>powershell <script-path>
  • 클릭 Advanced...하고 활성화Run as administrator

2

또 다른 간단한 해결책은 "C : \ Windows \ System32 \ cmd.exe"를 마우스 오른쪽 단추로 클릭하고 "관리자 권한으로 실행"을 선택한 다음 암호를 제공하지 않고 모든 앱을 관리자로 실행할 수 있다는 것입니다.


2

아래 솔루션을 사용하고 있습니다. 스크립트 기능을 통해 stdout / stderr을 처리하고 종료 코드를 상위 프로세스에 올바르게 전달합니다. 스크립트 경로 / 파일 이름을 조정해야합니다.

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{ 
  echo "* Respawning PowerShell child process with elevated privileges"
  $pinfo = New-Object System.Diagnostics.ProcessStartInfo
  $pinfo.FileName = "powershell"
  $pinfo.Arguments = "& '" + $myinvocation.mycommand.definition + "'"
  $pinfo.Verb = "RunAs"
  $pinfo.RedirectStandardError = $false
  $pinfo.RedirectStandardOutput = $false
  $pinfo.UseShellExecute = $true
  $p = New-Object System.Diagnostics.Process
  $p.StartInfo = $pinfo
  $p.Start() | Out-Null
  $p.WaitForExit()
  echo "* Child process finished"
  type "C:/jenkins/transcript.txt"
  Remove-Item "C:/jenkins/transcript.txt"
  Exit $p.ExitCode
} Else {
  echo "Child process starting with admin privileges"
  Start-Transcript -Path "C:/jenkins/transcript.txt"
}

# Rest of your script goes here, it will be executed with elevated privileges

이것은 모든 호출 인수를 잃는다
Guillermo Prandi

2

다음은 고급 powershell 명령을 실행하고 단일 명령으로 Windows 배치 파일 내에서 출력 양식을 수집하는 방법입니다 (예 : ps1 powershell 스크립트를 작성하지 않음).

powershell -Command 'Start-Process powershell -ArgumentList "-Command (Get-Process postgres | Select-Object Path | Select-Object -Index 0).Path | Out-File -encoding ASCII $env:TEMP\camp-postgres.tmp" -Verb RunAs'

위에서 당신은 먼저 상승 된 프롬프트로 powershell을 시작한 다음 다른 powershell (sub shell)을 시작하여 명령을 실행하도록 요청합니다.


1

Shay Levy의 답변 위에 아래 설정을 따르십시오 (한 번만)

  1. 관리자 권한으로 PowerShell을 시작하십시오.
  2. PowerShell 오버플로 질문에 따라 "이 시스템에서는 스크립트 실행이 비활성화되어 있습니다." .
  3. PATH예를 들어 .ps1 파일을 임의의 폴더 에 넣습니다 . Windows \ System32 폴더

설정 후 :

  1. Win+를 누르십시오R
  2. 불러 powershell Start-Process powershell -Verb runAs <ps1_file>

이제 하나의 명령 줄로 모든 것을 실행할 수 있습니다. 위의 내용은 Windows 8 Basic 64 비트에서 작동합니다.


1

내가 찾은 가장 신뢰할 수있는 방법은 자체 상승 .bat 파일로 래핑하는 것입니다.

@echo off
NET SESSION 1>NUL 2>NUL
IF %ERRORLEVEL% EQU 0 GOTO ADMINTASKS
CD %~dp0
MSHTA "javascript: var shell = new ActiveXObject('shell.application'); shell.ShellExecute('%~nx0', '', '', 'runas', 0); close();"
EXIT

:ADMINTASKS

powershell -file "c:\users\joecoder\scripts\admin_tasks.ps1"

EXIT

.bat는 이미 관리자인지 확인하고 필요한 경우 스크립트를 관리자로 다시 시작합니다. 또한 4 번째 매개 변수를로 ShellExecute()설정하여 외부 "cmd"창이 열리지 않도록 합니다 0.


좋은 대답이지만 시도했지만 작동하지 않았습니다 (그리고 명령 줄을 종료했습니다). 나는이 방법을 고쳤다 : 나는 첫 번째 EXIT를 a로 바꾸고 두 번째 를 GOTO :EOF삭제했다. 또한 및 뒤에 첫 번째 명령을 배치 cd %~dp0해야 cd /d %~dp0합니다 @echo off. 이 방법 .ps1중 하나 의 절대 경로가 필요하지 않으므로 경로 와 동일한 폴더에 배치하십시오 .bat. 결과를 보려면 4 번째 매개 변수를로 변경하십시오 1.
cdlvcdlv

어떤 O / S 및 버전을 실행 중입니까?
Joe Coder

Windows 7 SP1 Ultimate. 나는 C :에 시스템을 가지고 있지만 D :에 데이터 및 휴대용 응용 프로그램을 주로 가지고 있습니다. 그건 그렇고 ... 프로그램 / 스크립트가 매개 변수를 사용하면 어떻게됩니까? mshta명령 은 무엇입니까 ?
cdlvcdlv 2018 년

스크립트가 제대로 작동하기 때문에 테스트에서 오류가 발생한 것 같습니다. 그건 그렇고, 그것은 cmd"고정"되지 않도록 호출 프로세스 를 종료하도록 설계 되었지만 필요에 따라 수정할 수있어서 기쁩니다.
Joe Coder

당신이 cmd(나는하지 않았다) 를 끝내고 싶다면 좋아 . 그러나 다른 변경 사항에 관해서는 내 버전이 우리 모두에게는 효과가 있지만 내 버전은 더 일반적이지 않습니다 (예 : 다른 드라이브의 시나리오 주소). 어쨌든 매우 영리한 접근입니다.
cdlvcdlv

0

이전에 내 자신의 방식을 보지 못 했으므로 시도해보십시오. 따라 가기가 훨씬 쉽고 발자국이 훨씬 적습니다.

if([bool]([Security.Principal.WindowsIdentity]::GetCurrent()).Groups -notcontains "S-1-5-32-544") {
    Start Powershell -ArgumentList "& '$MyInvocation.MyCommand.Path'" -Verb runas
    }

아주 간단하게 현재 Powershell 세션이 관리자 권한으로 호출 된 경우 현재 ID를 가져 오면 잘 알려진 관리자 그룹 SID가 그룹에 표시됩니다. 계정이 해당 그룹의 구성원 인 경우에도 상승 된 자격 증명으로 프로세스를 호출하지 않으면 SID가 표시되지 않습니다.

거의 모든 대답은 실제로 수행하는 작업을 파악하지 못하고 동일한 루틴을 에뮬레이트하는 방법을 모르는 동안 Microsoft의 Ben Armstrong의 매우 인기있는 방법에 대한 변형입니다.


0

현재 날짜가 포함 된 텍스트 파일 이름에 명령 출력을 추가하려면 다음과 같이 할 수 있습니다.

$winupdfile = 'Windows-Update-' + $(get-date -f MM-dd-yyyy) + '.txt'
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -Command `"Get-WUInstall -AcceptAll | Out-File $env:USERPROFILE\$winupdfile -Append`"" -Verb RunAs; exit } else { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -Command `"Get-WUInstall -AcceptAll | Out-File $env:USERPROFILE\$winupdfile -Append`""; exit }

0

이것은 설명입니다 ...

Powershell RUNAS / SAVECRED 자격 증명은 "안전하지 않습니다", 자격 증명을 시도한 후 자격 증명 캐시에 관리자 ID와 암호를 추가하여 다른 곳에서 OOPS!로 사용할 수 있습니다. 이 작업을 수행 한 경우 항목을 확인하고 제거하는 것이 좋습니다.

Microsoft 정책에 따라 UAC (엔트 포인트)없이 동일한 코드 Blob에 사용자 및 관리자 코드를 혼합하여 프로그램을 관리자로 실행할 수 없으므로 프로그램 또는 코드를 검토하십시오. 이것은 Linux에서 sudo (같은 것)입니다.

UAC에는 프로그램 매니페스트에서 생성되는 프롬프트 또는 진입 점이 아닌 3 가지 유형이 있습니다. 프로그램을 높이 지 않으므로 UAC가없고 관리자가 필요한 경우 실패합니다. UAC는 관리자 요구 사항은 좋지만 인증없이 코드 실행을 방지하고 혼합 코드 시나리오가 사용자 수준에서 실행되는 것을 방지합니다.


이것은 의견이어야하며, 질문에 대한 해결책이 아닙니다 (포럼이 작동하는 방식; 내용은 유용하지만 해결책은 아닙니다).
bgmCoder

-2

너무 쉬웠습니다. 관리자로 cmd를 실행하기 만하면됩니다. 그런 다음 explorer.exeenter를 입력 하고 누르십시오. Windows 탐색기 가 열립니다 . 실행하려는 PowerShell 스크립트를 마우스 오른쪽 버튼으로 클릭하고 "Powershell로 실행"을 선택하면 관리자 모드에서 PowerShell에서 실행됩니다.

정책 실행을 요청하고 Y를 입력하고 Enter 키를 누르십시오. 이제 스크립트는 PowerShell에서 관리자 권한으로 실행됩니다. 모두 빨간색으로 표시되면 정책이 아직 적용되지 않았 음을 의미합니다. 그런 다음 다시 시도하면 정상적으로 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.