Làm thế nào để cấu hình Windows để làm việc với kịch bản PowerShell dễ dàng hơn

Mục lục:

Làm thế nào để cấu hình Windows để làm việc với kịch bản PowerShell dễ dàng hơn
Làm thế nào để cấu hình Windows để làm việc với kịch bản PowerShell dễ dàng hơn

Video: Làm thế nào để cấu hình Windows để làm việc với kịch bản PowerShell dễ dàng hơn

Video: Làm thế nào để cấu hình Windows để làm việc với kịch bản PowerShell dễ dàng hơn
Video: Lắp Thêm Bộ Phát WiFi Phụ Nhưng Không Sử Dụng Được nguyên nhân do đâu - YouTube 2024, Có thể
Anonim
Windows và PowerShell có các tính năng bảo mật tích hợp và cấu hình mặc định nhằm ngăn chặn người dùng cuối vô tình khởi chạy tập lệnh trong quá trình hoạt động hàng ngày của họ. Tuy nhiên, nếu các hoạt động hàng ngày của bạn thường xuyên liên quan đến việc viết và chạy các kịch bản PowerShell của riêng bạn, điều này có thể gây phiền toái hơn là một lợi ích. Ở đây, chúng tôi sẽ hướng dẫn bạn cách làm việc xung quanh các tính năng này mà không ảnh hưởng hoàn toàn đến bảo mật.
Windows và PowerShell có các tính năng bảo mật tích hợp và cấu hình mặc định nhằm ngăn chặn người dùng cuối vô tình khởi chạy tập lệnh trong quá trình hoạt động hàng ngày của họ. Tuy nhiên, nếu các hoạt động hàng ngày của bạn thường xuyên liên quan đến việc viết và chạy các kịch bản PowerShell của riêng bạn, điều này có thể gây phiền toái hơn là một lợi ích. Ở đây, chúng tôi sẽ hướng dẫn bạn cách làm việc xung quanh các tính năng này mà không ảnh hưởng hoàn toàn đến bảo mật.

Làm thế nào và tại sao Windows & PowerShell ngăn chặn thực thi tập lệnh.

PowerShell có hiệu quả là lệnh shell và ngôn ngữ kịch bản nhằm thay thế các kịch bản lệnh CMD và hàng loạt trên các hệ thống Windows. Như vậy, một kịch bản PowerShell có thể được cấu hình khá nhiều để làm bất cứ điều gì bạn có thể làm bằng tay từ dòng lệnh. Điều đó tương đương với việc thực tế mọi thay đổi có thể xảy ra trên hệ thống của bạn, tùy thuộc vào các hạn chế trong tài khoản người dùng của bạn. Vì vậy, nếu bạn chỉ có thể nhấp đúp vào một tập lệnh PowerShell và chạy nó với đầy đủ đặc quyền của Quản trị viên, một lớp lót đơn giản như thế này thực sự có thể phá hỏng ngày của bạn:

Get-ChildItem '$env:SystemDrive' -Recurse -ErrorAction SilentlyContinue | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue

KHÔNG chạy lệnh trên!

Điều đó chỉ đơn giản là đi qua hệ thống tập tin và xóa bất cứ điều gì nó có thể. Điều thú vị là điều này có thể không làm cho hệ thống không hoạt động nhanh như bạn nghĩ - ngay cả khi chạy từ một phiên cao. Nhưng nếu ai đó gọi cho bạn sau khi chạy tập lệnh này, vì họ đột nhiên không thể tìm thấy tệp của họ hoặc chạy một số chương trình, “tắt và bật lại” có thể sẽ dẫn họ đến Windows Startup Repair nơi họ sẽ được thông báo không có gì có thể được thực hiện để khắc phục vấn đề. Điều gì có thể tồi tệ hơn, thay vì nhận được một kịch bản mà chỉ cần trashes hệ thống tập tin của họ, bạn của bạn có thể bị lừa chạy một tải xuống và cài đặt một keylogger hoặc dịch vụ truy cập từ xa. Sau đó, thay vì hỏi bạn những câu hỏi về Startup Repair, họ có thể sẽ hỏi cảnh sát một số câu hỏi về gian lận ngân hàng!

