Buộc một chương trình chạy * mà không có * đặc quyền của quản trị viên hoặc UAC?


122

Có cách nào để tôi có thể buộc một chương trình thường yêu cầu quyền quản trị viên (thông qua UAC) để chạy mà không có chúng không? (tức là: không có dấu nhắc UAC và không có quyền truy cập trên toàn hệ thống .)

Đã thêm: Không sửa đổi bản thân thực thi.


Mặc dù câu trả lời của James, tôi đã tìm thấy một vài cách mà nó gần như có thể được thực hiện:

  1. Bằng cách sửa đổi tệp thực thi, tôi có thể xóa trustInfomục nhập khỏi tệp kê khai (hoặc hoàn toàn bảng kê khai, vì vậy tôi có thể sử dụng một tệp bên ngoài), cho phép chương trình bắt đầu mà không cần UAC. Thật không may, điều này sửa đổi thực thi, vì vậy nó thoát ra ngay sau khi kiểm tra tổng kiểm tra nội bộ.
  2. Bằng cách sử dụng Process Explorer tôi có thể khởi chạy nó dưới dạng Người dùng có giới hạn. Tuy nhiên, điều này dường như hạn chế đáng kể nhiều hơn tôi mong muốn (nó chạy như Chế độ bảo vệ IE và do đó có thể truy cập ít hơn đáng kể so với những gì người dùng không nâng cao tiêu chuẩn của tôi có thể).

1
Bạn xác định không sửa đổi tệp thực thi, nhưng sửa đổi .exe là một trong những cách bạn đã cố gắng?
cutrightjm

3
@ekaj Tôi chỉ xác định rằng sau khi tôi phát hiện ra rằng nó sẽ không hoạt động;)
Andrew Russell

Bạn có thể chỉ định chương trình, ngay cả khi bạn không sử dụng nó nữa? Điều đó có thể giúp mọi người biết những gì nó đang cố truy cập cần có đặc quyền của quản trị viên
cutrightjm

@ekaj Thật không may. Tuy nhiên, nó không đặc biệt có liên quan: UAC được kích hoạt bởi một chương trình yêu cầu nâng cao trong quá trình tạo quy trình (cách thông thường - như trong trường hợp này - là với một bảng kê khai). Khi một quá trình được bắt đầu, nó không thể thay đổi trạng thái độ cao của nó - bất kể tài nguyên bị hạn chế nào mà nó cố gắng truy cập.
Andrew Russell

Nếu một chương trình không có bảng kê khai và từ chối chạy mà không có đặc quyền quản trị viên, rất có thể là do Phát hiện Trình cài đặt UAC. Tôi đã đăng câu hỏi này và misha256 có một giải pháp tốt. Tôi đã thử nó và tôi có thể xác nhận rằng nó hoạt động. superuser.com/questions/857616/ Mạnh Tôi đã thực hiện một số nghiên cứu và tôi thấy rằng không có lý do gì để Trình phát hiện trình cài đặt tồn tại. Lưu ý rằng nếu các đặc quyền của quản trị viên là do một mục nhập Trustinfo trong một bảng kê khai, rõ ràng điều này sẽ không hoạt động.
dùng1258361

Câu trả lời:


74
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker]
@="Run without privilege elevation"

[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker\command]
@="cmd /min /C \"set __COMPAT_LAYER=RUNASINVOKER && start \"\" \"%1\"\""

Lưu văn bản này vào <name_of_file>.regvà thêm nó vào Windows Registry. (Nhấp đúp vào nó sẽ thực hiện thủ thuật.)

Sau đó, nhấp chuột phải vào ứng dụng bạn muốn chạy mà không có đặc quyền quản trị và chọn "Chạy không có độ cao đặc quyền".

Trong một số trường hợp - số lượng nhỏ 0,1% chương trình có thể hỏi hai lần về dấu nhắc UAC.


1
Tôi đã từng sử dụng shim Bộ công cụ tương thích ứng dụng, nhưng đó là rất nhiều công việc cho mỗi tệp thực thi và để lại rác trong sổ đăng ký cho mỗi tệp. Phương pháp này hoạt động và tôi thích nó tốt hơn rất nhiều.
Ben Voigt

2
Chấp nhận điều này vì đây có vẻ là phương pháp đơn giản nhất và cuối cùng tôi đã có thể xác minh nó. Cũng có đặc tính rất tốt là có thể sử dụng tầm thường như một dòng lệnh một lần (loại bỏ bên ngoài "và sau đó biến \"thành ").
Andrew Russell

1
Tôi có cùng một vấn đề với @Derek, ứng dụng dường như liên tục yêu cầu lại UAC, tôi không tin tưởng nó với quyền truy cập trên toàn hệ thống nhưng tôi cần chức năng của nó ..
Gizmo

