仅在完全限定exe路径时才会发出权限问题.为什么不总是?

Cha*_*adD 9 security windows-7-x64 sql-server-2012

当我尝试执行SQL Server 2012 BCP.exe实用程序以使用exe的完全限定路径将表的内容转储到文件时,

D:\SQL2012\110\Tools\Binn\bcp.exe DBNAME.DBO.TABLENAME OUT %FileServerProject%\IMPLEMENTATION\DAT\Pre_Run_BaseTables\CDB_ACCT_CURR.DAT -S%SqlServer% -T -N >> %LogFolder%\Log.log

...我收到了ACCESS DENIED错误.

但是,当我删除exe和run的完全限定路径时,

bcp.exe DBNAME.DBO.TABLENAME OUT %FileServerProject%\IMPLEMENTATION\DAT\Pre_Run_BaseTables\CDB_ACCT_CURR.DAT -S%SqlServer% -T -N >> %LogFolder%\Log.log

它工作正常.

如果路径不合格,我的理解是Windows将搜索PATH环境变量中指定的每个文件夹,查找指定的exe,并执行第一个找到的文件夹.所以,我从控制台执行以下命令来查看我的PATH变量.

ECHO %PATH%
Run Code Online (Sandbox Code Playgroud)

清理输出中的各种不相关路径,我看到以下顺序返回的SQL相关文件夹:

D:\SQL2012\110\DTS\Binn\;
D:\SQL2012 (86)\110\Tools\Binn\;
D:\SQL2012\110\Tools\Binn\;
Run Code Online (Sandbox Code Playgroud)

后一个Tools\Binn路径是包含该bcp.exe实用程序的唯一文件夹.

我的问题是:

由于执行了相同的EXE,无论是通过搜索路径变量显式限定路径还是让Windows找到它,为什么我在使用完全限定路径运行时得到ACCESS DENIED错误而不是在我没有限定路径时?

请注意,在这两种情况下,我都在具有该TOOLS\BINN文件夹的读取和执行权限的ID下运行.在我使用完全限定路径的情况下,如果我将帐户添加到本地组,它将起作用,但这不是一个可行的解决方案.此外,ID具有LogOn As Batch服务器的权限.

更新:

我现在毫不怀疑当我使用非限定bcp.exe路径执行时,我实际上正在运行bcp.exe服务器上的唯一副本.对于初学者,我使用Search Everything广泛搜索服务器上的每个驱动器.我发现了三次.然后我重命名了我不想意外引用的2.

然后,我使用不合格的bcp.exe路径重新开始工作,并使用任务管理器的进程选项卡,我发现bcp.exe在服务帐户下运行.然后我右键单击文件名并选择上下文菜单"打开文件位置",它将我带到了bcp.exe未重命名的文件的唯一位置- 我有意尝试使用完全限定的文件名称.

D:\SQL2012\110\Tools\Binn

由于bcp.exe不合格,因此运行成功.

更新2 到目前为止,已有42人对此进行了调查.我很好奇,如果人们看到这句话"那是不可能的,这个案子的事实一定不能像我说的那样."

几乎就在那里: 我将批处理文件简化为最低限度以重现问题.你会注意到我改变了我们的真实路径名,但我保留了它的要点.

这是"之前"代码:

 ----------------------------------------------------------------
 Output of messages for workload object TESTDUMP/GHG9999I.11/MAIN
 Start date Fri Sep 25 13:33:36 2015
 ----------------------------------------------------------------

 C:\Users\MyServiceAccount>WHERE bcp.exe 
 INFO: Could not find files for the given pattern(s).

 C:\Users\MyServiceAccount> D:\SQL2012\110\Tools\Binn\bcp.exe  MyDB.DBO.MyTable OUT \\MyFileServer\IMData\MyDB_SOURCE\IMPLEMENTATION\DAT\Pre_Run_BaseTables\MyTable.DAT -S MyDbServer\int -T -N  1>>\\MyFileServer\IMData\MyDB_SOURCE\Logs\MyTable_BCP_out.log 
 Access is denied.

 C:\Users\MYSERVICEACCOUNT>ECHO RESULT=1 
 RESULT=1
Run Code Online (Sandbox Code Playgroud)

这是"After",它起作用了

 ----------------------------------------------------------------
 Output of messages for workload object TESTDUMP/GHG9999I.10/MAIN
 Start date Fri Sep 25 13:33:00 2015
 ----------------------------------------------------------------

 C:\Users\MyServiceAccount>WHERE bcp.exe 
 INFO: Could not find files for the given pattern(s).

 C:\Users\MyServiceAccount>"D:\SQL2012\110\Tools\Binn\bcp.exe" MyDB.DBO.MyTable OUT \\MyFileServer\IMData\MyDB_SOURCE\IMPLEMENTATION\DAT\Pre_Run_BaseTables\MyTable.DAT -S MyDbServer\int -T -N  1>>\\MyFileServer\IMData\MyDB_SOURCE\Logs\MyTable_BCP_out.log 

 C:\Users\MYSERVICEACCOUNT>ECHO RESULT=0 
 RESULT=0
Run Code Online (Sandbox Code Playgroud)

请注意,不同之处在于工作的BCP路径用引号括起来.我原本以为只有当路径包含嵌入空格时,这才会很重要.我很困惑为什么在这种情况下很重要.

第二个新问题是WHEREMYSERVICDEACCOUNT通过调度程序运行时命令无法工作的原因.当我手动登录MYLANID,导航到c:\users\mylanid并尝试它时,该命令有效.

如果有人可以解释为什么报价很重要,他们会得到100分和我的感激之情.

更新4:

我将AgentParm.txt文件放在相同代码工作的服务器上.它位于Program Files文件夹下:

# Agent settings for nt-x86-64
agentname=MyWorkingServer
log.archive=2
oscomponent.jvm=server
Run Code Online (Sandbox Code Playgroud)

在我们一直在讨论批处理文件未引用时我遇到问题的服务器上,我在Program Files(x86)文件夹中看到以下内容.所有其他行都是相同的,所以我排除了它们.我没有看到任何提到的oscomponent.cmdprefix.force.quotes.full.

# Agent settings for nt-x86-32

agentname=MyServer
Run Code Online (Sandbox Code Playgroud)

我是否需要64位版本的CA调度程序来运行64位exes?如果是这样,我是否会遇到使用64位CW Scheduler运行32位exes(如SQL Server dtexec.exe)的问题?

Bar*_*n01 0

会不会和你说的有关系?可能不经意间

32 位D:\SQL2012 (86)\110\Tools\Binn\64 位D:\SQL2012\110\Tools\Binn\您的硬路径正在调用 64 位,并且您的%PATH%变量首先查找 32 位版本。