Bởi bây giờ nó phải được rõ ràng lý do tại sao những thứ nhất định là cần thiết để bảo vệ người dùng cuối của mình, do đó, để nói chuyện. Nhưng người sử dụng điện, quản trị viên hệ thống và những chuyên viên khác thường là những người có nguy cơ bị các mối đe dọa này, biết cách phát hiện và dễ dàng tránh chúng, và chỉ muốn tiếp tục công việc của mình. Để thực hiện việc này, họ sẽ phải vô hiệu hóa hoặc làm việc xung quanh một vài khối đường:

  • PowerShell không cho phép thực thi tập lệnh bên ngoài theo mặc định. Cài đặt ExecutionPolicy trong PowerShell ngăn chặn việc thực thi các tập lệnh bên ngoài theo mặc định trong tất cả các phiên bản của Windows. Trong một số phiên bản Windows, mặc định không cho phép thực thi tập lệnh. Chúng tôi đã chỉ cho bạn cách thay đổi cài đặt này trong Cách cho phép thực thi tập lệnh PowerShell trên Windows 7, nhưng chúng tôi cũng sẽ giới thiệu cho bạn một số cấp ở đây.
  • PowerShell không được liên kết với phần mở rộng tệp.PS1 theo mặc định. Ban đầu chúng tôi đã đưa điều này lên trong loạt bài học PowerShell Geek của chúng tôi. Windows đặt hành động mặc định cho các tệp.PS1 để mở chúng trong Notepad, thay vì gửi chúng tới trình thông dịch lệnh PowerShell. Điều này nhằm trực tiếp ngăn chặn việc thực thi tình cờ các tập lệnh độc hại khi chúng chỉ đơn giản là nhấp đúp.
  • Một số tập lệnh PowerShell sẽ không hoạt động nếu không có quyền Quản trị viên. Ngay cả khi đang chạy với tài khoản cấp quản trị viên, bạn vẫn cần phải vượt qua Kiểm soát tài khoản người dùng (UAC) để thực hiện một số hành động nhất định. Đối với các công cụ dòng lệnh, điều này có thể hơi cồng kềnh để nói ít nhất. Chúng tôi không muốn vô hiệu hóa UAC, nhưng vẫn tốt đẹp khi chúng tôi có thể giải quyết dễ dàng hơn một chút.

Những vấn đề tương tự được đưa ra trong Cách sử dụng tệp hàng loạt để làm cho tập lệnh PowerShell dễ dàng hơn để chạy, nơi chúng tôi hướng dẫn bạn bằng cách viết một tệp lô để tạm thời thu thập chúng. Bây giờ, chúng tôi sẽ chỉ cho bạn cách thiết lập hệ thống của bạn với giải pháp lâu dài hơn. Lưu ý rằng bạn thường không nên thực hiện những thay đổi này trên các hệ thống không được bạn sử dụng độc quyền - nếu không, bạn đang đặt những người dùng khác có nguy cơ cao gặp phải sự cố tương tự các tính năng này nhằm ngăn chặn.

Thay đổi liên kết tệp.PS1.

Đầu tiên, và có lẽ quan trọng nhất, phiền toái để có được xung quanh là liên kết mặc định cho các tệp.PS1. Việc kết hợp các tệp này với bất kỳ thứ gì khác ngoài PowerShell.exe có ý nghĩa để ngăn việc thực thi tình cờ các tập lệnh không mong muốn. Nhưng, xem xét PowerShell đi kèm với một môi trường kịch bản tích hợp (ISE) được thiết kế đặc biệt để chỉnh sửa các kịch bản PowerShell, tại sao chúng ta muốn mở các tệp.PS1 trong Notepad theo mặc định? Ngay cả khi bạn chưa sẵn sàng chuyển đổi hoàn toàn để bật chức năng nhấp đúp để chạy, có thể bạn sẽ muốn tinh chỉnh các cài đặt này.

Bạn có thể thay đổi liên kết tệp.PS1 thành bất kỳ chương trình nào bạn muốn bằng bảng điều khiển Chương trình Mặc định, nhưng việc đào sâu trực tiếp vào Registry sẽ giúp bạn kiểm soát chính xác hơn cách các tệp sẽ được mở. Điều này cũng cho phép bạn đặt hoặc thay đổi các tùy chọn bổ sung có sẵn trong trình đơn ngữ cảnh cho các tệp.PS1. Đừng quên sao lưu sổ đăng ký trước khi bạn thực hiện việc này!

