Phát hiện nếu PowerShell đang chạy với tư cách quản trị viên


36

Làm cách nào tôi có thể biết trong tập lệnh của mình nếu PowerShell đang chạy với quyền quản trị viên?

Tôi cần biết vì tôi đang cố chạy một chương trình yêu cầu khả năng mở các cổng được bảo vệ.


1
Bạn sẽ cân nhắc nâng cao quyền như được mô tả trong các đặc quyền của quản trị viên trong câu trả lời của PowerShell
MiFreidgeim SO-stop là xấu xa

Câu trả lời:


42
[bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).groups -match "S-1-5-32-544")

Phá vỡ những gì nó làm:

  • [bool]- Truyền kết quả cuối cùng cho a bool.
  • [System.Security.Principal.WindowsIdentity]::GetCurrent()- Lấy ra WindowsIdentitycho người dùng hiện đang chạy.
  • (...).groups- Truy cập thuộc groupstính của danh tính để tìm hiểu những nhóm người dùng mà danh tính là thành viên.
  • -match "S-1-5-32-544"kiểm tra xem groupscó chứa SID được biết đến của nhóm Quản trị viên hay không, danh tính sẽ chỉ chứa nó nếu "chạy với tư cách quản trị viên" được sử dụng.

1
Thay vì chỉ đăng một dòng mã, bạn có thể vui lòng giải thích những gì nó làm? Điều này giúp khách truy cập trong tương lai hiểu và thích nghi với nó, nếu cần thiết.
slhck

SÁCH. Cung cấp cho người đàn ông này nhiều hơn nữa
Kolob Canyon

4
Tôi thích câu trả lời của @Bill_Stewart bên dưới vì nó không có chuỗi ma thuật.
8DH

Thay vì sử dụng -matchvà typecasting:[Security.Principal.WindowsIdentity]::GetCurrent().Groups -contains 'S-1-5-32-544'
TheIncorritable1

57
([Security.Principal.WindowsPrincipal] `
  [Security.Principal.WindowsIdentity]::GetCurrent() `
).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

Điều này lấy ra danh tính Windows hiện tại và trả về True nếu danh tính hiện tại có vai trò Quản trị viên (nghĩa là đang chạy ở mức cao).


13
Mặc dù câu trả lời được chấp nhận là chính xác, câu trả lời này rõ ràng hơn nhiều, đặc biệt là với người có thể đọc kịch bản của bạn sáu tháng kể từ bây giờ.
Patrick Seymour

46

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.


Điều gì nếu bạn muốn một chức năng thoát nếu không được quản trị viên chạy?
Hẻm núi Kolob

1
@KolobCanyon - Không có thứ gì chỉ chạy chức năng PowerShell được nâng lên; toàn bộ quá trình PowerShell được nâng lên hoặc không.
Bill_Stewart

@Bill_Stewart có, nhưng bạn có thể returnnếu người dùng không phải là quản trị viên :)
Kolob Canyon

1
@KolobCanyon - bạn chỉ có thể nâng cao quy trình PowerShell ; bạn không thể nâng một chức năng duy nhất . Đó là lý do tại sao #Requires -RunAsAdministratornó hữu ích: Nó ngăn toàn bộ tập lệnh chạy nếu bạn không nâng cao.
Bill_Stewart

@Bill_Stewart Vâng, tôi sẽ phải sử dụng nó vào một lúc nào đó.
Hẻm núi Kolob
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.