2016-04-24 17 views
-2

私は古いBorland C++コンパイラで作成されたexeを持っています。正しく機能するには管理者権限が必要です。アプリケーションは起動時に実行されるので、プログラムを実行することができれば(Win7でテストする)、ユーザーにプロンプ​​トを表示させたくありません。私の質問は、アプリが実行されるたびにその迷惑なプロンプトを削除する方法はありますか?Windows UACのセキュリティExe

管理者権限を持つマニフェストファイルを追加して署名しましたが、依然として発行者名が表示されます。

これは配布されるので、ユーザーがUACを無効にしたり、複雑すぎることをしないようにしてください。どんな提案も大変ありがとうございます。

私は、「常にこのプログラムを信頼する」のようなUACのために何かがあることを望んでいます。

+0

これは、UACの全目的を凌駕します。 –

+0

いいえ、私は、「常にこのプログラムを信頼する」のようなUACのためのものがあることを期待していました。あなたの-1を削除してください。 – kizeloo

+0

それは私の-1ではありませんが、そこに+1を投げても –

答えて

1

答えは、ログオン時に実行するスケジュールされたタスクを使用することです。スケジュールされたタスクは、SYSTEM権限で実行されるタスクスケジューラーサービスによって起動されるため、起動時にユーザーにプロンプ​​トを表示せずに権限を昇格して実行することができます。スケジュールされたタスクをセットアップするときには、プログラムの実行ごとにユーザー確認を取得する必要があります。

あなたのプログラムをどのようにインストールしているのか分かりません(使用しているインストーラーがあれば)。どの環境でもおそらく実装できる方法を説明します:schtasks.exeとXMLファイル。 (これは、Windows XPおよびそれ以前では動作しないことに注意してください、しかし、そこにあなたがとにかくUACを心配する必要はありません。)

あなたはこのようなXMLファイルを作成する必要があります。

<?xml version="1.0" ?> 
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> 
    <RegistrationInfo> 
     <Date>2013-11-01T00:00:00.0000000</Date> 
     <Author>USERDOMAIN\USERNAME</Author> 
    </RegistrationInfo> 
    <Triggers> 
     <LogonTrigger> 
      <Enabled>true</Enabled> 
      <UserId>USERDOMAIN\USERNAME</UserId> 
     </LogonTrigger> 
    </Triggers> 
    <Principals> 
     <Principal id="Author"> 
      <RunLevel>HighestAvailable</RunLevel> 
      <UserId>USERDOMAIN\USERNAME</UserId> 
      <LogonType>InteractiveToken</LogonType> 
     </Principal> 
    </Principals> 
    <Settings> 
     <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> 
     <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries> 
     <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries> 
     <AllowHardTerminate>false</AllowHardTerminate> 
     <StartWhenAvailable>false</StartWhenAvailable> 
     <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable> 
     <IdleSettings> 
      <StopOnIdleEnd>false</StopOnIdleEnd> 
      <RestartOnIdle>false</RestartOnIdle> 
     </IdleSettings> 
     <AllowStartOnDemand>true</AllowStartOnDemand> 
     <Enabled>true</Enabled> 
     <Hidden>false</Hidden> 
     <RunOnlyIfIdle>false</RunOnlyIfIdle> 
     <WakeToRun>false</WakeToRun> 
     <ExecutionTimeLimit>PT0S</ExecutionTimeLimit> 
     <Priority>7</Priority> 
    </Settings> 
    <Actions Context="Author"> 
     <Exec> 
      <Command>c:\path\to\your\app.exe</Command> 
      <Arguments>/your /parameters</Arguments> 
     </Exec> 
    </Actions> 
</Task> 
  • USERDOMAIN\USERNAMEをすべて実際のユーザーのドメインと名前に置き換えます。たとえば、対応する環境変数USERDOMAINUSERNAMEからそれらを読み取ることができます。
  • c:\path\to\your\app.exeをアプリのパスに置き換え、/your /parametersをアプリに渡す引数があれば置き換えます。
  • ここで秘密の魔法は<RunLevel>HighestAvailable</RunLevel>にあり、タスクスケジューラがあなたのアプリを起動します。
  • Dateは実際問題ではありませんが、完全性のために現在の日付と時刻に設定することができます。見たときschtasks.exe /Create /TN "My App" /F /XML "c:\path\to\xmlfile.xml"(タスクスケジューラに表示された名前を持つMy Appを置き換える:

XMLファイルを作成し、どこか(例えば、一時フォルダを)それを保存した後、あなたは、実際のタスクを作成します。このコマンドを実行する必要があります)。

schtasks.exe /Delete /TN "My App"を使用してタスクを再度削除できます。

(純粋なC++ソリューションについて、あなたはまたthis exampleを取ると、ユーザー名を指定すると、利用可能な最も高い特権を使用するためのフラグを設定することになる欠けているものを追加することができます。)

0

私は理由CherryDTですが、これを書いています答えは良いアプローチであり、文脈に応じて長時間実行すると少し柔軟性がないかもしれません。

(コンテキストに応じて)別のオプションは二つの成分にリファクタリングすることであってもよい

  1. 起動時に実行され、管理者のアクセスを必要とするすべてのもの
  2. と通信するクライアントプログラムを行うシステムサービス管理者アクセスは必要ありません。

これは迷惑なプロンプトを回避しますが、より多くの作業です。あなたの説明に基づいて、ここが正しい方法だとはっきりしていませんが、それは道路の下にあるかもしれません。

関連する問題