Cài đặt đăng ký kiểm soát cách mở tập lệnh PowerShell ở vị trí sau:

HKEY_CLASSES_ROOTMicrosoft.PowerShellScript.1Shell

Để khám phá các cài đặt này trước khi chúng tôi thay đổi chúng, hãy xem khóa đó và các khóa con của nó bằng Regedit. Khóa Shell chỉ có một giá trị, “(Mặc định)”, được đặt thành “Mở”. Đây là con trỏ đến hành động mặc định cho việc nhấp đúp vào tệp mà chúng ta sẽ thấy trong các khóa phụ.

Mở rộng khóa Shell và bạn sẽ thấy ba khóa phụ. Mỗi trong số này đại diện cho một hành động mà bạn có thể thực hiện cụ thể cho các kịch bản PowerShell.

Bạn có thể mở rộng từng khóa để khám phá các giá trị bên trong, nhưng về cơ bản chúng tương đương với các giá trị mặc định sau:
Bạn có thể mở rộng từng khóa để khám phá các giá trị bên trong, nhưng về cơ bản chúng tương đương với các giá trị mặc định sau:
  • 0 - Chạy bằng PowerShell. "Chạy với PowerShell" thực sự là tên của một tùy chọn đã có trong menu ngữ cảnh cho các kịch bản PowerShell. Văn bản chỉ được kéo từ một vị trí khác thay vì sử dụng tên khóa như những người khác. Và nó vẫn không phải là hành động nhấp đúp mặc định.
  • Chỉnh sửa - Mở trong PowerShell ISE. Điều này có ý nghĩa hơn nhiều so với Notepad, nhưng bạn vẫn phải kích chuột phải vào tệp.PS1 để làm điều đó theo mặc định.
  • Mở - Mở trong Notepad. Lưu ý rằng tên khóa này cũng là chuỗi được lưu trữ trong giá trị “(Mặc định)” của khóa Shell. Điều này có nghĩa là nhấp đúp vào tệp sẽ “Mở” tệp đó và hành động đó thường được đặt để sử dụng Notepad.

Nếu bạn muốn gắn bó với các chuỗi lệnh dựng sẵn, bạn chỉ có thể thay đổi giá trị “(Mặc định)” trong khóa Shell để khớp với tên của khóa khớp với những gì bạn muốn nhấp đúp để thực hiện. Điều này có thể dễ dàng được thực hiện từ bên trong Regedit, hoặc bạn có thể sử dụng các bài học rút ra từ hướng dẫn của chúng tôi về việc khám phá registry với PowerShell (cộng với một chỉnh sửa PSDrive nhỏ) để bắt đầu xây dựng kịch bản có thể tái sử dụng có thể cấu hình hệ thống của bạn cho bạn. Các lệnh dưới đây phải được chạy từ phiên PowerShell được nâng lên, tương tự như chạy CMD với tư cách Quản trị viên.

Trước tiên, bạn sẽ muốn định cấu hình PSDrive cho HKEY_CLASSES_ROOT vì cài đặt này không được thiết lập theo mặc định. Lệnh cho điều này là:

New-PSDrive HKCR Registry HKEY_CLASSES_ROOT

Bây giờ bạn có thể điều hướng và chỉnh sửa các khóa và giá trị đăng ký trong HKEY_CLASSES_ROOT giống như bạn thường thấy trong HKCU và HKLM PSDrives thông thường.

Để định cấu hình nhấp đúp để khởi chạy các tập lệnh PowerShell trực tiếp:

Set-ItemProperty HKCR:Microsoft.PowerShellScript.1Shell '(Default)' 0

Để định cấu hình nhấp đúp để mở tập lệnh PowerShell trong PowerShell ISE:

Set-ItemProperty HKCR:Microsoft.PowerShellScript.1Shell '(Default)' 'Edit'

Để khôi phục giá trị mặc định (đặt nhấp đúp để mở tập lệnh PowerShell trong Notepad):

Set-ItemProperty HKCR:Microsoft.PowerShellScript.1Shell '(Default)' 'Open'

