PowerShellを使用して管理者としてコマンドを実行していますか?


280

あなたがシステムの管理ユーザーであり、言う、バッチスクリプトを右クリックして、管理者パスワードを入力せずに管理者として実行する方法を知っていますか?

PowerShellスクリプトでこれを行う方法を知りたいです。パスワードを入力する必要はありません。右クリックして[ 管理者として実行 ] メソッドを模倣したいだけです。

これまでに読んだことはすべて、管理者パスワードを入力することを要求しています。


お試しくださいgsudo。コマンドラインから管理者として実行できるWindows用の無料のオープンソースsudo。UACポップアップが表示されます。
ヘラルドグリニョリ

回答:


310

現在のコンソールが昇格されておらず、実行しようとしている操作に昇格された特権が必要な場合は、次のRun as administratorオプションを使用してPowerShellを起動できます。

PS> Start-Process powershell -Verb runAs

1
それが成功する唯一の方法のようです。ただし、追加されたシェルウィンドウは多くの場合問題があることがわかります。最終的には、スクリプトを呼び出していたものをすべて管理者として実行するように構成しました(たとえば、レジ​​ストリを介して)。
JacekGorgoń2015

17
これにより、別の場所に新しいコンソールが開きます。現在の作業ディレクトリで管理者として実行する方法はありますか?
コード化されたコンテナ

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


1
ドキュメントはこちら:docs.microsoft.com/en-us/powershell/module/….exeファイルの場合、動詞はOpen、RunAs、RunAsUser
Kevin Xiong

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.ロンバード2012

管理者として実行していないときにエラーをスローするように簡単に変更できます。ただifステートメントを取り、throwthenブロックの中に入れます。
jpmc26 2014

2
@ G.Lombardのコメントにわずかな構文エラーがありました。これは私のために働いたものです:if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
angularsen '20年

私のために機能した唯一の構文は元の投稿にあり、G.Lombardやanjdreasによる構文ではありません
Nicolas Mommaerts

1
[Security.Principal.WindowsBuiltInRole]::Administrator)文字列引数よりも列挙値()を使用する方がよいことに同意します"Administrator"-名前が変更された組み込みロールを持つセキュリティ強化環境に遭遇しました
eXavier

105

自己昇格PowerShellスクリプト

Windows 8.1 / PowerShell 4.0以降

1行:)

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

141
まあ、技術的に言えば、そのようにフォーマットされている場合、すべてが「1行」ですが、実際の「1行」にはなりません
違法移民

3
欠点:プロンプトに非管理者と入力すると、無限のfork-exitループが終了します。
Manuel Faux 2016

3
しかし、これは引数を渡しません
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");

スクリプト名とパラメーターが適切に解決されなかったため、実行をcmd.exe / cでラップしました $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

@meustrus:リリースエンジニアとしての私の仕事は、定期的に、または特定の基準が満たされたときに、完全に自動的に実行されるビルドプロセスを作成および維持することです。これらのプロセスの一部には管理者特権が必要であり、ユーザー入力を要求すると、このコンテキストではプロセスが使用できなくなります。— Linuxでは、sudoコマンドを使用しNOPASSWD: ALLて、sudoersファイル内で自動化プロセスに使用するユーザーを設定することにより、これを実現できます
John Slegers

