Windows 从计划任务调用WNetGetUniversalName时失败
我有一个(win32)程序,该程序通过计划任务运行 运行时,我的软件应将许多本地驱动器号映射到UNC资源,验证映射是否成功,运行一些其他任务,然后取消映射驱动器 在本地用户的上下文下运行时,所有这些都可以正常工作。但是,当我通过系统任务调度器运行它时,验证任务失败 验证任务获取驱动器号,检查驱动器是否为网络驱动器(通过Windows 从计划任务调用WNetGetUniversalName时失败,windows,winapi,windows-server-2008-r2,delphi-xe5,Windows,Winapi,Windows Server 2008 R2,Delphi Xe5,我有一个(win32)程序,该程序通过计划任务运行 运行时,我的软件应将许多本地驱动器号映射到UNC资源,验证映射是否成功,运行一些其他任务,然后取消映射驱动器 在本地用户的上下文下运行时,所有这些都可以正常工作。但是,当我通过系统任务调度器运行它时,验证任务失败 验证任务获取驱动器号,检查驱动器是否为网络驱动器(通过GetDriveType),然后,如果驱动器类型为drive\u REMOTE,则调用WNetGetUniversalName,并将结果与预期映射进行比较 当从常规用户上下文运行时
GetDriveType
),然后,如果驱动器类型为drive\u REMOTE
,则调用WNetGetUniversalName
,并将结果与预期映射进行比较
当从常规用户上下文运行时,这是有效的。但是,当通过任务调度器调用该进程时,WNetGetUniversalName失败,出现错误87:参数不正确。
在试图孤立这个问题之后,我得出了以下结论:
- 该问题与用户权限无关:即使用户同时成为本地管理员组和域管理员组的成员,错误仍然存在
- 我传递给函数的参数总是相同的:它是与
连接的驱动器号:\
- 我尝试过在短暂等待(100毫秒)后重复呼叫:同样的症状
- 映射(通过
)实际成功wnetadconnection2
- 问题并不取决于可执行文件的位置:如果它位于本地计算机上或从UNC路径运行,则会发生同样的情况
- 无论计划任务是否已设置为“以最高权限运行”,都会出现此问题
APIResult := WNetGetUniversalName(PWideChar(pathToCheck), UNIVERSAL_NAME_INFO_LEVEL, @RemoteNameInfo, Size);
我不知道下一步该检查什么
编辑现在,我已恢复到另一种行为:所有驱动器的状态均已检查(GetDriveType),如果是网络驱动器,则将其取消匹配,再次检查,然后映射。这似乎可行,但速度较慢(当然),而且感觉不太安全。这是一个正常的问题,驱动器号映射是按用户设置的。您可能使用错误的用户帐户运行计划任务。否则,当您使用本地帐户时,它将起作用。做有效的。谢谢你的评论。不幸的是,我不认为您理解我的工具的功能(或者我不理解您的评论)。如果有帮助的话,我将尝试添加更多关于今天下午进行的操作的细节。这是一个正常的问题,驱动器号映射是每个用户的设置。您可能使用错误的用户帐户运行计划任务。否则,当您使用本地帐户时,它将起作用。做有效的。谢谢你的评论。不幸的是,我不认为您理解我的工具的功能(或者我不理解您的评论)。如果有帮助的话,我将尝试添加更多关于今天下午所做工作的细节。