Đó chỉ là những điều cơ bản về thay đổi hành động nhấp đúp mặc định. Chúng tôi sẽ đi vào chi tiết hơn về cách tùy chỉnh cách PowerShell tập lệnh được xử lý khi chúng được mở trong PowerShell từ Explorer trong phần tiếp theo. Hãy ghi nhớ rằng phạm vi ngăn PSDrives khỏi sự bền bỉ trong các phiên. Vì vậy, có thể bạn sẽ muốn bao gồm dòng New-PSDrive khi bắt đầu bất kỳ tập lệnh cấu hình nào bạn xây dựng cho mục đích này hoặc thêm nó vào hồ sơ PowerShell của bạn. Nếu không, bạn sẽ cần phải chạy bit đó theo cách thủ công trước khi cố thực hiện thay đổi theo cách này.

Thay đổi cài đặt PowerShell ExecutionPolicy.

ExecutionPolicy của PowerShell là một lớp bảo vệ khác chống lại việc thực thi các tập lệnh độc hại. Có nhiều tùy chọn cho điều này và một vài cách khác nhau có thể được đặt. Từ ít nhất là an toàn nhất, các tùy chọn có sẵn là:

  • Bị hạn chế - Không cho phép chạy tập lệnh nào. (Cài đặt mặc định cho hầu hết các hệ thống.) Điều này thậm chí sẽ ngăn chặn tập lệnh tiểu sử của bạn chạy.
  • AllSigned - Tất cả các tập lệnh phải được ký bởi nhà xuất bản đáng tin cậy để chạy mà không cần nhắc người dùng. Các tập lệnh được ký bởi các nhà xuất bản được xác định rõ ràng là không đáng tin cậy hoặc các tập lệnh không được ký điện tử ở tất cả sẽ không chạy. PowerShell sẽ nhắc người dùng xác nhận nếu tập lệnh được ký bởi nhà xuất bản chưa được xác định là đáng tin cậy hoặc không đáng tin cậy. Nếu bạn chưa ký chữ ký số cho tập lệnh tiểu sử của mình và đã thiết lập niềm tin vào chữ ký đó, nó sẽ không thể chạy. Hãy cẩn thận với các nhà xuất bản mà bạn tin tưởng, vì bạn vẫn có thể chạy các tập lệnh độc hại nếu bạn tin tưởng sai.
  • RemoteSigned - Đối với các tập lệnh được tải xuống từ Internet, điều này có hiệu quả giống như “AllSigned”. Tuy nhiên, các tập lệnh được tạo cục bộ hoặc được nhập từ các nguồn khác ngoài Internet được phép chạy mà không có bất kỳ lời nhắc xác nhận nào. Ở đây, bạn cũng cần phải cẩn thận với chữ ký số mà bạn tin tưởng nhưng thậm chí cẩn thận hơn đối với các tập lệnh không ký mà bạn chọn để chạy. Đây là mức bảo mật cao nhất mà bạn có thể có một kịch bản hồ sơ công việc mà không phải ký điện tử nó.
  • Không hạn chế - Tất cả các tập lệnh đều được phép chạy, nhưng một yêu cầu xác nhận sẽ được yêu cầu đối với các tập lệnh từ Internet. Từ thời điểm này, hoàn toàn tùy thuộc vào bạn để tránh chạy các tập lệnh không đáng tin cậy.
  • Bypass - Mọi thứ đều chạy mà không có cảnh báo. Hãy cẩn thận với điều này.
  • Không xác định - Không có chính sách nào được xác định trong phạm vi hiện tại. Điều này được sử dụng để cho phép thu gọn các chính sách được xác định trong phạm vi thấp hơn (chi tiết bên dưới) hoặc theo mặc định của hệ điều hành.

Theo đề xuất của mô tả về Không xác định, các chính sách trên có thể được đặt trong một hoặc nhiều phạm vi. Bạn có thể sử dụng Get-ExecutionPolicy, với tham số -List, để xem tất cả các phạm vi và cấu hình hiện tại của chúng.

