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.
Đây là một câu hỏi hay, nếu tôi đã thấy một câu hỏi. – badp
@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