昇格された cmd.exe プロセスの環境変数はどこから来るのでしょうか?

昇格された cmd.exe プロセスの環境変数はどこから来るのでしょうか?

SET コマンドで表示される環境変数は、コマンド プロンプト セッションの権限レベルによって大きく異なる場合があります。さらに、同じユーザーが管理者の資格情報を使用して実行するプログラムは、プロセス終了後も長期間存続する環境変数を作成できるようです。この環境変数は、そのユーザーが起動する後続の昇格されたプロセスで設定されます (昇格されたプロセスでのみ)。ユーザー ログイン セッションに関連付けられたプロセスについて、Process Explorer に表示される [環境] タブでこれらの変数を見つけることができませんでした。私の質問は、これらの値はどこに保存されているのか、そして Process Explorer がそれらにアクセスできないのはなぜなのか (もちろん、Process Explorer はデフォルトで昇格された状態で実行されるため、これらの変数は独自の [環境] タブに表示されます)。それとも、私が見落としただけでしょうか。

答え1

昇格された cmd.exe プロセスの環境変数はどこから来るのでしょうか?

すべてのプロセスと同様に、コマンド プロンプト インスタンスを生成したプロセスから環境を取得します。

プロセスが別のプロセスを生成すると、子プロセスは親の環境を継承します。親プロセスに特権があった場合、そうでない場合よりも多くの変数/異なる変数がある可能性があります。子プロセスを生成すると、子プロセスは最初に同じセットを取得します。

SET コマンドによって表示される環境変数は、コマンド プロンプト セッションの権限レベルによって大きく異なる場合があります。

エクスプローラーが実際に特権プロセスを生成しない場合、CSRSSが生成します。プログラムを「管理者として」実行すると、UACプロンプトが表示され、画面が暗くなります。これは、CSRSSがUACプロンプトとプロセス昇格を処理するシステムプロセスであるためです。したがって、エクスプローラーとその子プロセスには、昇格されたコマンドプロンプト(高権限のシステムプロセスによって生成される)という1つの環境がありますが、命令によりエクスプローラーの) は、いくつかの追加/異なる変数を含むわずかに異なるセットを取得します。

さらに、同じユーザーが管理者の資格情報を使用して実行するプログラムは、プロセスが終了した後も長期間存続し、そのユーザーが起動した後続の昇格されたプロセス (昇格されたプロセスのみ) に設定される環境変数を作成できるようです。

いいえ。このsetコマンドはセッションのみです。コマンド プロンプトを閉じると、行った変更はすべて消えてしまいます。永続的な変更を行うには、サードパーティのユーティリティや Microsoft ツール プログラムなどの外部ツールを使用する必要がありますsetx。これは、管理者特権のコマンド プロンプトでも同様です。setコマンドには、レジストリ内の環境を変更する機能がありません。

ユーザー ログイン セッションに関連付けられたプロセスについて、Process Explorer に表示される環境タブでこれらの変数を見つけることができませんでした。

で行った変更はsetその特定のコマンドプロンプトとそこから起動するプロセスその特定のコマンドプロンプト。変更は他のプロセスには伝播されません。

私の質問は、これらの値はどこに保存されているのか、そしてなぜ Process Explorer はそれらにアクセスできないのかということです (もちろん、Process Explorer はデフォルトで管理者特権で実行されるため、これらの変数は独自の環境タブに表示されます)。それとも、私がそれらを見落としただけでしょうか?

セッション変数は、その特定のコマンドプロンプトの環境に保存されます。プロセスエクスプローラーは、その特定のインスタンスのセッション変数を見ることができますcmdが、他のプロセスでは見ることができません。そのコマンドプロンプトからプログラムを起動すると、子プロセスでそれらの変更を見ることができます。環境タブで Process Explorer にコマンド プロンプトから継承されるためです。

のようなプログラムを使用してsetx永続変数を設定すると、その変数はレジストリに保存されます。ユーザー レベルの変数 (現在のユーザー用) を設定すると、その変数はHKCU\Environment(またはHKU\<USER>\Environment他のユーザー用) に保存されます。システム レベルの変数を設定すると、その変数は に保存されますHKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

レジストリを通じて環境を手動で変更した場合、新しいプロセスのみが変更を取得することに注意してください。既存のプロセスに変更を反映させるには、プロセスを再起動するか、メッセージをブロードキャストする必要がありますWM_SETTINGCHANGE。(ツールは、setxすべてのトップレベル ウィンドウにメッセージをブロードキャストします。)

答え2

出力がSET異なるのは、管理者グループのメンバーとしてログインしていないときだけだと思います。その場合、ユーザー名とパスワードの入力を求められますが、実際にはそのプロセスに管理者としてログインしていることになります。

すでに管理者グループのメンバーである場合、SET の出力はどちらの場合も同じです。

したがって、私の仮説が正しい場合、昇格された権限変数は管理者のユーザー変数として定義されます。

答え3

新しく作成された昇格されたプロセスで環境変数がどのように設定されるかは明確ではありませんが、環境変数のほとんどは、現在のユーザーの既存のセット (昇格されていない cmd.exe SET コマンドで表示される) と、現在のログイン セッション (または現在の Explorer インスタンス?) の開始以降に作成され、昇格されていない SET リストには表示されない、ユーザーの HKCU/Volatile Environment レジストリ キーに存在する変数から取得されます。私の Windows 10 には、昇格されていないリストには表示されるものの、昇格されたリストには表示されない変数がいくつかあります。

この質問は、Macrium Reflectの古いバージョンの動作に起因しており、これについては以下で議論されています。https://forum.macrium.com/Topic752-1.aspxこのプログラムの現在のバージョンでは、問題のある変数が HKCU キーの下ではなく、HKU/.DEFAULT/Volatile Environment (別名 HKU/S-1-5-18/Volatile Environment) に作成されるようになりました。

関連情報