Windows Server 2008 64 ビットを除くすべての Windows OS で正常に動作するコードがいくつかあります。このコードは、UAC がオンになっているかどうかを判別します。
int TokenInfLength = 0;
bool 結果;
// 最初の呼び出しで TokenInformation の長さを取得します
結果 = GetTokenInformation(WindowsIdentity.GetCurrent().Token, TOKEN_INFORMATION_CLASS.TokenElevationType, IntPtr.Zero, TokenInfLength, out TokenInfLength);
IntPtr TokenInformation = Marshal.AllocHGlobal(TokenInfLength);
結果 = GetTokenInformation(WindowsIdentity.GetCurrent().Token, TOKEN_INFORMATION_CLASS.TokenElevationType, TokenInformation, TokenInfLength, out TokenInfLength);
if (結果)
{
TOKEN_ELEVATION_TYPE elevationType = (TOKEN_ELEVATION_TYPE)Marshal.ReadInt32(TokenInformation);
Marshal.FreeHGlobal(TokenInformation);
スイッチ (標高タイプ)
{
case TOKEN_ELEVATION_TYPE.TokenElevationTypeDefault:
Console.WriteLine("お使いのオペレーティング システムで UAC (ユーザー アカウント制御) がオフになっています。UAC をオンにして、コンピューターを再起動してください。"); 壊す;
case TOKEN_ELEVATION_TYPE.TokenElevationTypeFull:
Console.WriteLine("ユーザーには分割トークンがあり、プロセスは昇格して実行されています");
壊す;
ケース TOKEN_ELEVATION_TYPE.TokenElevationTypeLimited:
Console.WriteLine("ユーザーは分割トークンを持っていますが、プロセスは昇格して実行されていません");
壊す;
}
}
...
enum TOKEN_ELEVATION_TYPE : int
{
TokenElevationTypeDefault = 1、
TokenElevationTypeFull、
TokenElevationTypeLimited
}
enum TOKEN_INFORMATION_CLASS
{
トークンユーザー = 1、
トークングループ、
TokenPrivileges、
トークン所有者、
TokenPrimaryGroup、
TokenDefaultDacl、
トークンソース、
トークンタイプ、
TokenImpersonationLevel、
トークン統計、
TokenRestrictedSids、
TokenSessionId、
TokenGroupsAndPrivileges、
TokenSessionReference、
TokenSandBox不活性、
TokenAuditPolicy、
TokenOrigin、
TokenElevationType、
TokenLinkedToken、
TokenElevation、
TokenHasRestrictions、
トークンアクセス情報、
トークン仮想化許可、
TokenVirtualizationEnabled、
TokenIntegrityLevel、
TokenUIAccess、
TokenMandatoryPolicy、
TokenLogonSid、
MaxTokenInfoClass
}
TOKEN_INFORMATION_CLASS.TokenElevationType序数値が 18 の enum const です。
そのため、WS 2008 64 ビットで UAC を有効にすると、「オペレーティング システムで UAC (ユーザー アカウント制御) がオフになっています。UAC をオンにして、コンピューターを再起動してください」というメッセージが表示されます。誰が問題を知っていますか?