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



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

Directory.Exists(@"\PcNameSomeDir");

并打印该路径是否可访问(存在(。

这就是问题所在:我在登录后立即通过Task Scheduler运行此应用程序(自动登录用户(,使用"登录时"触发器,它返回false,尽管该路径可访问的!(我设法使用资源管理器打开该路径.exe在我的应用程序启动前几秒钟(。它被标记为:

Run with highest privileges
如果我手动运行它,

即使我右键单击任务并通过Task Scheduler选择"运行",它也能正常运行!

  • 如果我取消选择"以最高权限运行",则没有问题,但必须以最高权限运行(访问注册表和许多其他内容(

  • 如果我通过任务计划程序手动或自动运行它,它会在同一用户下运行 - 我确保使用进程资源管理器

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

  • 即使我在任务中插入Thread.Sleep(TimeSpan.FromMinutes(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...    
    }
}

相关内容

  • 没有找到相关文章

最新更新