답변:
현재 콘솔이 상승되어 있지 않고 수행하려는 작업에 상승 된 권한이 필요한 경우 다음 Run as administrator옵션을 사용하여 powershell을 시작할 수 있습니다 .
PS> Start-Process powershell -Verb runAs
start-process -verb runAs "<cmd>" -argumentlist "<args1> <args2>"
;)
다음은 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 프로세스로 전달됩니다 (현재 사용자가 관리자 모드에 액세스 할 수 있고 스크립트가 관리자로 시작되지 않은 경우).
if (-not (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)))
if
문을과를 넣어 throw
그 후에 블록 내부.
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
[Security.Principal.WindowsBuiltInRole]::Administrator)
문자열 값보다 enum 값 ( )을 사용하는 것이 좋습니다. "Administrator"
기본 역할 이름이 변경된 보안 강화 환경이 발생했습니다.
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
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 }
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");
$newProcess = new-object System.Diagnostics.ProcessStartInfo “cmd.exe” $newProcess.Arguments = ‘/c ‘ + [System.Environment]::GetCommandLineArgs() $newProcess.WorkingDirectory = [environment]::CurrentDirectory
*.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
. 누군가이 배치 파일을 실행하면 다음 단계가 수행됩니다.
cmd는 명령을 실행합니다
powershell -Command "Start-Process powershell \"-ExecutionPolicy Bypass -NoProfile -NoExit -Command `\"cd \`\"C:\Temp\`\"; & \`\".\ScriptTest.ps1\`\"`\"\" -Verb RunAs"
새로운 powershell 세션이 열리고 다음 명령이 실행됩니다.
Start-Process powershell "-ExecutionPolicy Bypass -NoProfile -NoExit -Command `"cd \`"C:\Temp\`"; & \`".\ScriptTest.ps1\`"`"" -Verb RunAs
관리 권한이있는 다른 새 powershell 세션이 system32
폴더 에서 열리고 다음 인수가 전달됩니다.
-ExecutionPolicy Bypass -NoProfile -NoExit -Command "cd \"C:\Temp\"; & \".\ScriptTest.ps1\""
다음 명령은 관리자 권한으로 실행됩니다.
cd "C:\Temp"; & ".\ScriptTest.ps1"
스크립트 경로와 이름 인수가 큰 따옴표로 묶이면 공백이나 작은 따옴표 문자 ( '
)를 포함 할 수 있습니다 .
현재 폴더가에서 system32
로 변경되고 C:\Temp
스크립트 ScriptTest.ps1
가 실행됩니다. 매개 변수 -NoExit
가 전달 되면 powershell 스크립트에서 예외가 발생하더라도 창은 닫히지 않습니다.
sudo
명령 을 사용 NOPASSWD: ALL
하고 sudoers
파일 에서 자동화 된 프로세스에 사용하는 사용자를 구성 하여이를 달성 할 수 있습니다 .
다음 은 작업 디렉토리를 유지하는 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
사용
#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
Parameter RunAsAdministrator requires an argument
. @akauppi 나는 그들이 항상 생각하고 있다고 확신하지 않습니다.
.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\command
Powershell을 사용하여 스크립트를 호출하도록 기본값 을 설정하십시오.
(default)
부분 에서 추측 했습니까 ?
"c:\windows\system32\windowspowershell\v1.0\powershell.exe" -noexit -command "& '%1'"
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"
관리자 권한으로 스크립트를 다시 실행하고 해당 모드에서 스크립트가 시작되었는지 확인해야합니다. 아래에는 DoElevatedOperations 및 DoStandardOperations의 두 가지 기능이있는 스크립트를 작성했습니다 . 관리자 권한이 필요한 코드를 첫 번째 코드에 배치하고 표준 작업을 두 번째 코드에 배치해야합니다. 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}
스크립트 상단에 추가하면 관리자 권한으로 실행됩니다.
if (!(net session 2>&1 | Out-Null)) { ...
@ycomp ... } else { echo "your message" }
.
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.
Set-ExecutionPolicy -ExecutionPolicy <PolicyName>
, 당신은 그것을 설정할 수 있습니다 bypass
그러나 bypass
위험 할 수 있습니다. 다음으로 설정AllSigned
C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
PowerShell 의 바로 가기 가있는 위치 입니다. 실제 'exe'( %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe
) 를 호출하기 위해 여전히 다른 위치로 이동합니다 .
권한과 관련하여 PowerShell은 사용자 프로필을 기반으로하기 때문에; 사용자 이름 / 프로필에 해당 프로필에서 수행 할 수있는 권한이 있으면 PowerShell에서 일반적으로 수행 할 수도 있습니다. 즉, 사용자 프로필 아래에있는 바로 가기를 변경하는 것이 좋습니다 C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
.
마우스 오른쪽 버튼을 클릭하고 속성을 클릭하십시오. "파일 위치 열기"및 "아이콘 변경"이라는 두 개의 다른 버튼 오른쪽에있는 "설명"텍스트 필드 바로 아래에있는 "바로 가기"탭 아래의 "고급"버튼을 클릭하십시오.
"관리자 권한으로 실행"이라는 확인란을 선택하십시오. 클릭 한 OK다음, Apply와 OK. 다시 한번 '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 콘솔이 표시되고 제목 표시 줄에 "관리자"가 표시됩니다.
나는 이것을 할 수있는 방법을 찾았다.
배치 파일을 만들어 스크립트를 엽니 다.
@echo off
START "" "C:\Scripts\ScriptName.ps1"
그런 다음 바탕 화면에 바로 가기를 만듭니다 ( 새로 만들기 -> 바로 가기 클릭 ).
그런 다음이 위치에 붙여 넣으십시오.
C:\Windows\System32\runas.exe /savecred /user:*DOMAIN*\*ADMIN USERNAME* C:\Scripts\BatchFileName.bat
처음 열 때 비밀번호를 한 번 입력해야합니다. 그러면 Windows 자격 증명 관리자에 저장됩니다.
그런 다음 관리자 이름이나 비밀번호를 입력하지 않아도 관리자로 실행할 수 있습니다.
@pgk 및 @Andrew Odri 의 대답 의 문제 는 스크립트 매개 변수가있을 때, 특히 필수적 일 때입니다. 다음 방법을 사용하여이 문제를 해결할 수 있습니다.
스크립트에 ComputerName 및 Port 필수 매개 변수 가있는 경우 코드는 다음과 같습니다 .
[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
아래 솔루션을 사용하고 있습니다. 스크립트 기능을 통해 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
다음은 고급 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)을 시작하여 명령을 실행하도록 요청합니다.
Shay Levy의 답변 위에 아래 설정을 따르십시오 (한 번만)
PATH
예를 들어 .ps1 파일을 임의의 폴더 에 넣습니다 . Windows \ System32 폴더설정 후 :
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
.
EXIT
를 a로 바꾸고 두 번째 를 GOTO :EOF
삭제했다. 또한 및 뒤에 첫 번째 명령을 배치 cd %~dp0
해야 cd /d %~dp0
합니다 @echo off
. 이 방법 .ps1
중 하나 의 절대 경로가 필요하지 않으므로 경로 와 동일한 폴더에 배치하십시오 .bat
. 결과를 보려면 4 번째 매개 변수를로 변경하십시오 1
.
mshta
명령 은 무엇입니까 ?
cmd
"고정"되지 않도록 호출 프로세스 를 종료하도록 설계 되었지만 필요에 따라 수정할 수있어서 기쁩니다.
cmd
(나는하지 않았다) 를 끝내고 싶다면 좋아 . 그러나 다른 변경 사항에 관해서는 내 버전이 우리 모두에게는 효과가 있지만 내 버전은 더 일반적이지 않습니다 (예 : 다른 드라이브의 시나리오 주소). 어쨌든 매우 영리한 접근입니다.
이전에 내 자신의 방식을 보지 못 했으므로 시도해보십시오. 따라 가기가 훨씬 쉽고 발자국이 훨씬 적습니다.
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에서 관리자 권한으로 실행됩니다. 모두 빨간색으로 표시되면 정책이 아직 적용되지 않았 음을 의미합니다. 그런 다음 다시 시도하면 정상적으로 작동합니다.
gsudo
. 명령 행에서 관리자로 실행할 수있는 Windows 용 무료 오픈 소스 sudo. UAC 팝업이 나타납니다.