IT story

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

hot-time 2020. 4. 10. 08:20
반응형

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


시스템의 관리자 인 경우 배치 스크립트 인 say를 마우스 오른쪽 단추로 클릭하고 관리자 비밀번호를 입력하지 않고 관리자로 실행할 수있는 방법을 알고 있습니까?

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

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


현재 콘솔이 상승되어 있지 않고 수행하려는 작업에 상승 된 권한이 필요한 경우 "관리자 권한으로 실행"옵션을 사용하여 powershell을 시작할 수 있습니다

PS> Start-Process powershell -Verb runAs

다음은 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 프로세스로 전달됩니다 (현재 사용자가 관리자 모드에 액세스 할 수 있고 스크립트가 관리자로 시작되지 않은 경우).


자체 승격 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

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");

*.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 스크립트에서 예외가 발생하더라도 창은 닫히지 않습니다.


.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을 사용하여 스크립트를 호출하도록 기본값 설정하십시오.


사용

#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

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"

관리자 권한으로 스크립트를 다시 실행하고 해당 모드에서 스크립트가 시작되었는지 확인해야합니다. 아래에는 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
}

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

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

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


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

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

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

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


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 콘솔이 표시되고 제목 표시 줄에 "관리자"가 표시됩니다.


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

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


@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

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

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

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

다음 은 작업 디렉토리를 유지하는 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


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


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

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

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

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

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

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

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

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


아래 솔루션을 사용하고 있습니다. 스크립트 기능을 통해 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

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 비트에서 작동합니다.


내가 찾은 가장 신뢰할 수있는 방법은 자체 상승 .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.


다음은 고급 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)을 시작하여 명령을 실행하도록 요청합니다.


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

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의 매우 인기있는 방법에 대한 변형입니다.


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

$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 }

이것은 설명입니다 ...

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

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

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


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

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

참고 URL : https://stackoverflow.com/questions/7690994/running-a-command-as-administrator-using-powershell

반응형