2010-06-26 27 views
8

Tôi đã đọc một số câu hỏi liên quan đến UAC và độ cao đặc quyền nhưng tôi không tìm thấy câu trả lời thỏa đáng/toàn diện.UAC và mẫu nhắc độ cao

Tôi có kịch bản này: trên Windows 6 trở lên, khi người dùng mở một cửa sổ cấu hình tôi có để hiển thị các lá chắn (BCM_SETSHIELD) vào nút OK chỉ nếu độ cao đặc quyền sẽ được yêu cầu để hoàn thành nhiệm vụ. - Tôi biết rằng trong giao diện người dùng Windows, lá chắn luôn được hiển thị cho "các tác vụ quản trị", ngay cả khi UAC bị vô hiệu hóa, nhưng khách hàng có yêu cầu cụ thể này.

Tôi có dự thảo điều kiện này để hiển thị biểu tượng:

  1. Người dùng đã không quyền quản trị
    HOẶC
  2. Quá trình hiện có TOKEN_ELEVATION_TYPE == TokenElevationTypeLimited

Điều kiện # 1 rất đơn giản: nếu người dùng chưa có quyền quản trị n luôn được yêu cầu bất kể UAC. Số 2 ngụ ý rằng người dùng có quyền quản trị và bất kỳ giá trị nào khác của TOKEN_ELEVATION_TYPE có nghĩa là độ cao là không cần thiết.

Thực sự đơn giản? Tôi đang thiếu cái gì đó? Và - có một tài liệu hay mô hình nổi tiếng về chủ đề này?

+1

Đây là một câu hỏi hay, nếu tôi đã thấy một câu hỏi. – badp

+0

@badp: Tôi đã suy nghĩ và nghiên cứu về nó một chút, nhưng nó vẫn câu đố tôi vì nó có vẻ quá dễ dàng ... có lẽ tôi đã không đưa vào tài khoản một số điều kiện biên. – Wizard79

Trả lời

3

Bạn nói đúng. Hầu hết mọi người chỉ đặt khiên lên nếu nút sẽ được nâng lên, nhưng điều đúng đắn cần làm là đặt khiên lên nếu nút đó sẽ gây ra độ cao (tức là tắt nó nếu bạn đã nâng lên, vì mọi thứ bạn khởi chạy sẽ vẫn được nâng cao trừ khi bạn gặp rắc rối nào đó để khởi động một tiến trình không nâng cao, và ngăn chặn nó nếu UAC bị tắt.)

Tin tốt là nếu ai đó trong nhóm quản trị viên chạy (dưới UAC) một ứng dụng không nâng cao, bạn ' sẽ lấy lại false khi bạn hỏi xem họ có phải là quản trị viên hay không. Vì vậy, tôi nghĩ bạn có thể ổn với chỉ một bài kiểm tra đó.

+1

Vâng, thực sự có một lý do trong việc đặt lá chắn ngay cả khi ứng dụng đã được nâng lên (hoặc nếu UAC bị vô hiệu hóa): theo cách này, người dùng sẽ ngay lập tức thừa nhận rằng nút "hành chính". Tôi xác nhận kiểu giao diện người dùng này, nhưng khách hàng thì không. – Wizard79

+0

Vì vậy, bạn có nghĩ rằng tôi chỉ có thể dựa vào việc kiểm tra số 1? – Wizard79

+0

Tôi nghĩ bạn nên mã hóa nó là "nếu bạn không phải là quản trị viên, hãy đặt trên khiên" và sau đó chạy tất cả các trường hợp thử nghiệm của bạn để xem nó có đủ không. Nghi ngờ của tôi là nó sẽ. –

2

Tôi thấy rằng có rất nhiều sự nhầm lẫn về chủ đề này và câu trả lời từ Kate ở đây không chính xác và không đầy đủ.

Vì Vista, Quản trị viên có thể đăng nhập nhưng các quy trình của anh ấy không tự động được nâng lên. Quản trị viên có một cái gọi là "Tách mã". Điều này có nghĩa là có thể có các quá trình đang chạy cho người dùng quản trị SAME và một số người trong số họ chạy trên cao và một số khác không chạy ở mức cao. Khi Quản trị viên chạy một quy trình không nâng cao, một số đặc quyền của mã thông báo của anh ấy đã bị xóa. Nó không còn giống như trong XP, nơi tất cả các tiến trình chạy hoặc được nâng lên hoặc không được nâng lên.

Cài đặt Process Explorer từ www.sysinternals.com và bật cột "Mức toàn vẹn". Nếu bạn thấy có "Trung bình" quá trình này không chạy cao. Nếu bạn thấy có "Cao" thì quá trình này sẽ tăng lên. Nếu quá trình chạy với mức độ toàn vẹn "Cao" không có dấu nhắc UAC là cần thiết để bắt đầu một quá trình nâng cao.

Khi UAC được tắt hoàn toàn, TẤT CẢ các quy trình chạy "Cao", vì vậy không yêu cầu độ cao bao giờ. Bạn có thể tắt UAC theo

HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System 

đặt khóa "EnableLUA". Thay đổi cài đặt này yêu cầu khởi động lại.

Nhưng có một điểm khác chưa được đề cập ở đây. Trong bảng điều khiển có thể định cấu hình "Nâng mà không nhắc". Và trong trường hợp này, người dùng Quản trị viên có thể bắt đầu quá trình nâng cao từ quy trình không nâng cao khác và lời nhắc NO UAC sẽ hiển thị.

Cài đặt này được lưu trữ trong cùng một đường dẫn đăng ký trong khóa "ConsentPromptBehaviorAdmin" dành cho người dùng quản trị.

Đối với tất cả người dùng không phải quản trị viên có khóa "ConsentPromptBehaviorUser" nhưng điều này chỉ thay đổi bahavior, nhưng không thể tắt độ cao. Không phải quản trị viên sẽ luôn nhận được lời nhắc UAC. (nếu UAC không hoàn toàn tắt)

Làm cách nào để biết quy trình của bạn có tăng cao hay không: Gọi OpenProcess(), sau đó OpenProcessToken(), sau đó GetTokenInformation(TokenElevation).

Và để có được những cuộc gọi Liêm Cấp GetTokenInformation(TokenIntegrityLevel) và sau đó GetSidSubAuthority()

Vì vậy, nếu bạn muốn hiển thị biểu tượng của bạn chỉ khi độ cao thực sự đòi hỏi bạn phải kiểm tra xem quá trình của bạn chạy cao và bổ sung kiểm tra các khóa registry và các bạn phải biết người dùng có phải là quản trị viên hay không. Điều này mở ra một số dòng mã và tôi sẽ xem xét để hiển thị biểu tượng này luôn luôn khi độ cao có thể được yêu cầu để giữ cho nó đơn giản.

Xin lưu ý rằng API IsUserAnAdmin() không còn được dùng nữa. Nó không được sử dụng nữa kể từ Vista. Kiểm tra xem một người dùng thuộc nhóm quản trị viên có nhiều mã hơn không.

Các vấn đề liên quan