4

У меня есть исполняемый файл .NET (который я создал), который использует сервисные интерфейсы Microsoft Active Directory (через систему.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\ но потерпел неудачу.

Когда я захожу на сервер как мой собственный пользователь и вручную запускаю исполняемый файл от имени пользователя A, используя команду Запуск от имени другого пользователя, исполняемый файл запускается и успешно записывает файл кэша в C:\Users\UserA\AppData\Local\Microsoft\Windows\SchCache\ .

Почему это происходит с планировщиком заданий и что я могу сделать, чтобы это исправить? Я предполагаю, что это может иметь отношение к планировщику задач, выполняющему программу в контексте UserA, но не инициализирующему %LOCALAPPDATA% в качестве переменной среды. По какой-то причине я попытался установить « Выполнить» с наивысшими привилегиями для задачи, но это не изменило результат.

3 ответа3

0

Это ошибка в Windows Server 2012 R2 и 8.1; Microsoft зарегистрировала это в КБ 2968540.

Проблема была исправлена и доступно исправление KB 3133689 . Это исправление устраняет проблему.

Запланированные задачи, выполняемые с использованием UBPM, не имеют достаточных переменных среды, таких как APPDATA, USERPROFILE или TEMP, когда запускается соответствующий процесс.

0

Это является следствием того, как Windows обрабатывает учетные записи пользователей. Когда учетная запись пользователя не вошла в систему, ее куст реестра пользователей - ключ в HKEY_USERS который обычно отображается как HKEY_CURRENT_USER - не монтируется. Этот куст (который хранится в файле в профиле каждого пользователя, называемом NTUSER.DAT) хранит почти все данные для каждого пользователя, включая переменные среды для каждого пользователя. В Windows также есть системные переменные среды - некоторые переменные, такие как PATH, присутствуют в обоих местах и объединяются - так что они будут отображаться, даже если куст реестра пользователя не смонтирован. Ни один из конкретных пользователей не будет, однако.

Я не знаю, обрабатывал ли Task Scheduler этот сценарий иначе в других версиях Windows. Он может быть достаточно умен, чтобы смонтировать улей пользователя, прежде чем запускать задачу от имени этого пользователя. В Win7 / 2012R2 его, видимо, нет.

Чтобы это исправить, необходимо убедиться, что куст реестра пользователя смонтирован. Самый простой способ сделать это - просто убедиться, что пользователь вошел в систему, поскольку куст вошедшего в систему пользователя всегда монтируется. Не имея этого, вы можете попробовать смонтировать улей самостоятельно (API - RegLoadKey но я никогда не пытался вызвать его для этого).

0

Я считаю, что в запланированных задачах Windows 7/2012 есть ошибка, из-за которой они не видят правильные переменные среды для пользователя, под которым они работают:

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

Чтобы убедиться, что это происходит, вы можете запустить SET>test.txt в пакетном файле в запланированном задании в том же пользовательском контексте. Когда я пытаюсь это сделать, он не показывает правильный полный набор переменных среды для указанного пользователя; т.е. не тот набор, который вы видите, если вы запускаете ту же команду (или пакетный файл), когда фактически вошли в систему как этот пользователь. (Еще более странно то, что это зависит от того, вошел ли пользователь в данный момент в систему или нет, когда запускается запланированная задача; если они вошли в систему, то задача действительно увидит правильные переменные.)

Я думаю, что это поведение не задокументировано или не предназначено, и это ошибка в Windows Server 2012 (может быть, просто R2?) запланированные задачи обрабатываются.

NB Это относится и к переменной PATH , поэтому запланированные задачи могут видеть только исполняемые файлы, которые находятся по пути по умолчанию , либо в текущем каталоге, либо с полностью указанным путем. Вызов всего, что находится на пути указанного пользователя, но не на пути по умолчанию, приведет к трудной отладке (так как это работает в тестировании!) ошибка.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .