3

管理者権限で実行する必要があるアプリケーションがあります。UAC がオンの場合は、すべて問題ありません。ただし、UAC がオフになっている場合、開始時にプロンプ​​トが表示されず (標準ユーザーの場合でも)、アプリケーションは制限された権限で開始されます。

動詞「runas」を使用した開始プロセスが機能しません。

UACがオフになっている場合でも、標準のUACログインダイアログを表示して管理者権限でアプリケーションを実行する方法はありますか?

更新: マニフェストが含まれています:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <assemblyIdentity version="1.1.6.0" processorArchitecture="X86" name="setup" type="win32"/>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
            <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
                <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
            </requestedPrivileges>
        </security>
    </trustInfo>
</asmv1:assembly>

UACがアクティブな場合は、すべて問題ありません。ただし、UAC がオフの場合は機能しません。

更新 2::この動作は、MSDNのステップ 6: アプリケーション マニフェスト (UAC) の作成と埋め込みに記載されています(表「標準ユーザー アカウントのアプリケーション起動動作」の最後の行を参照)。したがって、マニフェストでこの問題を解決することはできません。他の解決策はありますか?

4

1 に答える 1

2

私は非常によく似た問題を抱えていましたが、これまでのコメントが実際の問題に対処しているとは思いません。彼らはあなたの質問の意図を誤解していると思います。あなたが最初に尋ねたように、私の答えは実際のUACダイアログを表示しませんが、回避策を示します。

UAC がオフになっているからといって、アプリケーションを管理者として実行することはできませ(管理者パスワードを持っていると仮定すると)。あなたが正当に指摘したように、UAC を無効にrequireAdministratorしてマニフェストに設定すると、Microsoft が示すように、右クリックして選択Run as administratorしても実際にはプロセスが昇格しません。「アプリケーションは起動する可能性がありますが、後で失敗します」

2 つのステップ:

1) を押しShiftながらアプリケーションを右クリックし、 を選択しますRun as a different user。次に、管理者のユーザー名とパスワードを使用して認証を行うだけで、アプリケーションは管理者として実行されます。それは私のために働いた。

スクリーンショット

asInvoker2)管理者権限を実行してチェックする小さな実行可能ファイルを作成します。それらなしで実行すると、ユーザーに警告し、Shift-右クリックしてからRun as a different user. 小さなプログラムに管理者アクセス権がある場合は、 を使用ShellExecuteしてプライマリrequireAdministratorアプリケーションを呼び出します。フロー図については、こちらの図 9を参照してください。

以下は、管理者アクセスをチェックする StackOverflow のどこかにある C++ の小さなコード サンプルです。

BOOL IsUserAdmin(VOID)
{
   BOOL b;
   SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
   PSID AdministratorsGroup; 
   b = AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &AdministratorsGroup); 
   if(true==b) 
   {
      if (!CheckTokenMembership( NULL, AdministratorsGroup, &b)) 
      {
         b = FALSE;
      } 
      FreeSid(AdministratorsGroup); 
   }
   return(b);
}
于 2013-11-05T18:31:13.980 に答える