Vista UACが有効になっているかどうかによって、アプリケーションの動作が異なる必要があります。アプリケーションは、ユーザーのコンピューター上のUACの状態をどのように検出できますか?
8 に答える
このレジストリ キーは次のことを示しているはずです。
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
価値 EnableLUA (DWORD)
1
有効/0
または欠落無効
ただし、それはあなたがそれを読む権利を持っていることを前提としています。
プログラムでユーザーのトークンを読み取って、UAC を有効にして実行している管理者であるかどうかを推測できます (こちらを参照)。誰にでもできるわけではありませんが、うまくいくかもしれません。
ここでの問題は、「なぜ知る必要があるのか」ということです。それは答えに関係しています。実際には、OS の動作の観点からは、ユーザーが管理者であるかどうかが重要であるため、API はありません。管理者として自分自身を保護する方法を選択するのは彼らの問題です。
この投稿には、UACがオンになっているかどうか、および現在のアプリに昇格された権限が付与されているかどうかをテストするためのC#のサンプルコードが含まれています。コードをダウンロードして、必要に応じて解釈できます。また、C++で同じことを示すサンプルがリンクされています
http://www.itwriting.com/blog/198-c-code-to-detect-uac-elevation-on-vista.html
その投稿のコードは、レジストリから読み取るだけではありません。UACが有効になっている場合、レジストリから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;
次のレジストリ キーの DWORD 値EnableLUAを調べることで実行できます。
HKLM/ソフトウェア/マイクロソフト/Windows/CurrentVersion/ポリシー/システム
値が 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 の状態を変更したが、まだコンピュータを再起動していない場合、この関数は一貫性のない結果を返すことに注意してください。
HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies\Systemでレジストリ値を確認します
EnableLUA値は、UACがアクティブかどうかを決定します。
この投稿はかなり古いものですが、「なぜ知る必要があるのか」と「トークンのメンバーシップを確認する」についてコメントしたいと思います。
実際のところ、マイクロソフト独自のドキュメントには、「ユーザー アカウント制御がオフになっていて、標準ユーザーが昇格が必要なタスクを実行しようとした場合」、ボタンや UAC シールドへのリンクを表示する代わりにエラーを表示する必要があると記載されています。昇格を試みます。詳細については、下部にあるhttp://msdn.microsoft.com/en-us/library/windows/desktop/aa511445.aspxを参照してください。
UAC が有効になっているかどうかを確認する方法なしに、これを行うにはどうすればよいでしょうか。
おそらく、ユーザーが管理者権限で実行しているかどうかを確認することは、この場合に行うべき正しいことですが、誰が知っていますか? マイクロソフトが提供するガイダンスは、まったく紛らわしいだけではないにしても、せいぜい不確かです。
これを見つけてVBScriptソリューションを探している他の人のために。これが、UACが有効になっているかどうかを検出し、有効になっている場合は、昇格された特権でスクリプトを再起動するために思いついたものです。コードをBody()関数に入れるだけです。常に昇格して起動するコードを記述した場合、XPとWindows7の間の転送性に問題があることがわかりました。この方法を使用すると、UACがない場合、標高をバイパスします。UACが有効になっている2008以降のサーバーバージョンも考慮に入れる必要があります。
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
AFAIK、UACは、ローカルユーザーまたはグループのポリシー設定です。したがって、このプロパティは.Net内から読み取ることができます。詳細がわからなくて申し訳ありませんが、これがお役に立てば幸いです