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

标签 windows scheduled-tasks user-accounts windows-networking network-shares

我有一个 C# 程序可以执行此操作:

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

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

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

Run with highest privileges

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

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

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

  • 它发生在某些机器上(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...    
    }
}

关于windows - 如果由任务计划程序运行,则无法访问网络地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18985698/

相关文章:

database - 我的服务器使用 node.js,需要设置用户帐户,我应该使用哪个数据库程序?

c# - 与命令行应用程序交互的最佳方式

windows - 如何使用 cacert 文件在 Powershell (Invoke-WebRequest) 中执行等效的 cUrl?

php - 构建更好的访问控制系统

windows-7 - 如何使用 Messagebox 在 Windows 7 任务调度程序中启动 VBS 脚本?

coldfusion - 计划任务是否以与网页相同的方式加载 Application.cfc?

跨不同平台的 facebook 用户访问 token

Python2.7 - 安装Python3后解释器语法错误

c# - 虚拟键盘定制

java - 获取定时任务的结果