작업 스케줄러 프로그램은 %LOCALAPPDATA%라는 리터럴 폴더에 씁니다.

작업 스케줄러 프로그램은 %LOCALAPPDATA%라는 리터럴 폴더에 씁니다.

Microsoft의 .NET 실행 파일(내가 만든)이 있습니다.Active Directory 서비스 인터페이스(System.DirectoryServices.AccountManagement를 통해) LDAP 쿼리를 수행합니다. 내부적으로 ADSI에Active Directory 스키마를 다운로드하여 로컬에 저장합니다.. 이 스키마를 의 폴더에 저장해야 합니다 %LOCALAPPDATA%\Microsoft\Windows\SchCache\.

이 실행 파일을 예약할 때작업 스케줄러Windows Server 2012 R2에서 "UserA"로 실행되도록 설정해당 사용자가 로그인하지 않은 경우에도, 프로그램은 실행되지만 위의 캐시 파일을문자 그대로 이름이 지정된 폴더%LOCALAPPDATA%\Microsoft\Windows\SchCache\에서 시작예약된 작업 폴더(의도적으로 내 실행 파일 폴더로 설정됨) 즉, C:\MyApp\%LOCALAPPDATA%\Microsoft\Windows\SchCache\. 프로그램이 제대로 실행되도록 하려면 UserA에게 이 폴더에 대한 명시적인 쓰기 권한을 부여해야 했습니다.

Process Monitor를 사용하여 작업 프로세스를 관찰했는데 즉시 해당 폴더로 이동했습니다. 처음에 무언가를 시도했지만 실패한 것과는 다릅니다 C:\Users\.

내 사용자로 서버에 로그인하고 다음을 사용하여 UserA로 실행 파일을 수동으로 실행할 때다른 사용자로 실행, 실행 파일이 실행되고 캐시 파일을 C:\Users\UserA\AppData\Local\Microsoft\Windows\SchCache\.

작업 스케줄러에서 이런 현상이 발생하는 이유는 무엇이며 이를 해결하려면 어떻게 해야 합니까? UserA의 컨텍스트에서 프로그램을 실행하지만 %LOCALAPPDATA%환경 변수로 초기화하지 않는 작업 스케줄러와 관련이 있을 수 있다고 생각합니다. 변덕스럽게 설정을 해보았습니다.가장 높은 권한으로 실행작업을 수행했지만 결과는 바뀌지 않았습니다.

답변1

이는 Windows Server 2012 R2 및 8.1의 버그입니다. Microsoft는 이를 문서화했습니다.KB 2968540.

문제가 해결되었으며 핫픽스가 적용되었습니다.KB 3133689사용할 수 있습니다. 이 핫픽스는 문제를 해결합니다.

UBPM을 사용하여 실행되는 예약된 작업에는 해당 프로세스가 시작될 때 APPDATA, USERPROFILE 또는 TEMP와 같은 환경 변수가 충분하지 않습니다.

답변2

Windows 7/2012 예약 작업에 버그가 있어서 실행 중인 사용자에 대한 올바른 환경 변수가 표시되지 않는 것 같습니다.

https://stackoverflow.com/questions/32589381/

이러한 일이 발생하는지 확인하려면 SET>test.txt동일한 사용자 컨텍스트에서 예약된 작업의 배치 파일을 실행할 수 있습니다. 내가 이것을 시도하면 그렇습니다.~ 아니다지정된 사용자에 대한 올바른 전체 환경 변수 세트를 표시합니다. 즉, 실제로 해당 사용자로 로그인했을 때 동일한 명령(또는 배치 파일)을 실행하면 표시되는 것과 동일한 세트가 아닙니다. (더욱 혼란스러운 점은 예약된 작업이 실행될 때 사용자가 현재 로그인되어 있는지 여부에 따라 달라집니다. 로그인되어 있으면 작업이하다올바른 변수를 참조하세요.)

이 동작은 문서화되거나 의도된 것이 아니며 Windows Server 2012(아마도 R2?) 예약된 작업을 처리하는 방식의 버그라고 생각합니다.

주의이는 PATH변수에도 적용되므로 예약된 작업은 해당 변수에 있는 실행 파일만 볼 수 있습니다.기본경로, 현재 디렉터리 또는 완전히 지정된 경로를 사용합니다. 지정된 사용자 경로에 있지만 기본 경로에 없는 항목을 호출하면 디버그하기 어려운(테스트 중이므로!) 오류가 발생합니다.

답변3

이는 Windows가 사용자 계정을 처리하는 방식의 결과입니다. 사용자 계정이 로그인되어 있지 않으면 해당 사용자 레지스트리 하이브( HKEY_USERS일반적으로 매핑되는 키 HKEY_CURRENT_USER)가 탑재되지 않습니다. 해당 하이브(라고 하는 각 사용자 프로필의 파일에 저장됨 NTUSER.DAT)는 사용자별 환경 변수를 포함하여 거의 모든 사용자별 데이터를 저장합니다. Windows에는 시스템 환경 변수도 있습니다. PATH와 같은 일부 변수는 두 위치 모두에 존재하고 병합되므로 사용자의 레지스트리 하이브가 마운트되지 않은 경우에도 표시됩니다. 하지만 사용자별 항목은 없습니다.

작업 스케줄러가 다른 Windows 버전에서 이 시나리오를 다르게 처리했는지는 모르겠습니다. 그것~할 수 있었다해당 사용자로 작업을 실행하기 전에 해당 사용자의 하이브를 탑재할 만큼 똑똑해야 합니다. Win7/2012R2에서는 그렇지 않은 것 같습니다.

이 문제를 해결하려면 사용자의 레지스트리 하이브가 탑재되었는지 확인해야 합니다. 이를 수행하는 가장 간단한 방법은 로그인한 사용자의 하이브가 항상 마운트되므로 사용자가 로그인되어 있는지 확인하는 것입니다. 그것이 부족하다면 직접 하이브를 마운트해 볼 수 있습니다(API는RegLoadKey그러나 나는 이것을 위해 그것을 호출하려고 시도한 적이 없습니다).

관련 정보