1
Bạn có thể thêm video này vào registry chỉ cho hiện đang đăng nhập sử dụng bằng cách thay đổi các phím để: HKEY_CURRENT_USER \ Software \ Classes * \ shell \ forcerunasinvoker và HKEY_CURRENT_USER \ Software \ Classes * \ shell \ forcerunasinvoker \ command
GodEater

1
@ jpmc26 Tôi nghĩ đó /minlà một lỗi. Các giải pháp hoạt động chính xác như nhau mà không có nó. Vom phải có hỗn hợp cmdstartchuyển đổi. Có vẻ như cmd.exekhông phàn nàn về các công tắc sai. Hãy thử cmd /whatever, ví dụ.
cdlvcdlv

53

Lưu vào nonadmin.bat:

cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" %1"

Bây giờ bạn có thể kéo và thả các chương trình này để chạy chúng mà không cần quản trị viên.

Điều này không yêu cầu quyền quản trị như thay đổi khóa đăng ký. Ngoài ra, bạn sẽ không làm lộn xộn menu ngữ cảnh.

Dựa trên câu trả lời của Vom


Cập nhật: Bây giờ cũng nên làm việc với các chương trình có không gian trong tên.


Tôi đã thử nó trên một số chương trình yêu cầu quyền truy cập vào ổ đĩa của mình và nó không thể phát hiện ra chúng hoặc không hoạt động ngay từ đầu: / (rufus rufus.akeo.ie chẳng hạn)
keinabel

7
@keinabel Có lẽ vì họ thực sự cần quản trị viên để làm việc. Kịch bản này dành cho các chương trình đòi hỏi đặc quyền của quản trị viên mà không thực sự làm điều gì đó yêu cầu nó. Truy cập thô vào ổ đĩa là một điều quản trị điển hình.
Hjulle

2
Khá gọn gàng! Đã có thể cài đặt XAMPP bằng phương pháp này.
Krishnaraj

Điều này dường như không hoạt động đối với tôi đối với bất kỳ tệp thực thi nào trong thư mục "C: \ Program Files \ ...". Tôi nhận được một Windows cannot find 'C:\Program'. Make sure you typed the name correctly, and then try again. Tôi đã thử lệnh này một cách thủ công nhiều lần với các biến thể nhẹ và không gặp may. Có ý kiến ​​gì không?
Jake Smith

1
Tôi gặp vấn đề tương tự với vị trí của tệp nằm trong một thư mục có khoảng trắng. Đã giải quyết nó loại bỏ một số dấu ngoặc kép: cmd / min / C "set __COMPAT_LAYER = RUNASINVOKER && start" "% 1"
ragnar

35

Tôi hy vọng tôi không đến bữa tiệc quá muộn, nhưng tôi đang tìm kiếm một câu hỏi tương tự và không thấy câu trả lời nào ở đây, tôi phát hiện ra rằng RunAslệnh dựng sẵn của Windows , khi được chạy với tư cách quản trị viên, có thể thực hiện điều đó bằng /trustlevelchuyển đổi.

RUNAS /trustlevel:<TrustLevel> program

/showtrustlevels  displays the trust levels that can be used
                  as arguments to /trustlevel.
/trustlevel       <Level> should be one of levels enumerated
                  in /showtrustlevels.

Điều này làm việc trong trường hợp của tôi. Trớ trêu thay, bắt đầu một chương trình rõ ràng mà không cần độ cao đòi hỏi một dấu nhắc lệnh nâng cao . Đi hình. :) Tôi hy vọng nó sẽ giúp bạn.


Tôi có thể xác nhận điều này không hoạt động. Tôi vừa thử nó và gặp lỗi: "RUNAS ERROR: Không thể chạy - (tên chương trình ở đây). Thao tác được yêu cầu yêu cầu độ cao".
dùng1258361

9
@ user1258361 bạn phải chạy lệnh này từ dấu nhắc nâng cao, giống như tôi đã viết in đậm ...
Mxx

Nó dường như không yêu cầu một lời nhắc nâng cao trên Windows 7 ...
SamB

4
Đã kiểm tra với dấu nhắc nâng cao, sử dụng dòng lệnh runas / trustlevel: 0x20000 (chương trình), chương trình vẫn chạy với tư cách quản trị viên. Để tham khảo, 0x20000 là người dùng cơ bản.
dùng1258361

2
yêu cầu một dấu nhắc lệnh nâng cao ... tất nhiên là có. Nếu không, bạn đã không có quyền quản trị và bất kỳ quy trình nào bạn bắt đầu cũng sẽ thiếu chúng.
Kẻ giả mạo Twisty

16