Các phạm vi được liệt kê theo thứ tự ưu tiên, với phạm vi được xác định trên cùng sẽ ghi đè tất cả các phạm vi khác. Nếu không có chính sách nào được xác định, hệ thống sẽ trở về cài đặt mặc định của nó (trong hầu hết các trường hợp, đây là Hạn chế).
Các phạm vi được liệt kê theo thứ tự ưu tiên, với phạm vi được xác định trên cùng sẽ ghi đè tất cả các phạm vi khác. Nếu không có chính sách nào được xác định, hệ thống sẽ trở về cài đặt mặc định của nó (trong hầu hết các trường hợp, đây là Hạn chế).
  • MachinePolicy đại diện cho một chính sách nhóm có hiệu lực ở cấp độ máy tính. Điều này thường chỉ được áp dụng trong một miền, nhưng cũng có thể được thực hiện cục bộ.
  • UserPolicy đại diện cho một chính sách nhóm có hiệu lực trên người dùng. Điều này cũng thường chỉ được sử dụng trong môi trường doanh nghiệp.
  • Quy trình là một phạm vi cụ thể cho phiên bản PowerShell này. Các thay đổi đối với chính sách trong phạm vi này sẽ không ảnh hưởng đến các quy trình PowerShell đang chạy khác và sẽ không hiệu quả sau khi phiên này bị chấm dứt. Điều này có thể được cấu hình bởi tham số -ExecutionPolicy khi PowerShell được khởi chạy, hoặc nó có thể được thiết lập với cú pháp Set-ExecutionPolicy thích hợp từ bên trong phiên làm việc.
  • CurrentUser là một phạm vi được cấu hình trong registry cục bộ và áp dụng cho tài khoản người dùng được sử dụng để khởi chạy PowerShell. Phạm vi này có thể được sửa đổi với Set-ExecutionPolicy.
  • LocalMachine là một phạm vi được cấu hình trong registry cục bộ và áp dụng cho tất cả người dùng trên hệ thống. Đây là phạm vi mặc định được thay đổi nếu Set-ExecutionPolicy được chạy mà không có tham số -Scope. Vì nó áp dụng cho tất cả người dùng trên hệ thống, nó chỉ có thể được thay đổi từ một phiên nâng cao.

Vì bài viết này chủ yếu là về bảo mật để tạo điều kiện thuận lợi cho việc sử dụng, chúng tôi chỉ quan tâm đến ba phạm vi thấp hơn. Các thiết lập MachinePolicy và UserPolicy chỉ thực sự hữu ích nếu bạn muốn thực thi một chính sách hạn chế mà không đơn giản là bỏ qua. Bằng cách giữ các thay đổi của chúng tôi ở cấp Quy trình hoặc dưới đây, chúng tôi có thể dễ dàng sử dụng bất kỳ cài đặt chính sách nào mà chúng tôi cho là thích hợp cho một tình huống cụ thể bất kỳ lúc nào.

Để giữ lại sự cân bằng giữa tính bảo mật và khả năng sử dụng, chính sách được hiển thị trong ảnh chụp màn hình có lẽ là tốt nhất. Đặt chính sách LocalMachine thành Restricted thường ngăn chặn việc chạy các script bởi bất kỳ ai khác ngoài bạn. Tất nhiên, điều này có thể được bỏ qua bởi những người dùng biết họ đang làm gì mà không cần nỗ lực nhiều. Nhưng nó sẽ giữ cho bất kỳ người dùng không am hiểu công nghệ nào khỏi vô tình kích hoạt một cái gì đó thảm khốc trong PowerShell. Có CurrentUser (tức là bạn) được thiết lập là Unrestricted cho phép bạn tự thực thi các script từ dòng lệnh tuy nhiên bạn thích, nhưng giữ lại một lời nhắc nhở thận trọng đối với các kịch bản tải xuống từ Internet. Thiết lập RemoteSigned ở mức Process sẽ cần phải được thực hiện trong một shortcut đến PowerShell.exe hoặc (như chúng ta sẽ làm bên dưới) trong các giá trị Registry kiểm soát hành vi của các kịch bản PowerShell. Điều này sẽ cho phép dễ dàng nhấp đúp để chạy chức năng cho bất kỳ kịch bản bạn viết, trong khi đưa lên một rào cản mạnh mẽ hơn chống lại thực hiện không chủ ý (có khả năng độc hại) kịch bản từ các nguồn bên ngoài. Chúng tôi muốn thực hiện việc này ở đây vì dễ dàng vô tình nhấp đúp vào tập lệnh hơn là nói chung là gọi nó theo cách thủ công từ một phiên tương tác.