1
これは、作業ディレクトリを保持するため、他の回答よりも良い答えです。このアプローチの1行の変形をここにまとめます(1つはcmd / batch用、1つはExplorerコンテキストメニューエントリ用、もう1つは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

パス相対操作を実行するスクリプトでは、作業ディレクトリを保持することが重要です。他のほとんどすべての回答ではこのパスが保持されないため、残りのスクリプトで予期しないエラーが発生する可能性があります。

自動昇格スクリプト/スニペットを使用せず、代わりに管理者としてスクリプトを起動する簡単な方法が必要な場合(たとえば、エクスプローラーのコンテキストメニューから)、ここにある他の回答を参照してください: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ランタイムはおそらくこれを無視するか、さらに悪いことに、エラーを出します。

管理者以外のユーザーとしてスクリプトを実行すると、次のエラーが発生します。

管理者として実行するための「#requires」ステートメントが含まれているため、スクリプト 'StackOverflow.ps1'を実行できません。現在のWindows PowerShellセッションは、管理者として実行されていません。[管理者として実行]オプションを使用してWindows PowerShellを起動し、スクリプトを再度実行してください。

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

7
残念ながら、シェルに管理者権限がない場合、スクリプトがエラーで失敗するだけです。それ自体は上昇しません。
JacekGorgoń2015

PS3は、提案されているようにエラーを表示するようです。わかりますParameter RunAsAdministrator requires an argument。@akauppi彼らがいつも考えているとは思えません。
jpmc26 2017

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\commandは、Powershellを使用してスクリプトを呼び出すデフォルト値を設定します。


それは機能しません、あなたは「(デフォルト)」キーを作成していて、「(デフォルト)」キー値を更新していません。私は自分のために働くワンライナーにコードを圧縮することができました。テストできますか?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 Levy、

@Shay Levy-こんにちはShay、更新されたものに感謝します。答えを更新しました。それは動作します。しかし、私が働いていたものも冗長でした。私はPowershellで多くのreg編集をしていませんでしたが、「(デフォルト)」でそれを行うことは私が例として見たものでした。新しいキー(デフォルトのようなもの)は作成されませんでしたが、デフォルトのキーは期待どおりに更新されました。試してみましたか、(default)それともその部分から推測しただけですか?
manojlds '10

私はそれを試してみました。コマンドキーの下に「(デフォルト)」キーを作成しました。
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'"
カル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 2014

3
@Abatonime代わりに、読者の利益のために違いを見逃しやすいと指摘してはいかがですか。正直なところ、その変更は他の回答に対するコメント以上の価値はありません。
jpmc26 2017

8

管理者権限でスクリプトを再実行し、スクリプトがそのモードで起動されたかどうかを確認する必要があります。以下では、DoElevatedOperationsDoStandardOperationsの 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
}

7

私の2セントを追加します。Windows 7 / Windows 10でこれまでずっと機能していたnetセッションに基づく私のシンプルなバージョンはなぜそれを過度に複雑にするのですか?

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

スクリプトの先頭に追加するだけで、管理者として実行されます。


1
「アクセスが拒否されました」が表示された後にユーザーにメッセージを送信する方法はありますか?
ycomp

...またはすべてのメッセージを避けるために
ギュンターZöchbauer

1
@GünterZö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 '28

1
@ user2305193 Set-ExecutionPolicy -ExecutionPolicy <PolicyName>、あなたがそれを設定することができますbypass 。しかしbypass、危険かもしれません。設定AllSigned
AliFurkan

5

この動作は仕様です。Microsoftは.ps1ファイルを最新の電子メールウイルスにしたくなかったため、複数のセキュリティ層があります。これは、タスクの自動化という非常に公平な概念に対抗するものだと考える人もいます。Vista +のセキュリティモデルは、物事を「自動化しない」ことで、ユーザーにそれを許可します。

ただし、PowerShell自体を昇格して起動すると、PowerShellを閉じるまで、パスワードを再度要求しなくてもバッチファイルを実行できるはずです。


5

もちろん、管理者アカウントがあれば、アプリケーションを強制的に管理者として開くこともできます。

ここに画像の説明を入力してください

ファイルを見つけ、右クリック>プロパティ>ショートカット>詳細設定およびチェック管理者として実行]を

次にOKをクリックします。


1
これをどのようにスクリプト化しますか?
ディーター

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

右クリックして[プロパティ]をクリックします。他の2つのボタンの右側に隣接する[コメント]テキストフィールドのすぐ下にある[ショートカット]タブの下の[詳細]ボタンをクリックします。それぞれ、[ファイルの場所を開く]と[アイコンの変更]です。

「管理者として実行」というチェックボックスをオンにします。をクリックしてOKから、ApplyをクリックしOKます。もう一度「Windows PowerShell」というラベルの付いたアイコンを右クリックしC:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell、[スタートメニュー/タスクバーに固定]を選択します。