Nếu bạn có một ứng dụng cụ thể mà bạn muốn luôn chạy mà không có UAC, bạn có thể nhắm mục tiêu nó với Registry (thêm văn bản vào tệp REG và nhập nó vào Registry):

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"C:\\example\\application.exe"="RunAsInvoker"

Không giống như câu trả lời này , giải pháp này không yêu cầu nhấp hoặc thay đổi tương tác người dùng.

Microsoft gọi quy trình này bằng cách thêm RunAsInvoker "Shim tương thích" .


Câu trả lời cho một câu hỏi khác, nhưng có liên quan đã cung cấp nguồn cảm hứng cho câu trả lời này.
palswim

1
Cảm ơn rât nhiều! Đây là điều duy nhất làm việc cho tôi! Tôi đã có Ứng dụng được gọi từ menu ngữ cảnh của windows và nó luôn xuất hiện với tư cách quản trị viên, mặc dù nó được gọi chính xác từ mọi nơi khác. Sau khi sửa lỗi này, ứng dụng bắt đầu được gọi chính xác.
người dùng

3

Tôi đã giải quyết vấn đề này ngày hôm nay bằng cách sử dụng bộ công cụ tùy biến ứng dụng MS.

Tôi đã làm theo các hướng dẫn trong một bài báo cộng hòa công nghệ .

Về cơ bản:

1) bạn nhận được bộ công cụ từ MS ở đây .

2) Nhấp vào Khắc phục

3) Chọn tùy chọn RunAsInvoker

4) Nhấp chuột phải vào bản sửa lỗi và chọn Cài đặt


Câu trả lời của bạn làm chính xác ngược lại với hiệu quả mong muốn. Câu hỏi ban đầu là làm thế nào để buộc một ứng dụng yêu cầu các đặc quyền nâng cao chạy mà không tăng. Câu trả lời của bạn vẫn sử dụng UAC nhưng chỉ vô hiệu hóa lời nhắc đó. Đó là một câu trả lời sai cho câu hỏi này.
Mxx

@mxx thực sự không có. Nếu người dùng hiện tại bị giới hạn (hoặc bạn đã bật UAC), thì quá trình sẽ khởi chạy với các đặc quyền hạn chế hoàn toàn.
LogicDaemon

1
@LogicDaemon Nếu bạn thực sự đọc bài viết, bạn sẽ thấy rằng nó giải thích rằng nếu bạn làm theo các bước đó, bạn sẽ chạy một ứng dụng với tư cách Quản trị viên mà không cần nhắc UAC . Điều này trái ngược với những gì OP yêu cầu.
Mxx

@mxx không. Đọc TechNet gì RunAsInvoker thực sự làm. Đây thực sự là những gì topicstarter yêu cầu, mặc dù điều này chỉ hoạt động cho các ứng dụng cũ.
LogicDaemon

Miễn là Explorer, một cmd không phải quản trị viên hoặc bất kỳ quy trình chuẩn nào khác là cha mẹ, RunAsInvoker sẽ chạy với các quyền hạn chế tương tự. (Explorer chạy bị hạn chế theo mặc định, nếu không, nó sẽ không bao giờ yêu cầu bạn nâng lên để xóa một tệp.) Nó thực sự có vẻ hoạt động ngay cả với các ứng dụng mới. RunAsInvoker có nghĩa là nó thừa hưởng chính xác mã thông báo ACL.
SilverbackNet

3

Nếu đó là exetệp cài đặt (cài đặt) yêu cầu đặc quyền quản trị, có một mẹo để chạy tệp mà không cần truy cập nâng cao:

Nếu tên tệp chứa các từ như setuphoặc installcửa sổ chạy mạnh mẽ với quyền truy cập cao ngay cả khi không cần truy cập nâng cao:

nhập mô tả hình ảnh ở đây

Nếu tệp .exe có một bảng kê khai trong đó, các heuristic cho độ cao này không được áp dụng.

Điều này được ghi lại trên các tài liệu UAC (Kiểm soát tài khoản người dùng):

Phát hiện trình cài đặt phát hiện các tệp thiết lập, giúp ngăn cài đặt chạy mà không có sự hiểu biết và chấp thuận của người dùng.

Phát hiện trình cài đặt chỉ áp dụng cho:

  • Tệp thực thi 32 bit.

  • Các ứng dụng không có thuộc tính mức thực thi được yêu cầu.

  • Các quy trình tương tác đang chạy như một người dùng chuẩn có bật UAC.

Trước khi quy trình 32 bit được tạo, các thuộc tính sau được kiểm tra để xác định xem đó có phải là trình cài đặt hay không:

  • Tên tệp bao gồm các từ khóa như "cài đặt", "thiết lập" hoặc "cập nhật".

  • ...

