Anda tahu bagaimana jika anda're administrasi pengguna dari sistem dan anda hanya dapat klik kanan mengatakan, batch script dan menjalankannya sebagai Administrator tanpa memasukkan password administrator?
I'm bertanya-tanya bagaimana untuk melakukan hal ini dengan script PowerShell. Aku tidak ingin harus memasukkan password saya; saya hanya ingin meniru klik kanan Jalankan Sebagai Administrator metode.
Segala sesuatu yang saya baca sejauh ini mengharuskan anda untuk menyediakan password administrator.
Berikut ini adalah sebuah tambahan untuk Shay Levi's saran (hanya menambahkan baris ini pada awal script):
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
}
Hasil ini dalam script saat ini sedang berlalu baru powershell proses dalam mode Administrator (jika saat ini Pengguna memiliki akses ke mode Administrator dan script tidak diluncurkan sebagai Administrator).
Windows 8.1 / PowerShell 4.0 +
Salah satu line :)
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 diposting baik artikel tentang self-elevating PowerShell script. Ada beberapa masalah kecil dengan kode nya, versi modifikasi berdasarkan perbaikan yang disarankan dalam komentar di bawah ini.
Pada dasarnya itu akan identitas yang terkait dengan proses saat ini, cek apakah administrator, dan jika isn't, menciptakan baru PowerShell proses dengan hak administrator dan mengakhiri proses yang lama.
# 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");
Anda dapat membuat batch file (*.bat
) yang menjalankan powershell script dengan hak akses administratif ketika diklik dua kali. Dengan cara ini, anda tidak perlu mengubah apa pun di powershell script.Untuk melakukan ini, membuat batch file dengan nama yang sama dan lokasi anda powershell script dan kemudian menempatkan konten berikut di dalamnya:
@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"
Yang's itu!
Berikut adalah penjelasannya:
Dengan asumsi anda powershell script di jalan C:\Temp\ScriptTest.ps1
, file batch anda harus memiliki jalur C:\Temp\ScriptTest.bat
. Ketika seseorang menjalankan file batch ini, langkah-langkah berikut akan terjadi:
powershell -Perintah "Mulai Proses powershell \"-ExecutionPolicy Bypass-NoProfile -disk drive security -Perintah \"cd \
\"C:\Temp`\"; & `\".\ScriptTest.ps1`\"`\"\" kata Kerja RunAs"
Mulai Proses powershell "-ExecutionPolicy Bypass-NoProfile -disk drive security -Perintah "cd \
"C:\Temp`"; & `".\ScriptTest.ps1`"`"," kata Kerja RunAs
-ExecutionPolicy Bypass-NoProfile -disk drive security -Perintah "cd \"C:\Temp\"; & \".\ScriptTest.ps1\""
cd "C:\Temp"; & ".\ScriptTest.ps1"
Setelah script path dan nama argumen ganda dikutip, mereka dapat berisi spasi atau tanda kutip tunggal karakter ('
).
system32
untuk C:\Temp
dan script ScriptTest.ps1
akan dieksekusi. Setelah parameter -disk drive security
disahkan, jendela tidak bisa ditutup, bahkan jika anda powershell script melempar beberapa pengecualian.Anda dapat dengan mudah menambahkan beberapa entri registry untuk mendapatkan "Run as administrator" menu konteks untuk .ps1
files:
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"'
(diperbarui untuk lebih sederhana script dari @Shay)
Pada dasarnya di HKCR:\Microsoft.PowershellScript.1\Shell\runas\command
set nilai default untuk memanggil script menggunakan Powershell.
Menggunakan
#Membutuhkan -RunAsAdministrator
yang belum tercantum, belum. Tampaknya ada hanya karena PowerShell 4.0.
http://technet.microsoft.com/en-us/library/hh847765.aspx
Saat ini beralih parameter ditambahkan ke anda membutuhkan pernyataan, hal itu menunjukkan bahwa sesi Windows PowerShell di mana anda berada menjalankan script harus dimulai dengan peningkatan hak-hak pengguna (Run as Administrator).
Untuk saya, ini tampak seperti cara yang baik untuk pergi tentang ini, tapi saya'm tidak yakin dari pengalaman lapangan, belum. PowerShell 3.0 runtimes mungkin mengabaikan hal ini, atau bahkan lebih buruk, memberikan sebuah kesalahan.
Ketika script dijalankan sebagai non-administrator, kesalahan berikut ini diberikan:
script 'StackOverflow.ps1' tidak dapat dijalankan karena mengandung "#membutuhkan" pernyataan untuk menjalankan sebagai Administrator. Saat ini Windows PowerShell sesi ini tidak berjalan sebagai Administrator. Mulai Windows PowerShell dengan menggunakan Run as Administrator pilihan, dan kemudian mencoba menjalankan script lagi.
- CategoryInfo : PermissionDenied: (StackOverflow.ps1:String) [], ParentContainsErrorRecordException
- FullyQualifiedErrorId : ScriptRequiresElevation
Kode diposting oleh Jonathan dan Shay Retribusi tidak bekerja untuk saya.
Silakan cari kerja kode di bawah ini:
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"
Yang perlu anda jalankan script dengan hak akses administratif dan memeriksa apakah script diluncurkan dalam mode tersebut. Di bawah ini saya telah menulis sebuah script yang memiliki dua fungsi: DoElevatedOperations dan DoStandardOperations. Anda harus menempatkan kode anda yang membutuhkan hak admin menjadi yang pertama dan standar operasi kedua. Yang IsRunAsAdmin variabel ini digunakan untuk mengidentifikasi mode admin.
Kode saya adalah aplikasi sederhana ekstrak dari Microsoft script yang dibuat secara otomatis ketika anda membuat sebuah paket aplikasi untuk Windows Store apps.
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
}
Menambahkan saya 2 sen. Versi sederhana saya berdasarkan net sesi yang bekerja sepanjang waktu sejauh ini di Windows 7 / Windows 10. Mengapa lebih menyulitkan itu?
if (!(net session)) {$path = "& '" + $myinvocation.mycommand.definition + "'" ; Start-Process powershell -Verb runAs -ArgumentList $path ; exit}
hanya menambahkan ke atas naskah dan itu akan jalankan sebagai administrator.
Berikut ini's a self-elevating snippet untuk Powershell script yang memelihara direktori kerja:
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
Melestarikan direktori kerja adalah penting untuk script yang melakukan jalan-relatif operasi. Hampir semua jawaban yang lain tidak menjaga jalan ini, yang dapat menyebabkan kesalahan tak terduga di seluruh naskah.
Jika anda'd agak tidak menggunakan self-elevating script/cuplikan, dan bukan hanya ingin cara mudah untuk memulai sebuah script sebagai administrator (misalnya. dari Explorer menu konteks), lihat saya yang lain jawabannya di sini: https://stackoverflow.com/a/57033941/2441655
Anda juga dapat memaksa aplikasi untuk buka sebagai administrator, jika anda memiliki akun administrator, tentu saja.
Cari file, ke kanan klik > sifat > Shortcut > Advanced dan memeriksa Run sebagai Administrator
Kemudian Klik OK.
C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
adalah di mana jalan pintas PowerShell berada. Itu juga masih pergi ke lokasi yang berbeda untuk memohon aktual 'exe' (%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe
).
Sejak PowerShell adalah profil pengguna yang didorong ketika izin yang bersangkutan; jika username anda/profil memiliki izin untuk melakukan sesuatu maka bawah profil, di PowerShell anda umumnya akan mampu melakukan itu juga. Bahwa menjadi kata, itu akan masuk akal bahwa anda akan mengubah cara pintas yang terletak di bawah profil pengguna anda, misalnya, C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
.
Klik kanan dan klik properties. Klik "Maju" tombol di bawah "Shortcut" tab yang terletak tepat di bawah "Komentar" text field yang berdekatan ke kanan dari dua tombol lainnya, "Buka Lokasi File" dan "Mengubah Icon", masing-masing.
Centang checkbox yang berbunyi, "Run as Administrator". Klik OK, maka Menerapkan dan OK. Sekali lagi klik kanan ikon berlabel 'Windows PowerShell' terletak di C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
dan pilih "Pin to Start Menu/Taskbar".
Sekarang setiap kali anda klik pada ikon tersebut, maka akan memanggil UAC untuk eskalasi. Setelah memilih 'YA', anda akan melihat konsol PowerShell terbuka dan itu akan berlabel "Administrator" pada bagian atas layar.
Untuk melangkah lebih jauh... anda bisa klik kanan yang sama, icon shortcut di profil anda, lokasi dari Windows PowerShell dan menetapkan cara pintas keyboard yang akan melakukan hal yang sama dengan jika anda mengklik baru-baru ini menambahkan ikon. Jadi, di mana ia mengatakan "Tombol Pintas" dimasukkan ke dalam tombol keyboard/tombol kombinasi seperti: Pilih + Alt + PP (untuk PowerShell). Klik Menerapkan dan OK.
Sekarang semua harus anda lakukan adalah tekan kombinasi tombol yang anda tetapkan dan anda akan melihat UAC dapatkan dipanggil, dan setelah anda pilih 'YA' anda akan melihat sebuah konsol PowerShell muncul dan "Administrator" yang ditampilkan pada title bar.
Perilaku ini adalah dengan desain. Ada beberapa lapisan keamanan sejak Microsoft benar-benar tidak't ingin .ps1 file virus email terbaru. Beberapa orang menemukan ini menjadi bertentangan dengan gagasan tentang tugas otomatisasi, yang adil. Vista+ model keamanan adalah untuk "de-mengotomatisasi" hal-hal, sehingga membuat pengguna baik-baik saja mereka.
Namun, saya menduga jika anda meluncurkan powershell dirinya sebagai ditinggikan, itu harus mampu menjalankan batch file tanpa meminta password lagi sampai anda menutup powershell.
Sejumlah jawaban di sini adalah dekat, tapi sedikit lebih banyak pekerjaan dari yang dibutuhkan.
Membuat shortcut untuk script anda dan mengkonfigurasi untuk "Run as Administrator":
Properties...
Target
dari <script-jalan>
untuk powershell <script-jalan>
Run as administrator
Masalah dengan @pgk dan @Andrew Odri's jawaban adalah bila anda memiliki script parameter, khususnya ketika mereka wajib. Anda dapat memecahkan masalah ini dengan menggunakan pendekatan sebagai berikut:
Berikut adalah cara yang akan jika kode script punya ComputerName dan Pelabuhan wajib parameter:
[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
Saya menggunakan solusi di bawah ini. Menangani stdout/stderr melalui transkrip fitur dan berlalu keluar kode dengan benar untuk proses induk. Anda perlu menyesuaikan transkrip path/filename.
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
Saya telah menemukan cara untuk melakukan hal ini...
Membuat batch file untuk membuka script:
@echo off
START "" "C:\Scripts\ScriptName.ps1"
Kemudian membuat shortcut pada desktop anda katakan (klik kanan New -> jalan Pintas).
Kemudian paste ke lokasi:
C:\Windows\System32\runas.exe /savecred /user:*DOMAIN*\*ADMIN USERNAME* C:\Scripts\BatchFileName.bat
Ketika pertama kali membuka, anda harus memasukkan password anda sekali. Hal ini kemudian akan menyimpannya di Windows credential manager.
Setelah ini maka anda harus mampu jalankan sebagai administrator tanpa harus memasukkan administrator username atau password.
Berikut adalah cara untuk menjalankan perintah powershell ditinggikan dan mengumpulkan output dalam bentuk windows batch file dalam satu perintah(saya.e tidak menulis ps1 script powershell).
powershell -Perintah 'Start-Proses powershell -ArgumentList "-Perintah (Get-Proses postgres | Pilih-Objek Path | Pilih-Objek -Indeks 0).Jalan Keluar | -File -encoding ASCII $env:TEMP\camp-postgres.tmp" kata Kerja RunAs'
Di atas anda melihat saya pertama kali meluncurkan powershell dengan peningkatan prompt dan kemudian meminta untuk meluncurkan powershell(sub kulit) untuk menjalankan perintah.