2

У меня есть # программа C, что делает это:Сетевой адрес недоступен, если пробежал планировщика заданий

Directory.Exists(@"\\PcName\SomeDir"); 

и печатает ли доступен (существует) или не тот путь.

Это проблема: я запускаю это приложение через Task Scheduler прямо после входа в (авто-входа в систему пользователя), с помощью триггера «При входе в систему», и он возвращает false, хотя этот путь IS доступный! (Мне удалось открыть этот путь, используя explorer.exe за несколько секунд до запуска моего приложения). Отмечено в:

Run with highest privileges 

Если я запустить его вручную, работает нормально, даже когда я правой кнопкой мыши задачу и выберите пункт «Выполнить» через Task Scheduler!

  • Если я отменить «Запуск с наивысшими правами», нет никаких проблем, но он должен быть побежал с наивысшими правами (доступов реестра и многое другое вещество)

  • Он работает под тем же пользователем, если я запускаю его вручную или автоматически планировщиком задач - я убедился, что с помощью Process Explorer

  • Это происходит на некоторых компьютерах (Win8x64, admin-privileges-user без пароля, автоматического входа в систему, рабочей группы маш ines, а не домен), но не на чужих (такие же: Win8x64, admin-privileges-user без пароля, автозапуск, машины рабочих групп, а не домен).

  • Даже если я вставлю Thread.Sleep(TimeSpan.FromMinutes(1)); или введите 1-мин задержки в задаче (в Task Scheduler) он по-прежнему говорит, что этот путь не существует

+0

Вы можете запустить Process Monitor или Wireshark во время выполнения задания, может быть, вы увидите что-то – argaz

ответ

0

Проблема решена. Мне пришлось «выдавать себя за», хотя я не совсем уверен, почему: если я использую планировщик без перезагрузки, он обращается к удаленному долю - точно так же, как и к одному. Только после перезагрузки он не может получить доступ к ресурсу (и через мгновение снова - те же настройки, к которым он имеет доступ).

Единственная разница при запуске сразу после перезапуска заключается в том, что родительский элемент приложения составляет services.exe, а не explorer.exe, как обычно. Я предполагаю, что он должен войти в систему сразу после перезапуска, поэтому он должен использовать services.exe (explorer.exe не должен существовать на этом этапе, если я не ошибаюсь).

Ниже раствор в C#, грубо говоря, кому это может касаться:

// LogonUser is a "P/Invoked" API: 
// http://www.pinvoke.net/default.aspx/advapi32/LogonUser.html 
// this solution works only with the LOGON32_LOGON_NEW_CREDENTIALS as the 4th parameter: 
using (var h = LogonUser(username, domain, password, 
    LogonType.LOGON32_LOGON_NEW_CREDENTIALS, 
    LogonProvider.LOGON32_PROVIDER_DEFAULT)) 
{ 
    using (var winImperson8Ctx = WindowsIdentity.Impersonate(h.DangerousGetHandle())) { 
     return Directory.Exists(path); // now works fine...  
    } 
} 
Смежные вопросы