从计划任务调用时,WNetGetUniversalName失败

时间:2016-01-21 16:02:14

标签: windows winapi windows-server-2008-r2 delphi-xe5

我有一个(win32)程序通过计划任务运行。

运行时,我的软件应将大量本地驱动器号映射到UNC资源,验证映射是否成功,运行其他一些任务然后取消映射驱动器。

在本地用户的上下文中运行时,一切正常。但是,当我通过系统任务调度程序运行它时,验证任务将失败。

验证任务接受驱动器盘符,检查驱动器是否为网络驱动器(通过GetDriveType),然后,如果驱动器类型为DRIVE_REMOTE,则调用WNetGetUniversalName并比较结果与预期的映射。

从常规用户上下文运行时,这可行。但是当通过任务调度程序调用该进程时,WNetGetUniversalName失败并显示错误87:The parameter is incorrect.

在试图找出问题后,我得出以下结论:

  • 该问题与用户权限无关:即使用户成为本地管理员组和域管理员组的成员,错误仍然存​​在。
  • 我传递给函数的参数总是相同的:它是与:\连接的驱动器号。
  • 我在短暂的等待(100毫秒)后尝试重复呼叫:相同的症状。
  • 映射(通过WNetAddConnection2制作)实际上已成功。
  • 问题不依赖于可执行文件的位置:如果它位于本地计算机上或从UNC路径运行,则会发生同样的事情。
  • 问题是,计划任务是否已设置为"以最高权限运行"或不。

这是我使用的确切电话:

APIResult := WNetGetUniversalName(PWideChar(pathToCheck), UNIVERSAL_NAME_INFO_LEVEL, @RemoteNameInfo, Size);

我想出了下一步要检查的内容。

编辑目前,我已恢复了其他行为:检查所有驱动器状态(GetDriveType),如果是网络驱动器,则取消选中,再次检查然后映射。这似乎有效,但速度较慢(当然),感觉不太安全。

0 个答案:

没有答案