Để thiết lập các chính sách CurrentUser và LocalMachine như trong ảnh chụp màn hình ở trên, hãy chạy các lệnh sau đây từ một phiên PowerShell được nâng lên:

Set-ExecutionPolicy Restricted Set-ExecutionPolicy Unrestricted -Scope CurrentUser

Để thực thi chính sách RemoteSigned trên các tập lệnh chạy từ Explorer, chúng tôi sẽ phải thay đổi giá trị bên trong một trong các khóa registry mà chúng tôi đã xem trước đó. Điều này đặc biệt quan trọng bởi vì, tùy thuộc vào phiên bản PowerShell hoặc Windows của bạn, cấu hình mặc định có thể bỏ qua tất cả các cài đặt ExecutionPolicy ngoại trừ AllSigned. Để xem cấu hình hiện tại là gì cho máy tính của bạn, bạn có thể chạy lệnh này (đảm bảo rằng HKCR PSDrive được ánh xạ đầu tiên):

Get-ItemProperty HKCR:Microsoft.PowerShellScript.1ShellCommand | Select-Object '(Default)'

Cấu hình mặc định của bạn có thể là một trong hai chuỗi sau, hoặc một cái gì đó khá giống nhau:

(Đã xem trên Windows 7 SP1 x64, với PowerShell 2.0)

'C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-file' '%1'

(Đã xem trên Windows 8.1 x64, với PowerShell 4.0)

'C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-Command' 'if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & '%1''

Cái đầu tiên không quá tệ, vì tất cả những gì nó làm là thực thi kịch bản trong các cài đặt ExecutionPolicy hiện có. Nó có thể được thực hiện tốt hơn, bằng cách thực thi các hạn chế chặt chẽ hơn cho một hành động dễ bị tai nạn hơn, nhưng điều này không được dự định ban đầu được kích hoạt khi nhấp đúp và chính sách mặc định thường bị Hạn chế. Tuy nhiên, tùy chọn thứ hai là toàn bộ bỏ qua bất kỳ ExecutionPolicy nào bạn có thể có tại chỗ - ngay cả Hạn chế. Vì bỏ qua sẽ được áp dụng trong phạm vi Quy trình, nó chỉ ảnh hưởng đến các phiên được khởi chạy khi các tập lệnh được chạy từ Explorer. Tuy nhiên, điều này có nghĩa là bạn có thể sẽ khởi chạy các tập lệnh mà bạn có thể mong đợi (và muốn) chính sách của bạn cấm.

Để đặt ExecutionPolicy cấp quy trình cho các tập lệnh được khởi chạy từ Explorer, phù hợp với ảnh chụp màn hình ở trên, bạn sẽ cần sửa đổi cùng một giá trị đăng ký mà chúng ta vừa truy vấn. Bạn có thể làm điều đó bằng tay trong Regedit, bằng cách thay đổi nó thành:

'C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-ExecutionPolicy' 'RemoteSigned' '-file' '%1'

Bạn cũng có thể thay đổi cài đặt từ bên trong PowerShell nếu muốn. Hãy nhớ làm điều này từ một phiên cao, với HKCR PSDrive ánh xạ.
Bạn cũng có thể thay đổi cài đặt từ bên trong PowerShell nếu muốn. Hãy nhớ làm điều này từ một phiên cao, với HKCR PSDrive ánh xạ.

Set-ItemProperty HKCR:Microsoft.PowerShellScript.1ShellCommand '(Default)' ''C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-ExecutionPolicy' 'RemoteSigned' '-file' '%1''

Chạy kịch bản PowerShell với tư cách Quản trị viên.

Cũng giống như một ý tưởng tồi là vô hiệu hóa UAC hoàn toàn, cũng thực hành bảo mật kém để chạy tập lệnh hoặc chương trình có đặc quyền nâng cao trừ khi bạn thực sự cần chúng để thực hiện các hoạt động yêu cầu quyền truy cập Quản trị viên. Vì vậy, việc xây dựng dấu nhắc UAC vào hành động mặc định cho các kịch bản PowerShell không được khuyến nghị. Tuy nhiên, chúng tôi có thể thêm tùy chọn menu ngữ cảnh mới để cho phép chúng tôi dễ dàng chạy tập lệnh trong các phiên cao khi cần. Điều này tương tự như phương thức được sử dụng để thêm “Mở bằng Notepad” vào menu ngữ cảnh của tất cả các tệp - nhưng ở đây chúng tôi sẽ chỉ nhắm mục tiêu tập lệnh PowerShell. Chúng tôi cũng sẽ tiếp tục thực hiện một số kỹ thuật được sử dụng trong bài viết trước, nơi chúng tôi đã sử dụng một tệp tin batch thay cho các hacks đăng ký để khởi chạy kịch bản PowerShell của chúng tôi.