Đọc chế độ tại đây: https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works


2
Tất nhiên, điều đó chỉ hoạt động khi bảng kê khai ứng dụng không chỉ định rõ ràng nó phải chạy ở mức cao.
Daniel B

3
@DanielB: trên thực tế thủ thuật này chỉ hoạt động khi không có bảng kê khai
AntoineL

1
Nâng cao. Quan sát tốt. Một liên kết đến các tài liệu chính thức cũng sẽ tốt đẹp.
Denis Nikolaenko

@DenisNikolaenko Ty, đã thêm nguồn :)
Shaya

1

Trong khi trong câu hỏi của mình, Andrew nói rằng những điều sau đây không hoàn toàn hiệu quả:

Bằng cách sửa đổi tệp thực thi, tôi có thể xóa mục nhập TrustInfo khỏi tệp kê khai (hoặc hoàn toàn bảng kê khai, vì vậy tôi có thể sử dụng một tệp bên ngoài), cho phép chương trình bắt đầu mà không cần UAC. Thật không may, điều này sửa đổi thực thi, vì vậy nó thoát ra ngay sau khi kiểm tra tổng kiểm tra nội bộ.

Tôi đã có thể sửa đổi tệp .manifest bên ngoài cho phần mềm tôi đang sử dụng và thay đổi

<ms_asmv2:requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

đến

<ms_asmv2:requestedExecutionLevel level="asInvoker" uiAccess="false" />

Hóa ra phần mềm tôi đang sử dụng không thực sự yêu cầu quyền quản trị viên nên tôi có thể chạy nó trên tài khoản Người dùng Chuẩn mà không cần mật khẩu quản trị viên hoặc UAC. Cảm ơn!


Thay vào đó, có thể dễ dàng chỉnh sửa tệp thực thi hơn, vì tệp kê khai có thể chỉ được bao gồm trong tệp. Lưu ý rằng tiền tố không gian tên ms_asmv2:cũng có thể được bỏ qua. Ngoài ra, có thể việc thay đổi kích thước của khối xml được nhúng có thể làm hỏng nhị phân, do đó, "requestAd Administrator" nên được thay đổi thành "asInvoker" được đệm theo cùng độ dài với khoảng trắng trước uiAccess.
kdb

-2

Tôi đã khắc phục vấn đề này bằng cách thay đổi quyền trên thư mục chứa chương trình.

Tôi đã thêm từng người dùng sẽ chạy chương trình đó và cung cấp cho họ các quyền riêng tư "toàn quyền kiểm soát". Điều đó đã giải quyết vấn đề và tôi đã bỏ chọn "chạy với tư cách quản trị viên".

Tôi không có bất kỳ lo ngại nào về bảo mật cho người dùng sẽ chạy chương trình.


-5

Không, nếu một chương trình yêu cầu UAC thì nó đang cố truy cập vào thứ gì đó bên ngoài hộp cát của nó. Chương trình sẽ không chạy chính xác nếu không có quyền truy cập cao.

Nếu bạn chỉ muốn thoát khỏi thông báo, bạn có thể tắt UAC.

Vô hiệu hóa UAC trên Windows Vista: Bắt đầu, nhập "người dùng". Nhấp vào "Tài khoản người dùng". Trên cửa sổ bật lên, nhấp vào "Cài đặt kiểm soát tài khoản người dùng" và sau đó tắt UAC.

Vô hiệu hóa UAC trên Windows 7: Bắt đầu, nhập "người dùng". Nhấp vào "Cài đặt kiểm soát tài khoản người dùng". Kéo thanh lựa chọn xuống tận cùng để "Không bao giờ thông báo."


7
Vô hiệu hóa UAC không phải là điều tôi đang cố gắng đạt được. Ngoài ra: mô tả của bạn về cách UAC hoạt động là chính xác chỉ trong một ý nghĩa chung. Chương trình có thể yêu cầu UAC khi không thực sự cần nó. Và UAC xảy ra trước khi chương trình bắt đầu - một khi chương trình đang chạy, nếu nó vượt quá quyền của nó, nó sẽ chỉ nhận được các lỗi từ chối cấp phép.
Andrew Russell

Bỏ qua ngữ nghĩa, bạn không thể "vô hiệu hóa" các thông báo UAC cho một chương trình cụ thể trong khi vẫn giới hạn quyền truy cập của chúng.
James Watt

James: Thật ra - có vẻ như bạn có thể - Tôi đã cập nhật câu hỏi của mình.
Andrew Russell

Thiếu sửa đổi mã chương trình, tôi rất muốn biết về một giải pháp hoạt động nếu bạn tìm thấy một giải pháp.
James Watt
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.