C#で扱える環境変数の種類とその取得/設定に関して

案件で環境変数への値の取得/設定に関して少し調査を行ったので、
ブログ用に少し内容増やして調査結果以下に記載します。

C#において扱える環境変数の種類(EnvironmentVariableTarget)は以下の3つです。

Process: プロセスごとの環境変数

User: ユーザごとの環境変数
(システムの詳細設定から確認可能、レジストリ値 HKEY_CURRENT_USER\Environment内)

Machine: PC共通のシステム環境変数
(システムの詳細設定から確認可能。レジストリ値
 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment内)

取得、設定、削除(nullを設定)は以下のメソッドにより可能です。

string? Environment.GetEnvironmentVariable (string variable, EnvironmentVariableTarget target);
void Environment.SetEnvironmentVariable (string variable, string? value, EnvironmentVariableTarget target);

以下の表に、取得/設定時の種類ごとの主な違いをまとめてみました。

以下知見や所感です。
・ユーザ及びマシンは、プロセスの再起動など不要で、
 同時に起動している異なるプロセスにて共有可能でした。

・管理者権限必要なのはマシンだけでした。
 ユーザも内部的にはレジストリ値なので権限必要に思えたのですが、
 HKEY_CURRENT_USER下のキーの変更は権限不要らしいです。

・ユーザとマシンは他のアプリとも共有で影響及ぼすかもなので取得や設定、削除に注意が必要です。
 また、プロセスとは異なり、システム詳細設定やレジストリエディターから
 値が容易に確認可能なため、プロキシ設定などの認証情報の書き込みを行うと
 ユーザIDとパスワードが平文で見えてしまう点も注意です。

・ユーザやマシンへのSetは2秒程度かかり、実行時暫し動作が固まったので、
 場合によってはプログレス表示必要かもしれません。
 内部でレジストリへの書き込みを行う関係か少し時間がかかるようですね。
(参考PCスペック:CPU=intel core i9-13900, RAM=32GB)

・どれを使うかは用途次第ですが、扱いやすいのは管理者権限不要なプロセスとユーザで、
 プロセス間で共有するかどうかで使い分けるのが良いかと思いました。

以上です。

コメントを残す