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계정의 입장에서 자기 자신이지 유저 계정이 아니다. 즉 여기서, 엄청나게 중요한 작업을 수행할 계정명을 선택해주어야 하는 이슈가 생기는 것이다.