Để thực hiện việc này trong Regedit, hãy quay lại khóa Shell, tại:

HKEY_CLASSES_ROOTMicrosoft.PowerShellScript.1Shell

Trong đó, tạo một khóa con mới. Gọi nó là "Chạy với PowerShell (Quản trị)". Bên dưới đó, tạo một khóa con khác gọi là "Lệnh".Sau đó, đặt giá trị “(Mặc định)” trong Lệnh này:

'C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-Command' ''& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy RemoteSigned -File '%1'' -Verb RunAs}'

Làm như vậy trong PowerShell sẽ thực sự cần ba dòng lần này. Một cho mỗi khóa mới và một để đặt giá trị “(Mặc định)” cho Lệnh. Đừng quên độ cao và bản đồ HKCR.
Làm như vậy trong PowerShell sẽ thực sự cần ba dòng lần này. Một cho mỗi khóa mới và một để đặt giá trị “(Mặc định)” cho Lệnh. Đừng quên độ cao và bản đồ HKCR.

New-Item 'HKCR:Microsoft.PowerShellScript.1ShellRun with PowerShell (Admin)' New-Item 'HKCR:Microsoft.PowerShellScript.1ShellRun with PowerShell (Admin)Command' Set-ItemProperty 'HKCR:Microsoft.PowerShellScript.1ShellRun with PowerShell (Admin)Command' '(Default)' ''C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-Command' ''& {Start-Process PowerShell.exe -ArgumentList ''-ExecutionPolicy RemoteSigned -File '%1''' -Verb RunAs}''

Ngoài ra, hãy chú ý cẩn thận đến sự khác biệt giữa chuỗi được đưa vào thông qua PowerShell và giá trị thực tế đi vào Registry. Đặc biệt, chúng tôi đã bao gồm toàn bộ nội dung trong các dấu nháy đơn và tăng gấp đôi các dấu nháy đơn nội bộ để tránh các lỗi trong phân tích cú pháp lệnh.

Bây giờ bạn sẽ có một mục nhập ngữ cảnh-menu mới cho các kịch bản PowerShell, được gọi là "Chạy với PowerShell (Quản trị viên)".

Tùy chọn mới sẽ sinh ra hai phiên bản PowerShell liên tiếp. Đầu tiên chỉ là một launcher cho lần thứ hai, sử dụng Start-Process với tham số “-Verb RunAs” để yêu cầu độ cao cho phiên mới. Từ đó, kịch bản của bạn sẽ có thể chạy với các đặc quyền của Quản trị viên sau khi bạn nhấp qua dấu nhắc UAC.
Tùy chọn mới sẽ sinh ra hai phiên bản PowerShell liên tiếp. Đầu tiên chỉ là một launcher cho lần thứ hai, sử dụng Start-Process với tham số “-Verb RunAs” để yêu cầu độ cao cho phiên mới. Từ đó, kịch bản của bạn sẽ có thể chạy với các đặc quyền của Quản trị viên sau khi bạn nhấp qua dấu nhắc UAC.

Chạm xong.

Chỉ còn một vài chỉnh sửa khác có thể giúp cuộc sống trở nên dễ dàng hơn một chút. Đối với một, làm thế nào về việc thoát khỏi chức năng Notepad hoàn toàn? Đơn giản chỉ cần sao chép giá trị "(Mặc định)" từ phím Command dưới Edit (bên dưới), vào cùng một vị trí trong Open.

'C:WindowsSystem32WindowsPowerShellv1.0powershell_ise.exe' '%1'

Hoặc, bạn có thể sử dụng bit này của PowerShell (với Admin & HKCR tất nhiên):

Set-ItemProperty HKCR:Microsoft.PowerShellScript.1ShellOpenCommand '(Default)' ''C:WindowsSystem32WindowsPowerShellv1.0powershell_ise.exe' '%1''

Một ít phiền phức nhỏ hơn là thói quen của giao diện điều khiển biến mất khi một kịch bản hoàn tất. Khi điều đó xảy ra, chúng tôi không có bất kỳ cơ hội nào để xem lại đầu ra tập lệnh cho các lỗi hoặc thông tin hữu ích khác. Điều này có thể được quan tâm bằng cách đặt tạm dừng ở cuối mỗi tập lệnh của bạn, tất nhiên. Cách khác, chúng ta có thể sửa đổi các giá trị “(Mặc định)” cho các phím Command của chúng ta để bao gồm tham số “-NoExit”. Dưới đây là các giá trị được sửa đổi.

(Không có quyền truy cập quản trị)

'C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-NoExit' '-ExecutionPolicy' 'RemoteSigned' '-file' '%1'

(Với quyền truy cập Quản trị)

'C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-Command' ''& {Start-Process PowerShell.exe -ArgumentList '-NoExit -ExecutionPolicy RemoteSigned -File '%1'' -Verb RunAs}'

Và tất nhiên, chúng tôi cũng sẽ cung cấp cho bạn những lệnh đó trong lệnh PowerShell. Lời nhắc cuối cùng: Độ cao & HKCR!

(Không phải quản trị viên)

Set-ItemProperty HKCR:Microsoft.PowerShellScript.1ShellCommand '(Default)' ''C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-NoExit' '-ExecutionPolicy' 'RemoteSigned' '-file' '%1''

(Quản trị viên)

Set-ItemProperty 'HKCR:Microsoft.PowerShellScript.1ShellRun with PowerShell (Admin)Command' '(Default)' ''C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-Command' ''& {Start-Process PowerShell.exe -ArgumentList ''-NoExit -ExecutionPolicy RemoteSigned -File '%1''' -Verb RunAs}''

