Мне нужно, чтобы мое приложение работало по-разному в зависимости от того, включен ли Vista UAC или нет. Как мое приложение может определить состояние UAC на компьютере пользователя?
Например, у меня есть приложение, которое использует API для внешней программы, которая требует, чтобы UAC даже работал. Если UAC выключен, я хотел бы сообщить пользователю диалоговое окно.





Проверьте значение реестра в HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System
Значение EnableLUA определяет, активен ли UAC.
Эта почта имеет образец кода на C#, чтобы проверить, включен ли UAC и предоставлены ли текущему приложению повышенные права. Вы можете скачать код и интерпретировать его по мере необходимости. Также связан образец, который показывает то же самое на С ++
http://www.itwriting.com/blog/198-c-code-to-detect-uac-elevation-on-vista.html
Код в этом посте не просто считывается из реестра. Если UAC включен, скорее всего, у вас может не быть прав на чтение этого из реестра.
AFAIK, UAC - это настройка политики для локального пользователя или группы. Таким образом, вы можете прочитать это свойство изнутри .Net. Извините за то, что не имею более подробной информации, но я надеюсь, что это поможет
Этот ключ реестра должен сообщить вам:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
Значение EnableLUA (DWORD)
1 включен / 0 или отсутствует отключен
Но это предполагает, что у вас есть право читать это.
Программно вы можете попытаться прочитать токен пользователя и угадать, работает ли это администратор с включенным UAC (см. здесь). Не надежно, но может сработать.
Вопрос здесь скорее в том, «зачем вам это нужно знать» - он имеет отношение к ответу. На самом деле, API нет, потому что с точки зрения поведения ОС важно, является ли пользователь администратором или нет - как они решат защитить себя в качестве администратора - это их проблема.
Это уловка 22. Если UAC включен, скорее всего, у вас не будет прав на его чтение.
Небольшое исправление: ключ реестра - HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ Syst em, а EnableLUA - это значение DWORD (это не ключ). HTH
Вы должны использовать! = 0, а не сравнивать с 1 в соответствии с источником Google Chrome (по-видимому, некоторые системы имеют> 1 значения)
@RyanFarley Похоже, ACL, унаследованный ключом, дает всем пользователям полный доступ для чтения, поэтому чтение будет проблемой только в том случае, если кто-то изменил ACL.
На моей 64-битной машине с Windows 7 можно включить UAC без этого ключа. Я предполагаю, что вместо этого мой UAC включен через групповую политику. Я считаю, что то же самое и с Vista.
По крайней мере, в Windows Server 2016 этот ключ всегда равен «1», когда UAC отключен.
Вы можете сделать это, изучив значение DWORD EnableLUA в следующем разделе реестра:
HKLM / ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ / Microsoft / Windows / Текущая версия / Политики / Система
Если значение равно 0 (или не существует), тогда UAC выключен. Если он присутствует и не равен нулю, то UAC включен:
BOOL IsUacEnabled( )
{
LPCTSTR pszSubKey = _T("SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System");
LPCTSTR pszValue = _T("EnableLUA");
DWORD dwType = 0;
DWORD dwValue = 0;
DWORD dwValueSize = sizeof( DWORD );
if ( ERROR_SUCCESS != SHGetValue( HKEY_LOCAL_MACHINE, pszSubKey, pszValueOn,
&dwType, &dwValue, &dwValueSize) )
{
return FALSE;
}
return dwValue != 0;
}
Обратите внимание, что если пользователь изменил состояние UAC, но еще не перезагрузил компьютер, эта функция вернет противоречивый результат.
Вы не хотите проверять, включен ли UAC; это вам ничего не говорит.
Я могу быть обычным пользователем с отключенным UAC.
Вы хотите проверить если пользователь работает с правами администратора, используя CheckTokenMembership:
///This function tells us if we're running with administrative permissions.
function IsUserAdmin: Boolean;
var
b: BOOL;
AdministratorsGroup: PSID;
begin
{
This function returns true if you are currently running with
admin privileges.
In Vista and later, if you are non-elevated, this function will
return false (you are not running with administrative privileges).
If you *are* running elevated, then IsUserAdmin will return
true, as you are running with admin privileges.
Windows provides this similar function in Shell32.IsUserAnAdmin.
But the function is depricated, and this code is lifted from the
docs for CheckTokenMembership:
http://msdn.microsoft.com/en-us/library/aa376389.aspx
}
{
Routine Description: This routine returns TRUE if the caller's
process is a member of the Administrators local group. Caller is NOT
expected to be impersonating anyone and is expected to be able to
open its own process and process token.
Arguments: None.
Return Value:
TRUE - Caller has Administrators local group.
FALSE - Caller does not have Administrators local group.
}
b := AllocateAndInitializeSid(
SECURITY_NT_AUTHORITY,
2, //2 sub-authorities
SECURITY_BUILTIN_DOMAIN_RID, //sub-authority 0
DOMAIN_ALIAS_RID_ADMINS, //sub-authority 1
0, 0, 0, 0, 0, 0, //sub-authorities 2-7 not passed
AdministratorsGroup);
if (b) then
begin
if not CheckTokenMembership(0, AdministratorsGroup, b) then
b := False;
FreeSid(AdministratorsGroup);
end;
Result := b;
end;
Этот пост довольно древний, но я хотел прокомментировать биты «зачем вам это знать» и «проверить членство в токене».
Дело в том, что в самой документации Microsoft говорится, что «Если контроль учетных записей пользователей отключен и стандартный пользователь пытается выполнить задачу, требующую повышения прав», мы должны выдать ошибку вместо того, чтобы отображать кнопки и / или ссылки с экраном UAC, который попытаться поднять. Подробнее см. http://msdn.microsoft.com/en-us/library/windows/desktop/aa511445.aspx внизу.
Как мы можем это сделать, не проверяя, включен ли UAC?
Возможно, в этом случае правильнее всего будет проверить, работает ли пользователь с правами администратора, но кто знает? Руководство, которое дает Microsoft, - в лучшем случае - сомнительно, если не просто сбивать с толку.
Для всех, кто находит это и ищет решение VBScript. Вот что я придумал, чтобы определить, включен ли UAC, и, если да, перезапустить мой скрипт с повышенными привилегиями. Просто поместите свой код в функцию Body (). Я обнаружил, что возникали проблемы с переносимостью между XP и Windows 7, если я писал код, чтобы всегда запускать с повышенными правами. Используя этот метод, я обхожу высоту, если нет UAC. Также следует учитывать версии серверов 2008 и более поздних версий с включенным UAC.
On Error Resume Next
UACPath = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA"
Dim WshShell
Set WshShell = CreateObject("wscript.Shell")
UACValue = WshShell.RegRead(UACPath)
If UACValue = 1 Then
'Run Elevated
If WScript.Arguments.length =0 Then
Set objShell = CreateObject("Shell.Application")
'Pass a bogus argument with leading blank space, say [ uac]
objShell.ShellExecute "wscript.exe", Chr(34) & _
WScript.ScriptFullName & Chr(34) & " uac", "", "runas", 1
WScript.Quit
Else
Body()
End If
Else
Body()
End If
Function Body()
MsgBox "This is the body of the script"
End Function
Вы можете объяснить, зачем вам это нужно?