OS/Windows
HKEY_USERS와 Task Scheduler
행복
2019. 5. 23. 15:08
평소에 실행이 잘 되는 batch파일을 Task Scheduler에 등록했을 때 유독 실행이 되지 않는 경우를 경험해 본 적이 있는가?
이유는 SYSTEM계정, Admin계정, user계정 어떤 계정으로 task를 수행하는지가 다른 결과값을 가져오게 된다.
이렇게 민감한 Task Scheduler의 작업 동작 성패를 좌우하는 중요한 요소는 다음 두가지가 전부라고 해도 과언이 아니다.
- When running the task, use the following user account (작업을 수행할 계정)
- user is logged on (사용자의 로그인 여부)
그리고 trigger도 매우 중요하다는 것을 발견했다.
on a schedule(예약 상태)인지 로그온 할 때인지
로그온 할때가 중요한 이유는, 로그온 여부에 따라 레지스트리 상태나 많은 것이 로그온 하지 않을 때랑 다르기 때문이다. 이는 HKEY_CURRENT_USER랑 HKEY_USERS가 다르다.
- Task scheduler의 실행 계정에 따라 발생하는 일
1.
BUILTIN\SYSTEM이 동작을 수행할 때, hostname에 $를 붙인 계정으로 수행을 하게 된다.
확인 방법 : echo %username% >> c:\a.txt
한줄짜리 배치파일을 만든 후 작업 스케줄러에 등록하고 SYSTEM계정으로 실행 후 a.txt파일에 출력된 결과값을 확인
2. Builtin\SYSTEM계정으로 실행 시, HKEY_USERS의 정보를 출력하면, user계정으로 보이는 레지스트리 구조랑 다르다!
확인 방법 : regedit /e c:\b.txt "HKEY_USERS"
스케줄에 등록 후 SYSTEM계정으로 수행하게 한 후, b.txt에 저장된 결과값 확인
.DEFAULT
S-1-5-18
S-1-5-19
S-1-5-20
까지만 구조가 보이고
S-1-5-21-xxxxxxxx-xxxx(User의 SID)는 보이지 않는다.
반면 같은 작업을 user권한으로 실행 해보면 S-1-5-21-xxxxxxx로 시작하는 레지스트리 구조가 보인다!
그리고그것은 곧 그 user의 SID라는 것을 알게 되었다.
참고 : User의 SID를 레지스트리에서 확인하는 방법
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\<SID>\ProfileImagePath"
한 번이라도 사용자가 해당 OS에 로그온 한 경우, ProfileImagePath의 값으로 그 값을 담고있는 KEY의 이름이 곧 SID가 된다.
그리고 HKEY_USERS의 SID는 사용자 경로의 NTUSER.DAT에서 가져오게 된다. 그리고 그 사용자라 로그인을 하면, HKEY_USERS에 자신의 SID로 시작하는 트리가 올라오게 되며, HKEY_CURRENT_USER가 그것과 아주 일치함을 확인할 수 있었다.
예시 : Adobe DC 의 Sandbox 보호모드를 푸는 옵션 설정
HKEY_CURRENT_USER\Software\Adobe\Acrobat Reader\DC\Privileged\bProtectedMode
값을 1->0 으로 수정하면 된다.
그리고나서 HKEY_USERS\S-1-5-21-xxxxx-xxxxx\Software\Adobe\Acrobat Reader\DC\Privileged\bProtectedMode값이 0으로 변경되어있음. 즉 동일한 것
즉 HKEY_CURRENT_USER는 HKEY_USERS의 하위 KEY 구조이다.
다시 본론으로 돌아와서
Task Scheduler 에서 HKEY_CURRENT_USER를 바꾸는 다음의 설정을 batch파일로 만들어서 등록해본다.
reg add "HKEY_CURRENT_USER\Software\Adobe\Acrobat Reader\DC\Privileged" /v "bProtectedMode" /t REG_DWORD /d "0" /f
이 설정을 bat로 더블클릭해서 실행하면 값이 0으로 잘 바뀌는데 Task Scheduler에 등록만 하면 동작 안하는 이유가 무엇일까?
이것을 아무리 task scheduler에서 실행시켜도 실행결과는 0x0(성공)인데 레지스트리는 그대로이다.
이유를 생각해보면, SYSTEM계정에서 저 명령을 수행하면 HKEY_CURRENT_USER가 수행될 경로는 SYSTEM계정의 입장에서 자기 자신이지 유저 계정이 아니다. 즉 여기서, 엄청나게 중요한 작업을 수행할 계정명을 선택해주어야 하는 이슈가 생기는 것이다.
이유는 SYSTEM계정, Admin계정, user계정 어떤 계정으로 task를 수행하는지가 다른 결과값을 가져오게 된다.
이렇게 민감한 Task Scheduler의 작업 동작 성패를 좌우하는 중요한 요소는 다음 두가지가 전부라고 해도 과언이 아니다.
- When running the task, use the following user account (작업을 수행할 계정)
- user is logged on (사용자의 로그인 여부)
그리고 trigger도 매우 중요하다는 것을 발견했다.
on a schedule(예약 상태)인지 로그온 할 때인지
로그온 할때가 중요한 이유는, 로그온 여부에 따라 레지스트리 상태나 많은 것이 로그온 하지 않을 때랑 다르기 때문이다. 이는 HKEY_CURRENT_USER랑 HKEY_USERS가 다르다.
- Task scheduler의 실행 계정에 따라 발생하는 일
1.
BUILTIN\SYSTEM이 동작을 수행할 때, hostname에 $를 붙인 계정으로 수행을 하게 된다.
확인 방법 : echo %username% >> c:\a.txt
한줄짜리 배치파일을 만든 후 작업 스케줄러에 등록하고 SYSTEM계정으로 실행 후 a.txt파일에 출력된 결과값을 확인
2. Builtin\SYSTEM계정으로 실행 시, HKEY_USERS의 정보를 출력하면, user계정으로 보이는 레지스트리 구조랑 다르다!
확인 방법 : regedit /e c:\b.txt "HKEY_USERS"
스케줄에 등록 후 SYSTEM계정으로 수행하게 한 후, b.txt에 저장된 결과값 확인
.DEFAULT
S-1-5-18
S-1-5-19
S-1-5-20
까지만 구조가 보이고
S-1-5-21-xxxxxxxx-xxxx(User의 SID)는 보이지 않는다.
반면 같은 작업을 user권한으로 실행 해보면 S-1-5-21-xxxxxxx로 시작하는 레지스트리 구조가 보인다!
그리고그것은 곧 그 user의 SID라는 것을 알게 되었다.
참고 : User의 SID를 레지스트리에서 확인하는 방법
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\<SID>\ProfileImagePath"
한 번이라도 사용자가 해당 OS에 로그온 한 경우, ProfileImagePath의 값으로 그 값을 담고있는 KEY의 이름이 곧 SID가 된다.
그리고 HKEY_USERS의 SID는 사용자 경로의 NTUSER.DAT에서 가져오게 된다. 그리고 그 사용자라 로그인을 하면, HKEY_USERS에 자신의 SID로 시작하는 트리가 올라오게 되며, HKEY_CURRENT_USER가 그것과 아주 일치함을 확인할 수 있었다.
예시 : Adobe DC 의 Sandbox 보호모드를 푸는 옵션 설정
HKEY_CURRENT_USER\Software\Adobe\Acrobat Reader\DC\Privileged\bProtectedMode
값을 1->0 으로 수정하면 된다.
그리고나서 HKEY_USERS\S-1-5-21-xxxxx-xxxxx\Software\Adobe\Acrobat Reader\DC\Privileged\bProtectedMode값이 0으로 변경되어있음. 즉 동일한 것
즉 HKEY_CURRENT_USER는 HKEY_USERS의 하위 KEY 구조이다.
다시 본론으로 돌아와서
Task Scheduler 에서 HKEY_CURRENT_USER를 바꾸는 다음의 설정을 batch파일로 만들어서 등록해본다.
reg add "HKEY_CURRENT_USER\Software\Adobe\Acrobat Reader\DC\Privileged" /v "bProtectedMode" /t REG_DWORD /d "0" /f
이 설정을 bat로 더블클릭해서 실행하면 값이 0으로 잘 바뀌는데 Task Scheduler에 등록만 하면 동작 안하는 이유가 무엇일까?
이것을 아무리 task scheduler에서 실행시켜도 실행결과는 0x0(성공)인데 레지스트리는 그대로이다.
이유를 생각해보면, SYSTEM계정에서 저 명령을 수행하면 HKEY_CURRENT_USER가 수행될 경로는 SYSTEM계정의 입장에서 자기 자신이지 유저 계정이 아니다. 즉 여기서, 엄청나게 중요한 작업을 수행할 계정명을 선택해주어야 하는 이슈가 생기는 것이다.