Windows 如果由任务计划程序运行,则无法访问网络地址

Windows 如果由任务计划程序运行,则无法访问网络地址,windows,scheduled-tasks,user-accounts,windows-networking,network-shares,Windows,Scheduled Tasks,User Accounts,Windows Networking,Network Shares,我有一个C#程序可以做到这一点: Directory.Exists(@"\\PcName\SomeDir"); 并打印该路径是否可访问(存在) 这就是问题所在:我在登录(自动登录用户)后立即通过任务调度程序运行此应用程序,使用“登录时”触发器,它返回false,尽管路径可访问!(在我的应用程序启动前几秒钟,我使用explorer.exe打开了该路径)。标记为: Run with highest privileges 如果我手动运行它,它运行正常,即使我右键单击任务并通过任务计划程序选择“运行

我有一个C#程序可以做到这一点:

Directory.Exists(@"\\PcName\SomeDir");
并打印该路径是否可访问(存在)

这就是问题所在:我在登录(自动登录用户)后立即通过
任务调度程序运行此应用程序,使用“登录时”触发器,它返回
false
,尽管路径可访问!(在我的应用程序启动前几秒钟,我使用explorer.exe打开了该路径)。标记为:

Run with highest privileges
如果我手动运行它,它运行正常,即使我右键单击任务并通过
任务计划程序选择“运行”

  • 如果我取消选择“以最高权限运行”,没有问题,但它必须以最高权限运行(访问注册表和所有其他内容)

  • 如果我通过任务调度器手动或自动运行它,它将在同一用户下运行-我确保使用Process Explorer

  • 它发生在某些计算机上(Win8x64,无密码管理员权限用户,自动登录,工作组计算机,非域),但不发生在其他计算机上(相同:Win8x64,无密码管理员权限用户,自动登录,工作组计算机,非域)

  • 即使我插入
    Thread.Sleep(TimeSpan.frommins(1))
    或在任务(在任务计划程序中)中输入1分钟延迟,它仍然表示此路径不存在

    • 问题已解决。我不得不“模拟”,尽管我不确定原因:如果我使用调度程序而不重新启动,它将访问远程共享–完全相同的设置,一对一。只有在重新启动后,它才能访问共享(稍后,同样是相同的设置,它才能访问)

      重启后立即运行它的唯一区别是,应用程序进程的父进程是
      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...    
          }
      }
      

      您可以在任务运行时运行Process Monitor或Wireshark,也许您会看到一些东西