2

我有一个执行此操作的 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 分钟延迟(在任务计划程序中)它仍然说这条路径不存在

4

1 回答 1

0

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

重新启动后立即运行它的唯一区别是应用程序进程的父进程services.exeexplorer.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...    
    }
}
于 2013-09-30T18:16:21.597 回答