【问题标题】:Permissions issue only when fully qualifying exe path. Why not always?仅当完全限定 exe 路径时才会出现权限问题。为什么不总是?
【发布时间】:2015-12-16 06:33:51
【问题描述】:

当我尝试执行 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 的完全限定路径并运行时,

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%

从输出中清理杂七杂八的不相关路径,我看到以下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


【解决方案1】:

这可能与您指出的有关吗?可能是无意的

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

【讨论】:

  • 服务器上没有 32 位 BCP.exe 文件实用程序。在 64 位实用程序文件夹中只有一个这样的文件。
【解决方案2】:

我不熟悉 CA Workload Automation 调度程序,但您在指定作业时是否使用它的 JIL 语法?

搜索支持文档似乎表明冒号(“:”)是 JIL 中的特殊字符,需要用引号或反斜杠进行转义。

Rule 5
Valid value settings can include any of the following characters:
■ Uppercase and lowercase letters (A-Z, a-z)
■ Hyphens (-)
■ Underscores (_)
■ Pound signs (#)
■ Numbers (0-9)
■ Colons (:), if the colon is escaped with quotation marks (" ") or a preceding backslash (\)
■ The at character (@)
Note: Object names can only contain the following characters: a-z, A-Z, 0-9, period (.), underscore (_), hyphen (-), and pound (#). Do not include embedded spaces or tabs.

【讨论】:

    【解决方案3】:

    这与您描述的情况并不完全相同,但似乎它可能具有相同的根本原因并修复。 documentation here (p45) 描述了这样一种情况:具有传递到 Windows 中 CA Workload Automation 代理的合格路径的作业在引用时出现意外行为。这适用于带空格和不带空格的路径。

    简而言之 - 它似乎已通过将参数 oscomponent.cmdprefix.force.quotes.full 添加到 agentparm.txt 文件来修复,您可以根据您想要的行为将其设置为 truefalse

    描述的情况与您的情况不完全匹配,所以我不能 100% 确定这是一个修复,但值得切换该设置进行测试是否切换了您观察到的行为。

    【讨论】:

    • @ChadD 很想知道这是否解释了这个问题 - 这是一个非常奇怪的症状,我很想听到解决方案。
    • @ChadD 我看到了更新 - 如果它是 32/64 位问题,我会感到非常惊讶,因为据我所知,引用的版本在 32 位服务器上工作。我猜想它在没有上述参数的一台服务器上工作而不在另一台服务器上工作的事实表明事实并非如此。如果麻烦最少,您可以尝试将用于测试的参数添加到不起作用的服务器。但除此之外——我想我这次真的没有主意了。
    • 谢谢,我真的很想知道,如果时间允许,我会重新审视这个。我会尽量抽出时间,特别是如果有其他建议可以尝试。非常感谢
    猜你喜欢
    • 2021-12-03
    • 2013-12-15
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2019-10-09
    • 2011-10-17
    • 2012-03-09
    相关资源
    最近更新 更多