【发布时间】:2015-12-16 06:33:51
【问题描述】:
当我尝试执行 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 的完全限定路径并运行时,
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%
从输出中清理杂七杂八的不相关路径,我看到以下SQL相关文件夹按此顺序返回:
D:\SQL2012\110\DTS\Binn\;
D:\SQL2012 (86)\110\Tools\Binn\;
D:\SQL2012\110\Tools\Binn\;
后一个Tools\Binn 路径是唯一包含bcp.exe 实用程序的文件夹。
我的问题是这样的:
由于无论我显式限定路径还是离开 Windows 通过搜索路径变量来找到它,都执行了相同的 EXE,为什么当我使用完全限定路径而不是没有限定路径时,我得到一个 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
这是“之后”,它起作用了
----------------------------------------------------------------
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
请注意,不同之处在于有效的 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
在我们一直在讨论的服务器上,当批处理文件未引用时,我在哪里遇到问题,我在 Program Files (x86) 文件夹中看到以下内容。所有其他行都相同,所以我排除了它们。我没有看到任何提到 oscomponent.cmdprefix.force.quotes.full。
# Agent settings for nt-x86-32
agentname=MyServer
我是否需要 64 位版本的 CA 调度程序才能运行 64 位 exe?如果是这样,使用 64 位 CW 调度程序运行 32 位 exe(如 SQL Server dtexec.exe)是否会出现问题?
【问题讨论】:
-
我建议使用 procmon 来弄清楚发生了什么
-
其实我试过了。我从未见过 bcp.exe 进入组合。我想我不知道如何使用该工具。我打算验证它是否是在这两种情况下运行的同一个 exe。虽然我不会验证这一点,但我几乎可以肯定情况确实如此。我会尝试找出如何使用它,或者在整个服务器上搜索 bcp.exe 的其他出现
-
我搜索了多个 bcp.exe 文件。我只找到了一个
-
不要仅仅依赖于您认为可执行文件的位置,您不知道有多少人制作副本并将其放置在随机位置。搜索整个 C: 和 D: 驱动器。即:C:\> dir /S bcp.exe 和 D:\> dir /S bcp.exe
-
如前所述,这真的很奇怪......你可以尝试绝对确定它确实是这个 bcp 运行的副本:你可以重命名你想要的那个 使用您的命令运行并调用此更改的名称...
标签: security sql-server-2012 windows-7-x64