Lấy nó cho một spin.

Để kiểm tra điều này, chúng tôi sẽ sử dụng một tập lệnh có thể hiển thị cho chúng tôi cài đặt ExecutionPolicy tại chỗ và liệu tập lệnh có được khởi chạy với quyền của Quản trị viên hay không. Kịch bản sẽ được gọi là "MyScript.ps1" và được lưu trữ trong "D: Script Lab" trên hệ thống mẫu của chúng tôi. Mã dưới đây, để tham khảo.

if(([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {Write-Output 'Running as Administrator!'} else {Write-Output 'Running Limited!'} Get-ExecutionPolicy -List

Sử dụng hành động “Chạy với PowerShell”:

Sử dụng hành động "Chạy với PowerShell (Quản trị)", sau khi nhấp qua UAC:
Sử dụng hành động "Chạy với PowerShell (Quản trị)", sau khi nhấp qua UAC:
Để chứng minh ExecutionPolicy đang hoạt động ở phạm vi Process, chúng ta có thể làm cho Windows nghĩ rằng tập tin đến từ Internet với đoạn mã PowerShell này:
Để chứng minh ExecutionPolicy đang hoạt động ở phạm vi Process, chúng ta có thể làm cho Windows nghĩ rằng tập tin đến từ Internet với đoạn mã PowerShell này:

Add-Content -Path 'D:Script LabMyScript.ps1' -Value '[ZoneTransfer]`nZoneId=3' -Stream 'Zone.Identifier'

May mắn thay, chúng tôi đã bật -NoExit. Nếu không, lỗi đó sẽ chỉ chớp mắt và chúng tôi sẽ không biết!
May mắn thay, chúng tôi đã bật -NoExit. Nếu không, lỗi đó sẽ chỉ chớp mắt và chúng tôi sẽ không biết!

Các Zone.Identifier có thể được gỡ bỏ với điều này:

Clear-Content -Path 'D:Script LabMyScript.ps1' -Stream 'Zone.Identifier'

Tài liệu tham khảo hữu ích:

  • Chạy tập lệnh PowerShell từ một tập tin thực thi - Blog lập trình của Daniel Schroeder
  • Kiểm tra quyền quản trị viên trong PowerShell - Hey, Scripting Guy! Blog

Đề xuất: