あなたがシステムの管理ユーザーで、あなたが右クリックで言うことができるならば、バッチスクリプトと言うか、そして管理者パスワードを入力せずに管理者としてそれを実行することができるかどうかあなたは知っていますか?
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プロセスに渡されます(現在のユーザーが管理者モードにアクセスでき、スクリプトが管理者として起動されない場合)。
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");
ダブルクリックすると管理者権限でpowershellスクリプトを実行するバッチファイル(*.bat
)を作成できます。このようにすると、 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スクリプトが何らかの例外を投げたとしても、ウィンドウは閉じられません。
いくつかのレジストリエントリを簡単に追加して、.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を使ってスクリプトを呼び出すためのデフォルト値を設定します。
を使う
#Requires -RunAsAdministrator
まだ述べられていない。 PowerShell 4.0以降にのみ存在するようです。
http://technet.Microsoft.com/ja-jp/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"
管理者権限でスクリプトを再実行し、スクリプトがそのモードで起動されたかどうかを確認する必要があります。以下に、2つの機能を持つスクリプトを書きました。 DoElevatedOperations および DoStandardOperations 。管理者権限を必要とするコードを最初のコードに、標準の操作を2番目のコードに配置してください。 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で動作していたネットセッションをベースにした私の簡単なバージョン。
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 PowerShell
は、PowerShellのショートカットがある場所です。それでも、実際の「exe」(%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe
)を呼び出すために別の場所に移動します。
PowerShellはアクセス許可が関係する場合はユーザープロファイル主導型です。あなたのユーザ名/プロファイルがそのプロファイルの下で何かをするパーミッションを持っていれば、PowerShellでは一般的にそれを行うことができるでしょう。そうは言っても、C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
のように、ユーザープロファイルの下にあるショートカットを変更することは理にかなっています。
右クリックして[プロパティ]をクリックします。 [コメント]テキストフィールドのすぐ下にある[ショートカット]タブの下にある[詳細]ボタンをクリックして、それぞれ[ファイルの場所を開く]と[アイコンを変更]の2つのボタンの右側に隣接します。
[管理者として実行]というチェックボックスをオンにします。クリック OKそれから Apply そして OK。 C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
にある 'Windows PowerShell'というラベルの付いたアイコンをもう一度右クリックして、[スタートメニュー/タスクバーに固定]を選択します。
そのアイコンをクリックするたびに、エスカレーションのために UAC が呼び出されます。 [はい]を選択すると、PowerShellコンソールが開き、画面上部に[管理者]というラベルが表示されます。
さらに先へ進むには、Windows PowerShellのプロファイルの場所にある同じアイコンのショートカットを右クリックし、最近追加したアイコンをクリックした場合とまったく同じ動作をするキーボードショートカットを割り当てることができます。 「ショートカットキー」と表示されている箇所では、キーボードのキーとボタンの組み合わせを次のように配置します。Ctrl + Alt + PP (PowerShell用)クリック Apply そして OK。
割り当てたボタンの組み合わせを押すだけでUACが起動し、[はい]を選択するとPowerShellコンソールが表示され、タイトルバーに[Administrator]が表示されます。
これは仕様によるものです。マイクロソフトは実際には.ps1ファイルを最新の電子メールウイルスにすることを望んでいなかったため、セキュリティには複数の層があります。これがタスク自動化の概念に反すると考える人もいますが、これは公平です。 Vista +のセキュリティモデルは、物事を「自動化解除」することで、ユーザーはそれを問題なく実行できます。
ただし、PowerShell自体を昇格した状態で起動した場合は、PowerShellを閉じるまでパスワードを要求しなくてもバッチファイルを実行できるはずです。
ここにいくつかの答えがありますが、必要以上に手間がかかります。
スクリプトへのショートカットを作成し、「管理者として実行」に設定します。
Properties...
を開くTarget
を<script-path>
からpowershell <script-path>
に編集しますRun as administrator
を有効にします私は以下の解決策を使っています。トランスクリプト機能を介して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
@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
以下は、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
作業ディレクトリを保持することは、パス相対操作を実行するスクリプトにとって重要です。他のほとんどすべての回答では、このパスが保持されず、残りのスクリプトで予期しないエラーが発生する可能性があります。
自己昇格スクリプト/スニペットを使用せず、代わりに管理者としてスクリプトを簡単に起動する方法が必要な場合(エクスプローラーのコンテキストメニューなどから)、他の回答はこちらをご覧ください: https ://stackoverflow.com/a/57033941/2441655
私はこれを行う方法を見つけました...
スクリプトを開くためのバッチファイルを作成します。
@echo off
START "" "C:\Scripts\ScriptName.ps1"
それからあなたのデスクトップで、ショートカットを作成します(右クリック 新規 - > ショートカット ).
それからこれを次の場所に貼り付けます。
C:\Windows\System32\runas.exe /savecred /user:*DOMAIN*\*ADMIN USERNAME* C:\Scripts\BatchFileName.bat
最初に開くときは、一度パスワードを入力する必要があります。これにより、Windows資格情報マネージャに保存されます。
この後は、管理者のユーザー名やパスワードを入力しなくても管理者として実行できるはずです。
もう1つの簡単な解決策は、「C:\ Windows\System32\cmd.exe」を右クリックして「管理者として実行」を選択し、パスワードを入力せずに任意のアプリを管理者として実行できることです。
私が見つけた最も信頼できる方法は、それを自己昇格型の.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は、すでに管理者であるかどうかを確認し、必要に応じて管理者としてスクリプトを再起動します。また、ShellExecute()
の4番目のパラメータを0
に設定して、余分な "cmd"ウィンドウが開かないようにします。
Shay Levyの答えに加えて、以下の設定に従ってください(一度だけ)
PATH
フォルダに置きます。 Windows\System32フォルダセットアップ後:
powershell Start-Process powershell -Verb runAs <ps1_file>
を呼び出すこれで、すべてを1つのコマンドラインで実行できます。上記はWindows 8 Basic 64-bitで動作します。
自分のやり方を見たことがないので、試してみてください。それは従うのがずっと簡単で、はるかに小さい足跡を持っています:
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とパスワードをクレデンシャルキャッシュに追加し、他の場所で使用することができましたあなたがこれをしたならば、私はあなたがエントリーをチェックして、取り除くことを勧めます。
Microsoftのポリシーでは、プログラムを管理者として実行するためのUAC(エントリポイント)がないと、同じコードBLOBにユーザーコードと管理者コードを混在させることはできないため、プログラムまたはコードを確認してください。これはLinux上のSudo(同じこと)です。
UACには、プログラムのマニフェストに生成されたdont'see、Prompt、またはエントリポイントの3種類があります。それはプログラムを昇格させないので、UACがなく、管理が必要な場合は失敗します。 UACは管理者の要件としては優れていますが、認証なしでコードが実行されるのを防ぎ、混在コードのシナリオがユーザーレベルで実行されるのを防ぎます。