如果由任务计划程序运行,则networking地址不可访问

我有一个C#程序,这样做:

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

并打印该path是否可访问(存在)。

这就是问题所在:我使用“On Login”触发器login(自动login用户)后,通过Task Scheduler程序运行此应用程序,并返回false ,尽pipe该path可访问的! (我设法在我的应用程序启动前几秒钟使用explorer.exe打开该path)。 它被标记为:

 Run with highest privileges 

如果我手动运行它,即使我右键单击任务并select“运行”通过Task Scheduler运行正常!

  • 如果我取消select “以最高权限运行”,则没有问题,但必须以最高权限运行(访问registry和其他所有内容)

  • 它运行在同一个用户,如果我手动或由任务调度程序自动运行 – 我确保使用Process Explorer

  • 它发生在某些机器(Win8x64,pipe理员权限,用户没有密码,自动login,工作组机器,而不是域),但没有其他人(相同:Win8x64,pipe理员权限,用户没有密码,login,工作组机器,而不是域)。

  • 即使我插入Thread.Sleep(TimeSpan.FromMinutes(1)); 或在任务中input1分钟的延迟(在任务计划程序中),仍然表示此path不存在

问题解决了。 我不得不“模仿”,虽然我不太确定为什么:如果我不使用重新启动而使用调度程序,它将访问远程共享 – 完全相同的设置,一对一。 只有重新启动后,才能访问共享(稍后再次 – 相同的设置,它可以访问)。

重新启动后立即运行它的唯一区别是,应用程序的父级是services.exe而不是像往常一样explorer.exe 。 我的猜测是它必须在重新启动后立即登录,所以它必须使用services.exeexplorer.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... } }