Trang chủ » làm thế nào để » Cách cấu hình Windows để làm việc với PowerShell ScScript dễ dàng hơn

    Cách cấu hình Windows để làm việc với PowerShell ScScript dễ dàng hơn

    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 người dùng cuối vô tình khởi chạy các 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 tập lệnh PowerShell của riêng bạn, điều này có thể gây nhiều phiền toái hơn là một lợi ích. Tại đây, chúng tôi sẽ chỉ cho bạn cách khắc phục 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 thực thi tập lệnh.

    PowerShell thực sự là vỏ lệnh và ngôn ngữ kịch bản nhằm thay thế các tập lệnh CMD và tập lệnh trên các hệ thống Windows. Do đó, tập lệnh 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 thủ công từ dòng lệnh. Điều đó tương đương với việc thực hiện bất kỳ thay đổi nào có thể có trên hệ thống của bạn, cho đến các hạn chế tại chỗ trên tài khoản người dùng của bạn. Vì vậy, nếu bạn có thể chỉ cần nhấp đúp vào tập lệnh PowerShell và chạy nó với các đặc quyền Quản trị viên đầy đủ, 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 Im lặngContinue | Xóa-Mục -Force -Recurse -ErrorAction Im lặng Tiếp tục

    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ể. Thật thú vị, điều này có thể không khiến hệ thống không thể hoạt động nhanh như bạn nghĩ - ngay cả khi chạy từ phiên nâng 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, thì Tắt và bật lại, có lẽ họ sẽ chỉ dẫn họ vào 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 tồi tệ hơn là, thay vì nhận một tập lệnh chỉ xử lý hệ thống tệp của họ, bạn của bạn có thể bị lừa chạy một chương trình tải xuống và cài đặt keylogger hoặc dịch vụ truy cập từ xa. Sau đó, thay vì hỏi bạn câu hỏi về Startup Repair, cuối cùng họ có thể hỏi cảnh sát một số câu hỏi về gian lận ngân hàng!

    Bây giờ, rõ ràng là tại sao một số điều cần thiết để bảo vệ người dùng cuối khỏi chính họ, để nói. Nhưng người dùng quyền lực, quản trị viên hệ thống và các chuyên viên máy tính khác nói chung (mặc dù có trường hợp ngoại lệ) cảnh giác hơn với 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 hoàn thành công việc của mình. Để làm điều 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 ExecutPolicy 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 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ẽ đề cập đến nó ở một vài 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.
      Chúng tôi đã đưa ra điều này ban đầu trong loạt trường 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 đến trình thông dịch lệnh PowerShell. Điều này là để trực tiếp ngăn chặn việc thực thi các tập lệnh độc hại khi chúng chỉ cần nhấp đúp chuột.
    • Một số tập lệnh PowerShell sẽ không hoạt động nếu không có quyền của Quản trị viên.
      Ngay cả khi chạy với tài khoản cấp Quản trị viên, bạn vẫn cần thông 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 rằng ít nhất. Chúng tôi không muốn tắt UAC, nhưng vẫn tốt 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ự này được đưa ra trong Cách sử dụng tệp hàng loạt để làm cho tập lệnh PowerShell dễ chạy hơn, nơi chúng tôi sẽ hướng dẫn bạn viết một tập tin hàng loạt để tạm thời khắc phục 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 một giải pháp lâu dài hơn. Xin 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 chỉ dành riêng cho bạn - nếu không, bạn sẽ khiến những người dùng khác có nguy cơ gặp phải các vấn đề tương tự mà các tính năng này nhằm ngăn chặn.

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

    Điều khó chịu đầu tiên và có lẽ là khó chịu nhất là sự liên kết mặc định cho các tệp .PS1. Liên kết các tệp này với bất kỳ thứ gì khác ngoài PowerShell.exe có ý nghĩa để ngăn chặn việc thực thi ngẫu nhiên các tập lệnh không mong muốn. Nhưng, xem xét rằng PowerShell đi kèm với Môi trường tập lệnh tích hợp (ISE) được thiết kế đặc biệt để chỉnh sửa tập lệnh PowerShell, tại sao chúng tôi 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 hoàn toàn sang bật chức năng nhấp đúp để chạy, bạn có thể muốn điều 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 với bảng điều khiển Chương trình mặc định, nhưng việc đào trực tiếp vào Sổ đăng ký sẽ cung cấp cho bạn thêm một chút quyền kiểm soát chính xác 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 menu ngữ cảnh cho các tệp .PS1. Đừng quên tạo bản sao lưu của sổ đăng ký trước khi bạn làm điều này!

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

    HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1 \ Shell

    Để khám phá các cài đặt này trước khi chúng ta bắt đầu thay đổi chúng, hãy xem khóa đó và các khóa phụ của nó với Regedit. Khóa Shell chỉ cần có một giá trị, ((Mặc định), được đặt thành Chế độ Mở. Đây là một con trỏ tới hành động mặc định để 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 thể hiện một hành động bạn có thể thực hiện cụ thể cho các tập lệnh 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:

    • 0 - Chạy với 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 tập lệnh 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 nhấp 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ị của chế độ (mặc định) của khóa Shell. Điều này có nghĩa là nhấp đúp vào tập tin sẽ mở Open, 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 đã có sẵn, bạn chỉ cần thay đổi giá trị của ((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 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ề khám phá sổ đăng ký với PowerShell (cộng với một tinh chỉnh PSDrive nhỏ) để bắt đầu xây dựng tập lệnh có thể sử dụng lại có thể định cấu hình hệ thống cho bạn. Các lệnh dưới đây phải được chạy từ phiên PowerShell nâng cao, 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ì điều này không được thiết lập theo mặc định. Lệnh cho việc này là:

    Đăng ký HKCR mới-PSDrive HKEY_CLASSES_ROOT

    Giờ đây, 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 làm trong HKCU và HKLM PSDrive thông thường.

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

    Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell '(Mặc định)' 0

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

    Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell '(Mặc định) "Chỉnh sửa'

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

    Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell '(Mặc định) "Mở'

    Đó chỉ là những điều cơ bản để thay đổi hành động nhấp đúp mặc định. Chúng ta sẽ đi vào chi tiết hơn về việc tùy chỉnh cách xử lý các tập lệnh PowerShell khi chúng được mở trong PowerShell từ Explorer trong phần tiếp theo. Hãy nhớ rằng phạm vi ngăn chặn PSDrive tồn tại qua các phiên. Vì vậy, có lẽ 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 chạy bit đó một cách thủ công trước khi thử thay đổi theo cách này.

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

    ExecutPolicy của PowerShell là một lớp bảo vệ 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 việc này và một vài cách khác nhau có thể được đặt. Từ hầu hết đến an toàn nhất, các tùy chọn có sẵn là:

    • Hạn chế - Không có tập lệnh nào được phép chạy. (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 tập lệnh hồ sơ của bạn chạy.
    • AllSign - 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ý kỹ thuật số, 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ý kỹ thuật số tập lệnh hồ sơ của mình và đặt niềm tin vào chữ ký đó, nó sẽ không thể chạy. Hãy cẩn thận những 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..
    • RemoteSign - Đối với các tập lệnh được tải xuống từ Internet, điều này thực sự giống như của All 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. Tại đây, bạn cũng cần cẩn thận những chữ ký điện tử 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 được ký mà bạn chọn để chạy. Đây là mức bảo mật cao nhất mà theo đó bạn có thể có một kịch bản hồ sơ làm việc mà không cần phải ký điện tử.
    • Không giới hạn - Tất cả các tập lệnh được phép chạy, nhưng lời nhắc xác nhận sẽ được yêu cầu cho 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 kịch bản không đáng tin cậy.
    • Bypass - Mọi thứ 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 quay lại các chính sách được xác định trong phạm vi thấp hơn (chi tiết hơn bên dưới) hoặc mặc định của hệ điều hành.

    Theo đề xuất của mô tả 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-ExecutPolicy, 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 cao nhất ghi đè lên 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ẽ quay lại cài đặt mặc định (trong hầu hết các trường hợp, điều này bị hạn chế).

    • MachinePolicy thể hiện 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 tại địa phương.
    • UserPolicy thể hiện Chính sách nhóm có hiệu lực đối với 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.
    • Quá trình là một phạm vi cụ thể cho trường hợp này của PowerShell. 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 kết thúc. Điều này có thể được cấu hình bởi tham số -ExecutPolicy khi PowerShell được khởi chạy hoặc có thể được đặt bằng cú pháp Set-ExecutPolicy thích hợp từ trong phiên.
    • CurrentUser là một phạm vi được cấu hình trong sổ đăng ký 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-ExecutPolicy.
    • LocalMachine là một phạm vi được cấu hình trong sổ đăng ký 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-ExecutPolicy đượ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ên chỉ có thể thay đổi từ phiên nâng cao.

    Vì bài viết này chủ yếu là về việc bảo mật xung quanh để tạo thuận lợi cho khả năng sử dụng, chúng tôi chỉ quan tâm đến ba phạm vi thấp hơn. Cài đặt MachinePolicy và UserPolicy chỉ thực sự hữu ích nếu bạn muốn thực thi chính sách hạn chế 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 bên dưới, chúng tôi có thể dễ dàng sử dụng bất kỳ cài đặt chính sách nào chúng tôi cho là phù hợp với tình huống cụ thể bất cứ lúc nào.

    Để giữ cân bằng giữa bảo mật và khả năng sử dụng, chính sách 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 Bị hạn chế thường ngăn không cho chạy tập lệnh 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 vô tình kích hoạt điều gì đó thảm khốc trong PowerShell. Có CurrentUser (tức là: bạn) được đặt là Không giới hạn cho phép bạn thực thi thủ công các tập lệnh từ dòng lệnh theo cách bạn muốn, nhưng vẫn giữ lời nhắc nhở thận trọng đối với các tập lệnh được tải xuống từ Internet. Cài đặt RemoteSign ở cấp Quy trình sẽ cần được thực hiện theo lối tắt đến PowerShell.exe hoặc (như chúng tôi sẽ làm dưới đây) trong các giá trị Sổ đăng ký kiểm soát hành vi của các tập lệnh PowerShell. Điều này sẽ cho phép chức năng nhấp đúp để chạy dễ dàng cho bất kỳ tập lệnh nào bạn viết, đồng thời tạo ra một rào cản mạnh hơn chống lại việc thực thi các tập lệnh (có khả năng độc hại) từ các nguồn bên ngoài. Chúng tôi muốn thực hiện điều này ở đây vì việc vô tình bấm đúp vào tập lệnh dễ dàng hơn nhiều so với cách gọi thủ công từ phiên tương tác.

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

    Set-ExecutPolicy Giới hạn Set-ExecutPolicy Không bị giới hạn -Scope CurrentUser

    Để thực thi chính sách RemoteSign trên các tập lệnh chạy từ Explorer, chúng tôi sẽ phải thay đổi một giá trị bên trong một trong các khóa đăng ký mà chúng tôi đã xem xét 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 ExecutPolicy trừ AllSign. Để xem cấu hình hiện tại cho máy tính của bạn là gì, bạn có thể chạy lệnh này (đảm bảo HKCR PSDrive được ánh xạ trước):

    Get-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Command | Chọn đối tượng '(Mặc định)'

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

    (Nhìn thấy trên Windows 7 SP1 x64, với PowerShell 2.0)

    "C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-file" "% 1"

    (Nhìn thấy trên Windows 8.1 x64, với PowerShell 4.0)

    "C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-Command" "if ((Get-ExecutPolicy) -ne 'AllSign') Set-ExecutPolicy -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 tập lệnh trong cài đặt ExecutPolicy hiện có. Nó có thể được làm tốt hơn, bằng cách thực thi các hạn chế chặt chẽ hơn đối với hành động dễ xảy ra tai nạn hơn, nhưng dù sao thì điều này ban đầu không được kích hoạt khi nhấp đúp chuột và chính sách mặc định thường bị hạn chế. Tuy nhiên, tùy chọn thứ hai là một sự bỏ qua hoàn toàn của bất kỳ thứ gì ExecutPolicy bạn có thể có tại chỗ - thậm chí bị 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 tập lệnh được chạy từ Explorer. Tuy nhiên, điều này có nghĩa là bạn có thể kết thúc việc 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 mình cấm.

    Để đặt ExecutPolicy ở 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 giá trị đăng ký mà chúng tôi vừa truy vấn. Bạn có thể thực hiện thủ công trong Regedit, bằng cách thay đổi nó thành:

    "C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-ExecutPolicy" "RemoteSign" "-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ớ thực hiện việc này từ một phiên nâng cao, với HKCR PSDrive được ánh xạ.

    Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Command '(Mặc định) "" C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe "" -ExecutPolicy "" RemoteSign "" -file "" % 1 "'

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

    Vì việc vô hiệu hóa hoàn toàn UAC là một ý tưởng tồi, đó cũng là cách thực hành bảo mật tồi để chạy các tập lệnh hoặc chương trình với cá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 của Quản trị viên. Vì vậy, không nên xây dựng dấu nhắc UAC thành hành động mặc định cho các tập lệnh PowerShell. Tuy nhiên, chúng tôi có thể thêm một tùy chọn menu ngữ cảnh mới để cho phép chúng tôi dễ dàng chạy các tập lệnh trong các phiên nâng cao khi chúng tôi cần. Phương pháp này tương tự như phương pháp được sử dụng để thêm vào Mở Open bằng Notepad với trình đơn 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 các tập lệnh PowerShell. Chúng tôi cũng sẽ 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 bó thay vì hack sổ đăng ký để khởi chạy tập lệnh PowerShell của chúng tôi.

    Để thực hiện việc này trong Regedit, hãy quay lại phím Shell, tại:

    HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1 \ Shell

    Trong đó, tạo một khóa phụ mới. Gọi nó là Run Run với PowerShell (Admin). Bên dưới đó, tạo một khóa phụ khác có tên là Command Command. Sau đó, đặt giá trị của các ứng dụng (Mặc định) trong mục này:

    "C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-Command" "" & Start-Process PowerShell.exe -ArgumentList '-ExecutPolicy RemoteSign -File \ "% 1 \"' -Verb RunAs  "

    Làm tương tự trong PowerShell thực sự 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ị Chiêu (Mặc định) cho Lệnh. Đừng quên độ cao và ánh xạ HKCR.

    Mục mới 'HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Run với PowerShell (Quản trị viên)' Mục mới 'HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Chạy với PowerShell (Quản trị viên) \ Lệnh' Set-ItemProperty ' HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Run với PowerShell (Quản trị viên) \ Command "(Mặc định)" "C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-Command" "" &  Bắt đầu xử lý PowerShell.exe -ArgumentList "-ExecutPolicy RemoteSign -File \"% 1 \ "" - Động từ 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ế được đưa vào Sổ đăng ký. Đặc biệt, chúng tôi phải gói toàn bộ nội dung trong dấu ngoặc đơn và nhân đôi dấu ngoặc đơn bên trong để tránh lỗi khi phân tích cú pháp lệnh.

    Bây giờ bạn sẽ có một mục trình đơn ngữ cảnh mới cho các tập lệnh PowerShell, được gọi là Run Run 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. Cái đầu tiên chỉ là một launcher cho cái thứ hai, nó sử dụng Start-Process với tham số Run -Verb RunAs kèm theo để yêu cầu độ cao cho phiên mới. Từ đó, tập lệnh 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 lời nhắc UAC.

    Chạm hoàn thiện.

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

    "C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell_ise.exe" "% 1"

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

    Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Open \ Command '(Mặc định) "" C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell_ise.exe ""% 1 "'

    Một phiền toái nhỏ nữa là thói quen biến mất của giao diện điều khiển một khi tập lệnh 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 xét đầ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ạm dừng ở cuối mỗi tập lệnh của bạn, tất nhiên. Thay phiên, chúng ta có thể sửa đổi các giá trị của các dòng (mặc định) cho các khóa lệnh của chúng tôi để bao gồm tham số của kiểu -NExitit. Dưới đây là các giá trị được sửa đổi.

    (Không có quyền truy cập của Quản trị viên)

    "C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-KhôngExit" "-ExecutPolicy" "RemoteSign" "-file" "% 1"

    (Có quyền truy cập của Quản trị viên)

    "C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-Command" "" & Start-Process PowerShell.exe -ArgumentList '-NoExit -ExecutPolicy RemoteSign -File \ "% 1 \"' - Động từ RunAs "

    Và tất nhiên, chúng tôi cũng sẽ cung cấp cho bạn những lệnh trong 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.1 \ Shell \ Command '(Mặc định) "" C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe "" -KhôngExit "" -ExecutPolicy "" RemoteSign "" -file ""% 1 "'

    (Quản trị viên)

    Set-ItemProperty 'HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Run với PowerShell (Quản trị viên) \ Command "(Mặc định)" "C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-Command" "" & Bắt đầu xử lý PowerShell.exe -ArgumentList "-KhôngExit -ExecutPolicy RemoteSign -File \"% 1 \ "" - Động từ RunAs "'

    Mang 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 ExecutPolicy 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. Tập lệnh sẽ có tên là My My.ps1ps và được lưu trữ trong Bộ D: \ Script Lab tựa 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] :: GetCản ()). IsInRole ([Security.Principal.WindowsBuiltInRole] "Quản trị viên") Đầu ra ghi 'Chạy giới hạn!' Get-ExecutPolicy -List

    Sử dụng Run Run với hành động PowerShell:

    Sử dụng hành động của Run Run với hành động PowerShell (Quản trị viên), sau khi nhấp qua UAC:

    Để thể hiện ExecutPolicy hoạt động ở phạm vi Quy trình, chúng ta có thể khiến Windows nghĩ rằng tệp đến từ Internet với bit mã PowerShell này:

    Thêm nội dung -Path 'D: \ Script Lab \ MyScript.ps1' -Value "[ZoneTransfer] 'nZoneId = 3" -Stream' Zone.Identifier '

    May mắn thay, chúng tôi đã kích hoạt -Không mở. Nếu không, lỗi đó sẽ xảy ra và chúng ta sẽ không biết!

    Có thể gỡ bỏ Zone.Identifier bằng cách này:

    Xóa nội dung -Path 'D: \ Script Lab \ MyScript.ps1' -Stream 'Zone.Identifier'

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

    • Chạy các tập lệnh PowerShell từ một tệp bó - Blog lập trình của Daniel Schroeder's
    • Kiểm tra quyền của Quản trị viên trong PowerShell - Hey, Scripting Guy! Blog