Cha*_*adD 9 security windows-7-x64 sql-server-2012
当我尝试执行SQL Server 2012 BCP.exe实用程序以使用exe的完全限定路径将表的内容转储到文件时,
D:\SQL2012\110\Tools\Binn\bcp.exeDBNAME.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.exeDBNAME.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路径用引号括起来.我原本以为只有当路径包含嵌入空格时,这才会很重要.我很困惑为什么在这种情况下很重要.
第二个新问题是WHERE在MYSERVICDEACCOUNT通过调度程序运行时命令无法工作的原因.当我手动登录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)的问题?
会不会和你说的有关系?可能不经意间
32 位D:\SQL2012 (86)\110\Tools\Binn\64 位D:\SQL2012\110\Tools\Binn\您的硬路径正在调用 64 位,并且您的%PATH%变量首先查找 32 位版本。