0

私はここで少し迷っています。

私はアプリを持っています。それを App1 と呼びましょう。

App1 は正常に動作します。場合によっては、App1 が別のプログラム App2 を実行する必要があります。

コードは簡単です:

           /*call app2*/
            ProcessStartInfo startInfo = new ProcessStartInfo(Convert.ToString(ConfigurationManager.AppSettings["pathActualizador"]));

            startInfo.UseShellExecute = false;

            try
            {
                System.Diagnostics.Process.Start(startInfo);
            }
            catch (ArgumentException)
            {
                MessageBox.Show("Error en parármetros enviados al Actualizador..", Properties.Resources.txtTituloAplicacion, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

            /*close app1 and letting app2 do its work*/
            Application.ExitThread();

場合によっては、app2 を呼び出すための承認に問題があります。app1 は単純なシステムで、app2 はいくつかのファイルとフォルダーを作成、移動、および削除する必要があります (そのため、問題が発生しています) 少なくとも、管理者 de app2 として実行することで解決します。管理者として。

私はこれを解決しようとしています。ここSOでマニフェストファイルを作成することについて、私は多くの投稿を読みました。それで、私はそれを作成しました。アプリケーションプロジェクトから新しいアイテムを追加しました->新しいアイテムを追加-> app.manifest

そして、デフォルトで作成され、これだけが変更されました

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

このマニフェストは App1 用です。両方のアプリが 100 台ほどのコンピューターにあり、1 つずつ変更することはできません (ほとんどのアプリは別の国にあります)。ただし、変更するアプリケーションがあり、いくつかのコマンドを送信してインターネットをスローします。したがって、プロセスが別のプロセスを作成すると、この新しいプロセスはその親と同じ ExecutionLevel を持つことを読みました。そのため、App1 にマニフェストを追加すると、App2 のプロセスが作成され、管理者として実行されます。

私は正しいですか?

一方、マニフェストを追加してコンパイルし、.exe と .manifest をクライアントに送信して実行しましたが、同じ問題が残っています。特権。

何か問題がありますか?代わりに App2 のマニフェストを作成する必要がありますか? これはちょっと難しいです。マシンごとにウィンドウを構成するのも難しいです..

私は次のようなこともできると読んだ

startInfo.Verb = "runas";

しかし、将来(2008年にこれを言った)、これは無視することができ、唯一の方法はマニフェストを使用することも読んでください。だから私はこのオプションを避けたい

編集:Visual Studio 2010、.NET 3.5を使用

edit2:「runas」を試しましたが、動作しません。ユーザーは管理者ではないため、管理者の権限はありません

4

2 に答える 2

0

管理者の資格情報は必要ないことをお勧めします。

app2 は、いくつかのファイルとフォルダーを作成、移動、および削除する必要があります (そのため、問題が発生しています)

この声明には、管理者である必要があることを証明するものは何もありません。プログラムのアーキテクチャを再検討することをお勧めします。最初のステップは、システムに 2 人の別々のユーザーを配置することです。user forapp1と user for は、それぞれ と をapp2呼び出します。これらの両方のユーザーの構成は次のようになります。 App1UserApp2User

非特権、ログイン不可、それぞれのプログラムの実行のみ可能、直接制御されていないものへのアクセス許可はありません。

ここから にApp1User委任しApp2Userて execute を実行できるようになりましたapp2。これにより、権限のエスカレーションが発生するのを防ぎ、管理者の必要性がなくなります。App2User所有するものを作成、移動、および削除できる必要があります。通常のユーザーとして、自分が所有するものを作成、削除、および移動できるため、それは問題になりません。何かを管理者またはルートとして実行する必要がある理由はほとんどありません。

アップデート

次のように返信します。

問題は、App1 が App2 を呼び出して、App2 がいくつかのタスクを実行できるようにする必要がある場合です。App1 はフォルダーなどを作成する必要がないため、UAC に問題はありません。App2 は

では、最初から次の 3 つのシステム オブジェクトを用意します。

AppUser1,AppUser2, AppUserGroup

には と の両方AppUserGroupが含まれます。アプリ ユーザーと同様にロックダウンする必要があります。アクセス許可を構成する必要がある方法は次のとおりです。 AppUser1AppUser2AppUserGroup

App1AppUserGroup が所有し、少なくとも実行権限を持っています。
App2AppUserGroup が所有し、少なくとも実行権限を持っています。

グループ内のユーザーにも権限が付与されていることを確認してください。AppUser1これにより、 のメンバーであるプログラムを呼び出し、グループ内にあり、そのグループがプロセスを所有しているためにAppUserGroup実行することができます。App2これについてさらに説明が必要な場合はお知らせください。

于 2012-10-03T17:32:50.500 に答える
0

WorkingDirectory を設定してみましたか、おそらく App1 の WorkingDir から App2 を実行しようとしています

ProcessStartInfo info = new ProcessStartInfo();
info.WorkingDirectory ="SomePath";

編集:

私はあなたを助けることができるSOのエントリを見つけました: How to start a Process as administrator mode in C#

于 2012-10-03T15:15:25.017 に答える