回答:
現在のコンソールが昇格されておらず、実行しようとしている操作に昇格された特権が必要な場合は、次の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
thenブロックの中に入れます。
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
[Security.Principal.WindowsBuiltInRole]::Administrator)
文字列引数よりも列挙値()を使用する方がよいことに同意します"Administrator"
-名前が変更された組み込みロールを持つセキュリティ強化環境に遭遇しました
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
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
パス相対操作を実行するスクリプトでは、作業ディレクトリを保持することが重要です。他のほとんどすべての回答ではこのパスが保持されないため、残りのスクリプトで予期しないエラーが発生する可能性があります。
自動昇格スクリプト/スニペットを使用せず、代わりに管理者としてスクリプトを起動する簡単な方法が必要な場合(たとえば、エクスプローラーのコンテキストメニューから)、ここにある他の回答を参照してください: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ランタイムはおそらくこれを無視するか、さらに悪いことに、エラーを出します。
管理者以外のユーザーとしてスクリプトを実行すると、次のエラーが発生します。
管理者として実行するための「#requires」ステートメントが含まれているため、スクリプト 'StackOverflow.ps1'を実行できません。現在の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の 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でこれまでずっと機能していたnetセッションに基づく私のシンプルなバージョンはなぜそれを過度に複雑にするのですか?
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
。
右クリックして[プロパティ]をクリックします。他の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の場合)。とをクリックApplyしOKます。
これで、割り当てたボタンの組み合わせを押すだけでUACが呼び出され、[はい]を選択すると、PowerShellコンソールが表示され、タイトルバーに「管理者」が表示されます。
これを行う方法を見つけました...
スクリプトを開くバッチファイルを作成します。
@echo off
START "" "C:\Scripts\ScriptName.ps1"
次に、デスクトップでショートカットを作成します(右クリックして[ 新規 ] -> [ ショートカット])。
次に、これを場所に貼り付けます。
C:\Windows\System32\runas.exe /savecred /user:*DOMAIN*\*ADMIN USERNAME* C:\Scripts\BatchFileName.bat
最初に開くときは、パスワードを1回入力する必要があります。これにより、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(サブシェル)を起動してコマンドを実行するように要求しています。
シェイ・レヴィの答えの上に、以下の設定に従ってください(一度だけ)
PATH
フォルダーに配置します。Windows \ System32フォルダーセットアップ後:
powershell Start-Process powershell -Verb runAs <ps1_file>
すべてを1つのコマンドラインで実行できるようになりました。上記は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
、2つ目を削除しました。また、の最初のコマンドをANDでAND するcd %~dp0
必要がcd /d %~dp0
あり@echo off
ます。この方法では、.ps1
どちらの絶対パスも必要ありません。単にと同じフォルダに配置してください.bat
。結果を確認する必要がある場合は、4番目のパラメーターをに変更します1
。
mshta
コマンドは何でしょうか?
cmd
プロセスを終了して「修正」しないように設計されていますが、必要に応じて変更できてうれしいです。
cmd
(私はしませんでした)を終了したい場合は、OKをクリックします。しかし、他の変更に関しては、修正版だと思います。私のバージョンは私たちの両方では機能しますが、私のバージョンでは機能しません。とにかく、とても賢いアプローチです。
自分のやり方はこれまで見たことがないので、試してみてください。追跡がはるかに簡単で、フットプリントがはるかに小さくなります。
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のベンアームストロングの非常に人気のある方法のバリエーションです。
コマンドの出力を現在の日付を含むテキストファイル名に追加するには、次のようにします。
$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ポップアップが表示されます。