我的Vista应用程序需要知道用户是以“管理员”身份(提升)还是以标准用户身份(未提升)启动它。我如何在运行时检测?如何检测我的进程是否正在运行UAC提升?
回答
下面的C++函数可以做到这一点:
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;
}
对于IsVista函数(以及有关GetElevationType的更多详细信息),请参阅Andrei的博文:http ://www.softblog.com/2008-02/vista-tools/ – 2010-09-02 17:30:31
对于我们这些工作在C#,在Windows SDK有一个“UACDemo”应用为“跨技术示例”的一部分。他们发现,如果当前用户是使用此方法管理员:
private bool IsAdministrator
{
get
{
WindowsIdentity wi = WindowsIdentity.GetCurrent();
WindowsPrincipal wp = new WindowsPrincipal(wi);
return wp.IsInRole(WindowsBuiltInRole.Administrator);
}
}
(注:我重构原始代码是一个属性,而不是一个“如果”语句)
问题,这将做域安全吗? (MYDOMAIN \ Administrators)或者这只是本地安全? – mattlant 2008-09-24 07:17:39
我不认为抬高类型是你想要的答案。你只是想知道它是否升高。当您调用GetTokenInformation时,请使用TokenElevation而不是TokenElevationType。如果结构返回正值,则用户是admin。如果为零,则用户为正常高程。
这里是一个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;
这里是一个VB6实施检查的,如果(当前)工艺升高
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. 如何检测可执行文件是否需要UAC提升(C#pref)
- 2. 检查进程是否正在运行
- 3. 如何检测我的应用程序是否正在运行EarlGrey测试?
- 4. 如何检测Vista UAC是否启用?
- 5. 检测Internet Explorer进程是否正在运行Flash Player
- 6. 如何检查正在运行的进程是否是后台进程?
- 7. 我如何在运行时在运行时提升我的进程win xp
- 8. 使用UAC进行权限提升
- 9. 如何检测远程计算机是否正在运行RDP?
- 10. 如何检查Hadoop守护进程是否正在运行?
- 11. 如何检查进程是否正在运行 - Linux
- 12. 如何检查Linux中是否正在运行进程?
- 13. UAC提升,运行一些不提升的代码
- 14. 如何检查某人是否正在运行我的程序?
- 15. 检查进程是否正在运行(使用进程名称)
- 16. 检测MediaBrowserServiceCompat是否正在运行
- 17. 检测CountdownTimer是否正在运行
- 18. 无法检测用户是否使用提升的权限运行,当没有UAC弹出窗口
- 19. 检测我是否在SharePoint中运行
- 20. 如何检测正在运行的进程使用python
- 21. 检查进程是否正在运行,如果不启动它
- 22. 如何检测特定的Delphi IDE是否正在运行?
- 23. 确定进程是否正在运行?
- 24. 检查程序是否正在运行
- 25. Heroku:如何检测工头是否正在运行
- 26. 如何检测MySQL数据库是否正在运行?
- 27. Node.js - 如何检测节点脚本是否正在运行?
- 28. 如何检测媒体播放器是否正在运行
- 29. 如何检测Windows机器是否正在运行IPV4或IPV6?
- 30. 检测一个进程是否仍在运行
的IsUserAnAdmin功能也可能会有所帮助。 http://msdn.microsoft.com/en-us/library/windows/desktop/bb776463%28v=vs.85%29.aspx – jmnben 2011-10-14 19:11:46