PowerShell betiğinde, yönetici ayrıcalıklarına sahip olup olmadığımı nasıl kontrol edebilirim?


Yanıtlar:


33
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
$currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

( Komut satırı güvenlik hilelerinden )


2
$ currentPrincipal = Yeni Nesne Security.Principal.WindowsPrincipal ([Security.Principal.WindowsIdentity] :: GetCurrent ()) & {if ($ currentPrincipal.IsInRole ([Security.Principal.WindowsBuiltInRole] {) ana bilgisayar) .UI.RawUI.Backgroundcolor = "DarkRed" açık-host yazma-konak:} "Uyarı PowerShell bir Administrator.`n olarak çalışıyor"
davey

İlk satır: son kapanış ayracı) eksik. 6 karakterden az değiştiği için düzeltemiyorum.
Xavier Nicollet

57

Powershell 4.0'da kullanabileceğiniz script'inizi gerektirir :

#Requires -RunAsAdministrator

Çıktılar:

'MyScript.ps1' betiği, Yönetici olarak çalışmak için bir "#requires" ifadesi içerdiğinden çalıştırılamaz. Geçerli Windows PowerShell oturumu Yönetici olarak çalışmıyor. Yönetici Olarak Çalıştır seçeneğini kullanarak Windows PowerShell'i başlatın ve sonra komut dosyasını yeniden çalıştırmayı deneyin.


Tam olarak aradığım şey değildi ama yine de çok faydalı. Eddie’ye teşekkürler!
Michael Kelley

33
function Test-Administrator  
{  
    $user = [Security.Principal.WindowsIdentity]::GetCurrent();
    (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)  
}

Yukarıdaki işlevi yürütün. Sonuç Doğru ise, kullanıcının yönetici ayrıcalıkları vardır.


4
Bu, yalnızca komut dosyasını çalıştıran kullanıcının makinede yönetici olup olmadığını ve komut dosyasının şu anda yönetimsel ayrıcalıklarla yürütülüp yürütülmediğini belirler . Başka bir deyişle, kullanıcı komut kabuğunu başlatmak için "yönetici olarak çalıştır" ı kullanmasa bile, yine de geçerli olacaktır.
Holistic Geliştirici

2
@HolisticDeveloper, bu yanlış. Eğer yükseltilmezseniz, yanlış döndürür
charleswj81 16

@ charleswj81 şu an itibariyle Holistic Developer tarafından açıklanan davranışı gözlemliyorum.
zneak

Yarı kolona ihtiyacın olduğunu sanmıyorum ... ama bu da hata yaptığını sanmadığımı söyledi
Kolob Canyon

Bu benim için 2018’den itibaren Win10’da çalışıyor. Geçerli kullanıcı hesabı yükseltilmezse False döndürür, powershell yükseltilmişse True döndürür.
arberg,

0

Bu bir Yönetici olup olmadığınızı kontrol eder, değilse o zaman PowerShell ISE'de bir Yönetici olarak yeniden açılacaktır.

Bu yardımcı olur umarım!

    $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
    }

0

Yukarıdaki cevapların bir kombinasyonu olarak, betiğinizin başında aşağıdaki gibi bir şey kullanabilirsiniz:

# 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

Komut dosyanızı, bu satırla başlatmaktır; bu, yönetici haklarıyla başlatılmadığında yürütülmesini engelleyecektir.

#Requires -RunAsAdministrator

1
Ne yazık ki, bu işe yaramıyor. Komut dosyası yükseltilmiş haklarla çalıştırılmadıysa, yüklenmeyecek ve özel hata iletinizi görmeyeceksiniz.
JamesQMurphy

Teşekkürler. Yukarıdaki cevabımı düzelttim.
MovGP0
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.