Ứng dụng Vista của tôi cần phải biết liệu người dùng đã khởi chạy ứng dụng "làm quản trị viên" (nâng cao) hay là người dùng chuẩn (không nâng cao). Làm thế nào tôi có thể phát hiện ra tại thời gian chạy?Làm thế nào tôi có thể phát hiện nếu quá trình của tôi đang chạy UAC-nâng lên hay không?
Trả lời
CáC++ chức năng C sau đây có thể làm điều đó:
HRESULT GetElevationType(__out TOKEN_ELEVATION_TYPE * ptet);
/*
Parameters:
ptet
[out] Pointer to a variable that receives the elevation type of the current process.
The possible values are:
TokenElevationTypeDefault - This value indicates that either UAC is disabled,
or the process is started by a standard user (not a member of the Administrators group).
The following two values can be returned only if both the UAC is enabled
and the user is a member of the Administrator's group:
TokenElevationTypeFull - the process is running elevated.
TokenElevationTypeLimited - the process is not running elevated.
Return Values:
If the function succeeds, the return value is S_OK.
If the function fails, the return value is E_FAIL. To get extended error information, call GetLastError().
Implementation:
*/
HRESULT GetElevationType(__out TOKEN_ELEVATION_TYPE * ptet)
{
if (!IsVista())
return E_FAIL;
HRESULT hResult = E_FAIL; // assume an error occurred
HANDLE hToken = NULL;
if (!::OpenProcessToken(
::GetCurrentProcess(),
TOKEN_QUERY,
&hToken))
{
return hResult;
}
DWORD dwReturnLength = 0;
if (::GetTokenInformation(
hToken,
TokenElevationType,
ptet,
sizeof(*ptet),
&dwReturnLength))
{
ASSERT(dwReturnLength == sizeof(*ptet));
hResult = S_OK;
}
::CloseHandle(hToken);
return hResult;
}
Đối với chức năng IsVista (và biết thêm chi tiết về GetElevationType), hãy xem bài đăng trên blog của Andrei: http : //www.softblog.com/2008-02/vista-tools/ –
Đối với những người trong chúng ta làm việc trong C#, trong Windows SDK có một "UACDemo" ứng dụng như một phần của "Mẫu Công nghệ Cross". Họ nhận thấy nếu người dùng hiện nay là một quản trị viên sử dụng phương pháp này:
private bool IsAdministrator
{
get
{
WindowsIdentity wi = WindowsIdentity.GetCurrent();
WindowsPrincipal wp = new WindowsPrincipal(wi);
return wp.IsInRole(WindowsBuiltInRole.Administrator);
}
}
(Lưu ý: Tôi refactored mã ban đầu để trở thành một tài sản, chứ không phải là một "nếu" tuyên bố)
Câu hỏi, điều này có làm bảo mật miền không? (MYDOMAIN \ Quản trị viên) Hoặc đây có phải là bảo mật cục bộ không? – mattlant
WindowsBuiltInRole.Administrator là nhóm quản trị cục bộ – Ryan
Nếu tài khoản miền của bạn là quản trị viên cục bộ cho máy đó hoặc quản trị viên tên miền - tài khoản đó sẽ nằm trong nhóm địa phương đó theo mặc định, afaik. –
Tôi không nghĩ rằng độ cao loại là câu trả lời bạn muốn. Bạn chỉ muốn biết nếu nó được nâng lên. Sử dụng TokenElevation thay vì TokenElevationType khi bạn gọi GetTokenInformation. Nếu cấu trúc trả về giá trị dương, người dùng là quản trị viên. Nếu không, người dùng là độ cao bình thường.
Dưới đây là một giải pháp Delphi:
function TMyAppInfo.RunningAsAdmin: boolean;
var
hToken, hProcess: THandle;
pTokenInformation: pointer;
ReturnLength: DWord;
TokenInformation: TTokenElevation;
begin
hProcess := GetCurrentProcess;
try
if OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then try
TokenInformation.TokenIsElevated := 0;
pTokenInformation := @TokenInformation;
GetTokenInformation(hToken, TokenElevation, pTokenInformation, sizeof(TokenInformation), ReturnLength);
result := (TokenInformation.TokenIsElevated > 0);
finally
CloseHandle(hToken);
end;
except
result := false;
end;
end;
Đây là một thực hiện VB6 séc nếu một (hiện hành) quy trình được nâng lên
Option Explicit
'--- for OpenProcessToken
Private Const TOKEN_QUERY As Long = &H8
Private Const TokenElevation As Long = 20
Private Declare Function GetCurrentProcess Lib "kernel32"() As Long
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function GetTokenInformation Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal TokenInformationClass As Long, TokenInformation As Any, ByVal TokenInformationLength As Long, ReturnLength As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Function IsElevated(Optional ByVal hProcess As Long) As Boolean
Dim hToken As Long
Dim dwIsElevated As Long
Dim dwLength As Long
If hProcess = 0 Then
hProcess = GetCurrentProcess()
End If
If OpenProcessToken(hProcess, TOKEN_QUERY, hToken) Then
If GetTokenInformation(hToken, TokenElevation, dwIsElevated, 4, dwLength) Then
IsElevated = (dwIsElevated <> 0)
End If
Call CloseHandle(hToken)
End If
End Function
- 1. Làm thế nào tôi có thể phát hiện khi tôi đang ở trên một hệ thống đang chạy Unity?
- 2. Làm thế nào tôi có thể đặt quá trình linux đang chạy trong nền?
- 3. Làm thế nào để phát hiện nếu tôi đang chạy trong bảng điều khiển
- 4. Làm thế nào để phát hiện nếu tôi đang chạy trong dịch vụ đơn?
- 5. Làm thế nào tôi có thể phát hiện nếu tôi đang biên soạn kiến trúc 64 bit trong C++
- 6. Làm thế nào tôi có thể biết tôi đang sử dụng x64 hay x86 bằng .NET?
- 7. Phát hiện số quá trình đang chạy với cùng tên
- 8. Làm thế nào tôi có thể phát hiện xem cụm từ .NET của tôi có đang chạy từ trang web hoặc từ máy tính để bàn không?
- 9. Phát hiện nếu tường lửa của cửa sổ đang chặn chương trình của tôi
- 10. Làm thế nào tôi có thể phát hiện nếu một điều khiển ActiveX được tải?
- 11. iPhone - Làm thế nào tôi có thể phát hiện thiết bị đang chạy một bản dựng adhoc của ứng dụng của tôi tại thời gian chạy
- 12. Làm cách nào để chương trình của tôi có thể phát hiện xem chương trình có đang chạy trên một miền cụ thể không?
- 13. Làm thế nào mã của tôi có thể tìm thấy nếu nó đang chạy bên trong IIS?
- 14. Làm thế nào tôi có thể xác định có bao nhiêu bộ nhớ chương trình của tôi hiện đang chiếm
- 15. Ứng dụng Android của tôi có thể phát hiện nếu nó được khởi chạy từ Eclipse không?
- 16. Java: Nếu tôi có một phiên bản chương trình của tôi đang chạy, làm cách nào để phát hiện và sau đó đóng (các) cũ
- 17. Kiểm tra xem tôi có đang trong quá trình hoãn_job hay không
- 18. Làm thế nào tôi có thể nói trong Linux rằng quá trình gửi quá trình của tôi một tín hiệu
- 19. Trong PHP 5.x, làm thế nào tôi có thể phát hiện nếu một lớp trừu tượng hay không ở thời gian chạy?
- 20. Làm thế nào tôi có thể phát hiện nếu bộ chọn trả về null?
- 21. Làm cách nào để phát hiện xem IDE Delphi cụ thể có đang chạy không?
- 22. Làm cách nào để phát hiện xem ứng dụng của tôi có đang chạy trên máy ảo không?
- 23. Kiểm tra Nếu quá trình đang chạy từng phút
- 24. Làm thế nào để chạy ứng dụng .NET của tôi có thể nhận lệnh khi đang chạy?
- 25. Làm thế nào để lập trình phát hiện nếu ứng dụng của tôi đang chạy trong chế độ tích hợp IIS 7.0 từ bên trong một trang ASP.NET
- 26. Nếu tôi đang cập nhật DataRow, tôi có khóa toàn bộ DataTable hay chỉ DataRow không?
- 27. Tôi có bỏ lỡ bất kỳ thay đổi nào nếu tôi thay thế trình kích hoạt oracle trong khi ứng dụng của tôi đang chạy không?
- 28. Làm thế nào tôi có thể phát hiện thông số kỹ thuật hình ảnh của khách hàng với javascript
- 29. Làm thế nào tôi có thể tìm ra tập lệnh PHP nào đang chạy trong Linux?
- 30. Làm thế nào tôi có thể lập trình xác định nếu một trang IIS đang nhận yêu cầu?
Chức năng IsUserAnAdmin cũng có thể hữu ích. http://msdn.microsoft.com/en-us/library/windows/desktop/bb776463%28v=vs.85%29.aspx – jmnben