これで、そのアイコンをクリックするたびに、エスカレーションのためにUACが呼び出されます。[はい]を選択すると、PowerShellコンソールが開き、画面の上部に「管理者」というラベルが付けられます。

さらに先に進むには、Windows PowerShellのプロファイルの場所にある同じアイコンのショートカットを右クリックし、最近追加したアイコンをクリックした場合とまったく同じことを行うキーボードショートカットを割り当てることができます。つまり、「ショートカットキー」とあるところには、次のようなキーボードのキー/ボタンの組み合わせを入力します:Ctrl+ Alt+ P P(PowerShellの場合)。とをクリックApplyOKます。

これで、割り当てたボタンの組み合わせを押すだけでUACが呼び出され、[はい]を選択すると、PowerShellコンソールが表示され、タイトルバーに「管理者」が表示されます。


おい:) OPの質問のキーワードはスクリプトです!! 一部のUIマウスクリックソリューションではありません。
クリスチャン

3

これを行う方法を見つけました...

スクリプトを開くバッチファイルを作成します。

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

次に、デスクトップでショートカットを作成します(右クリックして[ 新規 ] -> [ ショートカット])。

次に、これを場所に貼り付けます。

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

最初に開くときは、パスワードを1回入力する必要があります。これにより、Windows資格情報マネージャーに保存されます。

その後、管理者のユーザー名やパスワードを入力しなくても、管理者として実行できるようになります。


/ savecredは安全ではありません!
Nathan Goings

これは、リモートセッションではアクセスできない可能性があるグラフィカルな昇格プロンプトを使用しない唯一のソリューションです。
DustWolf

3

@pgkおよび@Andrew Odriの回答の問題は、スクリプトパラメータがある場合、特に必須の場合です。この問題は、次の方法で解決できます。

  1. ユーザーは.ps1ファイルを右クリックし、[ PowerShellで実行]を選択します。入力ボックスからパラメーターを要求します(これは、HelpMessageパラメーター属性を使用するよりもはるかに優れたオプションです)。
  2. ユーザーはコンソールを介してスクリプトを実行します。必要なパラメーターを渡して、必須のパラメーターをコンソールに強制的に通知させることができます。

スクリプトに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

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

これにより、すべての呼び出し引数が失われます
ギジェルモプランディ

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(サブシェル)を起動してコマンドを実行するように要求しています。


1

シェイ・レヴィの答えの上に、以下の設定に従ってください(一度だけ)

  1. 管理者権限でPowerShellを起動します。
  2. Stack Overflowの質問に従うPowerShellは、「このシステムではスクリプトの実行が無効になっています」と述べています。
  3. たとえば、.ps1ファイルを任意のPATHフォルダーに配置します。Windows \ System32フォルダー

セットアップ後:

  1. Win+を押すR
  2. 呼び出す powershell Start-Process powershell -Verb runAs <ps1_file>

すべてを1つのコマンドラインで実行できるようになりました。上記は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ます。


良い答えですが、試してみましたが機能しませんでした(そして、呼び出し元のコマンドラインを終了しました)。この方法で修正しました。1つ目EXITをa に変更しGOTO :EOF、2つ目を削除しました。また、の最初のコマンドをANDでAND する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 2018年

cmd(私はしませんでした)を終了したい場合は、OKをクリックします。しかし、他の変更に関しては、修正版だと思います。私のバージョンは私たちの両方では機能しますが、私のバージョンでは機能しません。とにかく、とても賢いアプローチです。
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のベンアームストロングの非常に人気のある方法のバリエーションです。


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.exe入力してEnterキーを押します。Windowsエクスプローラーが開きます。実行するPowerShellスクリプトを右クリックし、[PowerShellで実行]を選択すると、管理者モードのPowerShellでスクリプトが起動します。

ポリシーの実行を有効にし、Yと入力してEnterキーを押すように求められる場合があります。これで、スクリプトはPowerShellで管理者として実行されます。すべて赤で実行されている場合は、ポリシーがまだ有効になっていないことを意味します。その後、もう一度お試しください。問題なく動作するはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.