私のVB6アプリケーションで、他のEXEファイルを開きます。アプリケーションはUACプロンプトなしで実行されますが、ソフトウェアの更新をチェックするEXEがあります。これにより、UACプロンプトが表示されます。では、WindowsはUACプロンプトを表示するかどうかをどのように決定するのでしょうか。私はこれを見た link 。それは、アプリケーションで記述したコードに依存しますか?興味深いのは、私のアプリケーション(つまり、メインEXEファイル)がUACを要求しないのに対し、更新プログラムを確認してダウンロードする小さなEXEがUACを要求することです。すべてのEXEファイルがデジタル署名されています。私は以下のリンクを一目見ました:
http://msdn.Microsoft.com/en-us/library/windows/desktop/aa511445.aspx
http://technet.Microsoft.com/en-us/library/cc505883.aspx およびその他.
しかし、それでもはっきりしません。
あなたはほぼ間違いなくWindows Installer Detection Technology 互換性ヒューリスティックを使用しています。 Windowsは、アプリケーションがインストーラーであることを検出しようとし、おそらく昇格する必要があります。
インストーラー検出は以下にのみ適用されます:
- 32ビット実行可能ファイル
requestedExecutionLevel
のないアプリケーション- LUAを有効にした標準ユーザーとして実行されている対話型プロセス
32ビットプロセスが作成される前に、次の属性がチェックされ、それがインストーラーかどうかが判断されます。
- ファイル名には、「インストール」、「セットアップ」、「アップデート」などのキーワードが含まれています。
- 次のバージョン管理リソースフィールドのキーワード:ベンダー、会社名、製品名、ファイルの説明、元のファイル名、内部名、エクスポート名。
- 実行可能ファイルに埋め込まれたside-by-sideマニフェストのキーワード。
- 実行可能ファイルにリンクされている特定のStringTableエントリのキーワード。
- 実行可能ファイルにリンクされているRCデータの主要な属性。
- 実行可能ファイル内のターゲットバイトシーケンス。
だから、あなたが言ったように:
ソフトウェアの更新をチェックするexeがあります
私の推測では、これはCheckForUpdates.exe
が互換性ヒューリスティックをトリガーしています。
実行する正しいことは、アセンブリマニフェストを「チェック」実行可能ファイルに追加して、Windowsにそれを通知することですnotユーティリティを昇格させます。これは、マニフェストのrequestedExecutionLevel
のasInvoker
で行われます。
AssemblyManifest.xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Assembly xmlns="urn:schemas-Microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="ITReasearchAssociates.Contoso.Updater"
type="win32"
/>
<description>Update checker</description>
<!-- Run as standard user. Disable file and registry virtualization -->
<trustInfo xmlns="urn:schemas-Microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</Assembly>
そうすれば、「更新の確認」アプリケーションが昇格したり、誤って管理者権限を取得したりすることはありません。
アップデーターに実際にapplyアップデート(管理者権限が必要なアップデート)を実行させたい場合は、アップデーターアプリケーションを管理者として起動します。
//Check if there are updates available
if (!CheckForUpdatesAvailable())
return; //no updates. We're done
//If the user is an administrator, then get the update
if (IsUserAnAdmin())
{
//Maybe throw in a "Hey, user, wanna get the update now?" dialog
DownloadAndApplyUpdates();
return;
}
//The user is not an admin.
//Relaunch ourselves as administrator so we can download the update
//Maybe throw in a "Hey, user, wanna get the update now?" dialog. A button with a UAC shield on it
ExecuteAsAdmin(Application.ExecutablePath, "/downloadUpdate");
ヘルパー関数で:
private Boolean IsUserAnAdmin()
{
//Public domain: no attribution required
//A user can be a member of the Administrator group, but not an administrator.
//Conversely, the user can be an administrator and not a member of the administrators group.
var identity = WindowsIdentity.GetCurrent();
return (null != identity && new WindowsPrincipal(identity).IsInRole(WindowsBuiltInRole.Administrator));
}
private void ExecuteAsAdmin(string Filename, string Arguments)
{
//Public domain: no attribution required
ProcessStartInfo startInfo = new ProcessStartInfo(Filename, Arguments);
startInfo.Verb = "runas";
System.Diagnostics.Process.Start(startInfo);
}
次に、起動時に/downloadUpdate
コマンドラインパラメータを使用して、実際に仕事をすることが仕事であることがわかります。
public Form1()
{
InitializeComponent();
//Ideally this would be in program.cs, before the call to Application.Run()
//But that would require me to refactor code out of the Form file, which is overkill for a demo
if (FindCmdLineSwitch("downloadUpdate", true))
{
DownloadAndApplyUpdates();
Environment.Exit(0);
}
}
注:すべてのコードはパブリックドメインにリリースされます。帰属は必要ありません。
プログラムにはおそらく、非レガシーとしてマークするアプリケーションマニフェストが不足しています。その結果、Windowsはスクリプトインストーラー検出ヒューリスティックを適用して、プログラムがインストーラーかどうかを判断します。これは、「予期しない」UACプロンプトが発生する唯一の方法です。
これらのヒューリスティックには、EXEファイル名内のキーワード検索と、EXEの拡張プロパティのいくつかが含まれ、ファイル内の既知のバイナリ署名(バイト文字列)を探すこともできます。
ところで、あなたの暗号署名はこれにはまったく入りません。また、信頼されたCAによって発行されたものでない場合は、役に立ちません。
さらに言えば、WindowsがUACプロンプトで会社名を報告するからといって、コードを信頼する人はだれでもです。マルウェアの作成者はこれらを常に盗みます。しかも、悪質なプログラムが問題を引き起こした場合、それらは入手するのは簡単で、ユーザーから報告されることはほとんどありません。あなたのお金を節約してください、コード署名証明書は失敗した概念です。
誰かがexeの構成で、このファイルをより高い特権で実行する必要があることを指定できます。
この更新の目的はわかりませんが、サービスなどのコンポーネント、またはProgramFiles-Dirにあるいくつかのファイルを更新する必要があることをお勧めします。したがって、管理者権限が必要です。
UACプロンプトは、特権の昇格が必要な場合に使用されます。独自のVB6アプリでは必要ないため、デフォルトの動作で問題ありません。アップデーターは特権を必要とするので、その作成者は実行可能ファイルをそれが必要であるとマークしました。 Windowsはそれを見つけ、UACプロンプトを出します。
Windowsの正確なバージョンとセキュリティアップデートに応じて、その特権は他の(子)プロセスに対してもしばらくの間利用できます。これにより、UACプロンプトの重複を防ぐことができます。