상승된 cmd.exe 프로세스에 대한 환경 변수는 어디에서 왔습니까?

상승된 cmd.exe 프로세스에 대한 환경 변수는 어디에서 왔습니까?

SET 명령으로 표시되는 환경 변수는 명령 프롬프트 세션의 권한 수준에 따라 크게 다를 수 있습니다. 또한 동일한 사용자가 관리 자격 증명을 사용하여 실행하는 모든 프로그램은 해당 프로세스가 끝난 후에도 오랫동안 유지되고 해당 사용자가 시작한 후속 승격된 프로세스에서만 설정되는 환경 변수를 생성할 수 있는 것으로 보입니다(그리고 해당 승격된 프로세스에서만). 사용자 로그인 세션과 관련된 프로세스에 대해 Process Explorer에 표시된 환경 탭에서 해당 변수를 찾을 수 없습니다. 내 질문은 다음과 같습니다. 해당 값은 어디에 저장되어 있으며 프로세스 탐색기는 왜 해당 값에 액세스할 수 없습니까? (물론 프로세스 탐색기는 기본적으로 상승된 권한으로 실행되므로 해당 변수는 자체 환경 탭에 나타납니다.) 아니면 제가 그냥 간과한 걸까요?

답변1

상승된 cmd.exe 프로세스에 대한 환경 변수는 어디에서 왔습니까?

모든 프로세스와 마찬가지로 명령 프롬프트 인스턴스를 생성한 프로세스에서 환경을 가져옵니다.

프로세스가 다른 프로세스를 생성하면 하위 프로세스가 상위 프로세스를 상속합니다. 부모에게 권한이 있는 경우 그렇지 않은 경우보다 더 많은/다른 변수가 있을 수 있습니다. 하위 프로세스가 생성되면 해당 하위 프로세스는 시작할 때와 동일한 세트를 가져옵니다.

SET 명령으로 표시되는 환경 변수는 명령 프롬프트 세션의 권한 수준에 따라 크게 다를 수 있습니다.

Explorer가 실제로 권한 있는 프로세스를 생성하지 않는 경우 CSRSS가 생성되기 때문입니다. "관리자 권한"으로 프로그램을 실행하면 화면이 어두워지는 UAC 프롬프트가 표시됩니다. CSRSS는 UAC 프롬프트와 프로세스 승격을 처리하는 시스템 프로세스이기 때문입니다. 따라서 Explorer와 해당 하위 프로세스에는 하나의 환경이 있는 반면 높은 권한 시스템 프로세스에 의해 생성되는 승격된 명령 프롬프트요청에 따라Explorer)는 추가/다른 변수를 사용하여 약간 다른 세트를 얻습니다.

또한 동일한 사용자가 관리 자격 증명을 사용하여 실행하는 모든 프로그램은 해당 프로세스가 끝난 후에도 오랫동안 유지되고 해당 사용자가 시작한 후속 승격된 프로세스에서만 설정되는 환경 변수를 만들 수 있는 것으로 보입니다.

아니요. 이 set명령은 세션 전용입니다. 해당 명령 프롬프트를 닫으면 변경한 내용이 모두 적용됩니다. 지속적으로 변경하려면 타사 유틸리티나 Microsoft 도구 프로그램과 같은 외부 도구를 사용해야 합니다 setx. 이는 상승된 명령 프롬프트의 경우에도 마찬가지입니다. 이 set명령에는 레지스트리의 환경을 수정하는 기능이 없습니다.

사용자 로그인 세션과 관련된 프로세스에 대해 Process Explorer에 표시된 환경 탭에서 해당 변수를 찾을 수 없습니다.

변경한 사항은 다음 set에서만 볼 수 있기 때문입니다.그 구체적인명령 프롬프트 및 시작하는 모든 프로세스그 구체적인명령 프롬프트; 변경 사항은 다른 프로세스로 전파되지 않습니다.

내 질문은 해당 값이 어디에 저장되어 있으며 Process Explorer가 해당 값에 액세스할 수 없는 이유는 무엇입니까? (물론 Process Explorer가 기본적으로 승격된 상태로 실행되므로 해당 변수는 자체 환경 탭에 나타납니다.) 아니면 제가 그냥 간과한 걸까요?

세션 변수는 해당 특정 명령 프롬프트 환경에 저장됩니다. Process Explorer는 의 특정 인스턴스에 대해 이를 볼 수 있지만 cmd다른 프로세스에는 없습니다. 해당 명령 프롬프트에서 프로그램을 시작하면 하위 프로세스에서 해당 변경 사항을 볼 수 있습니다.환경탭은 해당 명령 프롬프트에서 상속되었기 때문입니다.

영구 변수를 설정하는 것과 같은 프로그램을 사용하면 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(AKA HKU/S-1-5-18/Volatile Environment)에서 문제가 되는 변수를 생성합니다.

관련 정보