![提升的 cmd.exe 進程的環境變數從何而來?](https://rvso.com/image/1330226/%E6%8F%90%E5%8D%87%E7%9A%84%20cmd.exe%20%E9%80%B2%E7%A8%8B%E7%9A%84%E7%92%B0%E5%A2%83%E8%AE%8A%E6%95%B8%E5%BE%9E%E4%BD%95%E8%80%8C%E4%BE%86%EF%BC%9F.png)
根據命令提示字元會話的權限級別,SET 命令顯示的環境變數可能會顯著不同。此外,似乎由同一使用者使用管理憑證運行的任何程式都可以建立環境變量,這些變數在該進程結束後將持續很長時間,並將在該使用者啟動的任何後續提升的進程中進行設定(並且僅在這些提升的進程中)。對於與使用者登入工作階段關聯的任何進程,我無法在 Process Explorer 顯示的「環境」標籤中找到這些變數。我的問題是:這些值儲存在哪裡,為什麼 Process Explorer 無法存取它們(當然,由於 Process Explorer 預設運行提升,這些變數出現在其自己的環境標籤中)?還是我只是忽略了他們?
答案1
提升的 cmd.exe 進程的環境變數從何而來?
與所有進程一樣,它從產生命令提示字元實例的進程獲取其環境。
當一個行程產生另一個行程時,子行程將繼承父行程的環境。如果父級具有特權,那麼它可能比沒有特權時具有更多/不同的變數。當它產生子進程時,子進程將獲得相同的集合來開始。
根據命令提示字元會話的權限級別,SET 命令顯示的環境變數可能會顯著不同。
因為當資源管理器實際上沒有產生特權程序時,CSRSS 就會產生特權程序。當您「以管理員身分」執行程式時,您會收到 UAC 提示,該提示會使螢幕變暗。這是因為 CSRSS 是一個處理 UAC 提示和進程提升的系統流程。因此,雖然資源管理器及其子進程有一個環境,但有一個提升的命令提示字元(由高權限系統進程產生)應要求Explorer 的)得到了一個稍微不同的集合,其中包含一些額外/不同的變數。
此外,似乎由同一使用者使用管理憑證運行的任何程式都可以建立環境變量,這些變數在該進程結束後將持續很長時間,並將在該使用者啟動的任何後續提升的進程中設定(並且僅在在這些提升的進程中)。
沒有。該set
命令僅適用於會話。一旦關閉該命令提示符,您所做的任何更改都會失效。若要進行持久更改,您必須使用外部工具,例如第三方實用程式或 Microsoft 工具程式setx
。即使是高級命令提示字元也是如此;該set
命令根本沒有修改註冊表中環境的功能。
對於與使用者登入工作階段關聯的任何進程,我無法在 Process Explorer 顯示的「環境」標籤中找到這些變數。
因為您所做的任何更改set
只會在那個具體的命令提示字元和您從中啟動的任何進程那個具體的命令提示字元;這些變更不會傳播到其他進程。
我的問題是這些值儲存在哪裡,為什麼 Process Explorer 無法存取它們(當然,由於 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 命令所示),以及任何存在於使用者的HKCU /Volatile Environment 登錄項目中,這些登錄項目是自目前登入工作階段(或Explorer 的目前實例?)啟動以來所建立的,並且不會顯示在非提升的SET 清單中。我的 Windows 10 中有一些變數出現在非提升清單中,但不在提升清單中。
這個問題是由舊版的 Macrium Reflect 的行為引起的,該問題在https://forum.macrium.com/Topic752-1.aspx程式的目前版本現在在 HKU/.DEFAULT/Volatile Environment(又稱 HKU/S-1-5-18/Volatile Environment)而不是在 HKCU 密鑰下創建這些有問題的變數。