6

私は Visual Studio 2010 を使用しており、新しいレジストリ値を設定 (および読み取り) する必要があるプログラムを作成しています。HKLM\Software\myapp

このプログラムは .NET 2.0 ベースで、現在のところ Windows 7 64 ビットで動作します。ここに私のocdeがあります:

RegistryKey softwareKey = Registry.LocalMachine.OpenSubKey("Software", true);
RegistryKey MyKey = softwareKey.CreateSubKey("MyApp");
RegistryKey  = MyKey.CreateSubKey("MyKey");
selfPlacingWindowKey.SetValue("instaldateperson", datestr + usrname);     

Visual Studio 2010 を実行しているときに発生する問題は、アプリは実行されますが、ローカル管理者グループのユーザーおよびメンバーである私としてログオンすることです..しかし、キーを作成できません (ローカル管理者グループの一員であるにもかかわらず) 、そうする権利を持っている)。ログオンとしてそれを行う方法もわかりません(しかし、コード内にAdminuserとパスワードを入れてから、それは私が望むものでもありません。私はすでに管理者です??なぜですか??)

これがまったく不可能な場合、レジストリ キーを作成するオプションはありますか?

どういうわけかそれらをプロジェクトに追加するか??.. ここで少し混乱しています。

4

6 に答える 6

10

管理者として実行している (または管理者権限を持つアカウントを使用している) からといって、それらの管理者権限が常に有効であるとは限りません。これはセキュリティ対策であり、管理者権限でコンピューターを常に愚かに使用するユーザーをマルウェアが悪用するのを防ぎます。

管理者権限を行使するには、プロセスを昇格させる必要があります。これを行うには、次の 2 つの方法があります。

  1. アプリケーションが管理者特権を必要とすることを示すマニフェストを使用して、起動時に昇格を要求します。

    これは、アプリケーションが常に昇格して実行され、アプリケーションがこれを必要とする場合にのみ使用する必要があることを意味します。たとえば、Windows レジストリ エディター (RegEdit) はこれを行います。これは、管理者特権なしではほとんど何もできないためです。

    これを達成する方法については、MSDN のこちら、またはこちらの回答を参照してください。基本的に、次の行をマニフェストに追加するだけです。

    <requestedExecutionLevel level="requireAdministrator" />
    
  2. 特定のタスク (特定の設定をレジストリに保存するなど) に対してのみ管理者特権が必要で、アプリケーションの残りの部分ではそれを必要としない場合は、新しい昇格プロセスを起動してこれを行う必要があります。現在のプロセスを一時的に昇格させる方法はないため、実際には新しいプロセスをスピンオフする必要があります。

    この方法の利点は、アプリケーションを常に管理者権限で実行する必要がなく (セキュリティが向上します)、管理者権限を持たないユーザーでもアプリを実行して他のすべてのことを実行できることです (つまり、昇格を必要とする 1 つまたは 2 つのタスクを除くすべて)。

    クラスを使用してレジストリに書き込むために必要なロジックのみを含む別のプロセスをスピンオフし、動詞Processを使用してこのプロセスの昇格を要求します。runas詳細については、この質問を参照してください。また、サンプル コードを含め、C# からこれを達成する方法を完全に説明する回答も書きました。

もちろん、他の回答が述べているように、アプリケーションの設計が間違っている可能性が高くなります。Windows セキュリティ モデルの全体的なロジックは、通常のアプリケーションは管理者特権を必要としないということです。レジストリへの書き込みや、マシンを危険にさらす可能性のあるその他のことを行う必要はありません。設定を保持する必要がある場合は、他に 2 つの方法を提案できます。

  1. Windows が実際にマルチユーザー オペレーティング システムであることを認識し、現在のユーザーに対してのみ設定を書き込みます。ユーザーによって設定や好みが異なることが多いため、これは理にかなっています。HKEY_LOCAL_MACHINEレジストリのブランチ (アクセスするには管理者権限が必要) の代わりに、HKEY_CURRENT_USER. コードの最初の行を次のように変更します。

     RegistryKey softwareKey = Registry.CurrentUser.OpenSubKey("Software", true);
    
  2. .NET に組み込まれたロジックを使用してアプリケーションの設定を永続化することにより、レジストリへの書き込みの手間と複雑さをすべてスキップします。ここ 、ここ、またはMSDN回答を読み始めて、その方法を学びます。これは断然あなたの最良の選択肢だと思います。複雑なコードを自分で作成して、使用しているフレームワークに簡単に実行できるサポートが組み込まれていることを実行しないでください。

于 2013-03-31T13:05:53.837 に答える
3

アプリケーションの設計が間違っている可能性があります。標準のデスクトップ アプリは に書き込むことは想定されていませんHKEY_LOCAL_MACHINE。UAC のため、管理者権限を持ち、昇格されたプロセスで実行して に書き込むことができる必要がありますHKLM

アプリケーションを変更する必要がある場合は、インストーラーが管理HKLM者特権で実行されるため、インストール時に変更することを検討してください。

デスクトップ アプリケーションが書き込みを行う必要がある場合HKLMは、管理者特権で実行する必要があるアプリケーションの部分を別のプロセスに分離することを検討する必要があります。そうしないと、ユーザーは、アプリケーションを実行するために UAC ダイアログを経由しなければならないことにうんざりしてしまいます。に書き込むアプリケーションの部分を使用していなくてもHKLM。また、アプリ全体で強制的に昇格を要求すると、標準ユーザーはまったく実行できなくなります。

于 2013-03-31T13:03:36.513 に答える
2

Visual Studio の実行中に HKEY_LOCAL_MACHINE の下にキーを作成できない理由は、Visual Studio が昇格されたプロセスとして実行されていないためです。

エンドユーザーの場合、アプリケーションのマニフェストは、完全な管理者権限が必要であることを示す必要があります。これは、 UAC のマニフェストの埋め込みに関するドキュメントです。

レジストリ キーがマシン上でグローバルである必要がない場合は、代わりに HKEY_CURRENT_USER への書き込みを検討してください。

于 2013-03-31T13:00:42.583 に答える