Trong tập lệnh PowerShell, làm cách nào tôi có thể kiểm tra xem tôi có đang chạy với quyền quản trị viên không?
Trong tập lệnh PowerShell, làm cách nào tôi có thể kiểm tra xem tôi có đang chạy với quyền quản trị viên không?
Câu trả lời:
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
$currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
(từ thủ thuật an toàn dòng lệnh )
Trong Powershell 4.0, bạn có thể sử dụng yêu cầu ở đầu tập lệnh của mình:
#Requires -RunAsAdministrator
Đầu ra:
Tập lệnh 'MyScript.ps1' không thể chạy được vì nó chứa câu lệnh "#requires" để chạy với tư cách Quản trị viên. Phiên Windows PowerShell hiện tại không chạy với tư cách Quản trị viên. Khởi động Windows PowerShell bằng cách sử dụng tùy chọn Run as Administrator, sau đó thử chạy lại tập lệnh.
function Test-Administrator
{
$user = [Security.Principal.WindowsIdentity]::GetCurrent();
(New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}
Thực hiện chức năng trên. NẾU kết quả là True, người dùng có quyền quản trị viên.
Điều này sẽ kiểm tra xem bạn có phải là Quản trị viên hay không, nếu không thì nó sẽ mở lại trong PowerShell ISE với tư cách Quản trị viên.
Hi vọng điêu nay co ich!
$ver = $host | select version
if ($ver.Version.Major -gt 1) {$Host.Runspace.ThreadOptions = "ReuseThread"}
# Verify that user running script is an administrator
$IsAdmin=[Security.Principal.WindowsIdentity]::GetCurrent()
If ((New-Object Security.Principal.WindowsPrincipal $IsAdmin).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) -eq $FALSE)
{
"`nERROR: You are NOT a local administrator. Run this script after logging on with a local administrator account."
# We are not running "as Administrator" - so relaunch as administrator
# Create a new process object that starts PowerShell
$newProcess = new-object System.Diagnostics.ProcessStartInfo "PowerShell_ise";
# Specify the current script path and name as a parameter
$newProcess.Arguments = $myInvocation.MyCommand.Definition;
# 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
}
như một sự kết hợp của các câu trả lời ở trên, bạn có thể sử dụng một cái gì đó như sau khi bắt đầu tập lệnh của mình:
# todo: put this in a dedicated file for reuse and dot-source the file
function Test-Administrator
{
[OutputType([bool])]
param()
process {
[Security.Principal.WindowsPrincipal]$user = [Security.Principal.WindowsIdentity]::GetCurrent();
return $user.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator);
}
}
if(-not (Test-Administrator))
{
# TODO: define proper exit codes for the given errors
Write-Error "This script must be executed as Administrator.";
exit 1;
}
$ErrorActionPreference = "Stop";
# do something
Một phương pháp khác là khởi động Script của bạn với dòng này, điều này sẽ ngăn nó thực thi khi không được bắt đầu với quyền quản trị.
#Requires -RunAsAdministrator