Làm thế nào để chạy tập lệnh powershell với tư cách quản trị viên


56

Trên máy tính để bàn Windows 7 của tôi, tôi có script.ps1, cần đặc quyền quản trị viên (nó bắt đầu một dịch vụ). Tôi muốn nhấp vào tập lệnh này và chạy nó với quyền quản trị viên.

Cách dễ nhất để thực hiện điều này là gì?

Câu trả lời:


48

Đây là một cách để làm điều đó, với sự trợ giúp của một biểu tượng bổ sung trên máy tính để bàn của bạn. Tôi đoán bạn có thể di chuyển tập lệnh của người khác nếu bạn chỉ muốn có một biểu tượng duy nhất trên máy tính để bàn của mình.

  1. Tạo lối tắt đến tập lệnh Powershell trên máy tính để bàn của bạn
  2. Bấm chuột phải vào phím tắt và bấm Thuộc tính
  3. Nhấp vào tab Phím tắt
  4. Nhấp vào Nâng cao
  5. Chọn Chạy với tư cách Quản trị viên

Bây giờ bạn có thể chạy tập lệnh nâng cao bằng cách nhấp đúp vào phím tắt mới trên màn hình của bạn.


35
Điều này hiệu quả với tôi, nhưng Run as Administrator chỉ khả dụng sau khi thêm powershell -f vào trước đường dẫn kịch bản, để "hoàn thành" lệnh Lệnh
mousio

2
@mousio - Tôi cũng cần điều này, cảm ơn vì nhận xét
m.edmondson 18/03/13

@mousio bạn có thể cho tôi biết tại sao lệnh đó hoạt động không?
SShaheen

7
@SShaheen - Để Run as Administrator trở nên khả dụng, phím tắt cần trỏ đến một loại thực thi nào đó (ví dụ powershell.exe) thay vì chỉ tài liệu hoặc tập lệnh mà phím tắt ban đầu được trỏ đến. Một phím tắt để script.ps1hoạt động, cũng như một phím tắt powershell.exe -f script.ps1, nhưng cái sau có thể được thiết lập để chạy với tư cách quản trị viên (xem powershell.exe /?phần giải thích về -fhoặc -Filechuyển đổi)
mousio

16

Trên các hệ thống hỗ trợ UAC, để đảm bảo tập lệnh đang chạy với đầy đủ quyền quản trị viên, hãy thêm mã này vào đầu tập lệnh của bạn:

param([switch]$Elevated)

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

if ((Test-Admin) -eq $false)  {
    if ($elevated) 
    {
        # tried to elevate, did not work, aborting
    } 
    else {
        Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
}

exit
}

'running with full privileges'

khi chạy tập lệnh của bạn với khóa chuyển đổi, nó sẽ cố gắng nâng cao các đặc quyền trước khi chạy.


Nếu script yêu cầu tham số-tham số?
Kiquenet

Điều gì xảy ra nếu điều này cho tôi biết nó đang chạy với đầy đủ đặc quyền, nhưng mã của tôi vẫn nói không đủ đặc quyền quản trị?
mike.b93

@Kiquenet thêm nó vào param(...)đầu và chuyển tiếp chúng ngay trước đó -elevated, bạn sẽ cần khéo léo về cách bạn xây dựng ArgumentList, có thể sẽ muốn sử dụng String[]biểu mẫu.
TWiStErRob

khá tiện lợi - tốt hơn là tạo một lối tắt
Mikey

13

nếu bạn ở cùng quyền hạn, bạn có thể làm điều này:

Start-Process powershell -verb runas -ArgumentList "-file fullpathofthescript"

Vấn đề với điều này là nó thay đổi thư mục làm việc cho tập lệnh được gọi thành C:\Windows\System32. Một thay thế bảo tồn thư mục hiện tại: stackoverflow.com/a/57033941/2441655
Venryx

4

Vì nó đang ngồi trên máy tính để bàn của bạn, tôi muốn nói rằng cách dễ dàng nhất để thực hiện điều này là kéo nó vào tiện ích độ cao .

Nếu không, bạn có thể làm cho một kịch bản riêng biệt sử dụng các elevatelệnh trên kịch bản ps1 của bạn.

Hoặc, bạn có thể elevatechỉ áp dụng cho bit bắt đầu dịch vụ.


1

PowerShell ISE sống ở% Windir% \ system32 \ WindowsPowerShell \ v1.0 \ PowerShell_ISE.exe. Bạn có thể nhấp chuột phải vào đó và chọn "Chạy với tư cách quản trị viên" và chạy tập lệnh từ đó.

Bạn cũng có thể tìm thấy nó trong Logo Windows> Tất cả chương trình> Phụ kiện> Windows PowerShell và làm điều tương tự với các phím tắt đó.



-1

Thêm phần này vào phần đầu của tập lệnh:

$currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
$testadmin = $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
if ($testadmin -eq $false) {
Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
exit $LASTEXITCODE
}

Đây dường như là một tập hợp con của câu trả lời của MDMoore313 , từ hơn bốn năm trước.
Scott
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.