如何在本地用户名下在远程计算机上运行R脚本(使用集成的Windows身份验证具有数据库连接)?

问题描述 投票:2回答:1

请考虑以下情形:

  • 数据库服务器:DBServer
  • R服务器:RServer
  • Orchestrator服务器:Server1

我们有以下R脚本(DB.r):

lib.directory = "D:\\RTest"
install.packages("RODBC", repos = "http://cran.us.r-project.org", lib = lib.directory)
library(RODBC, lib.loc = lib.directory)

db.string <- "driver={ODBC Driver 13 for SQL Server};server=DBServer;database=Databse1;trusted_connection=Yes;"
db.channel <- odbcDriverConnect(db.string)
close(db.channel)

Server1使用以下代码在R Server上远程执行R脚本:

PsExec.exe \\RServer "C:\Program Files\R\R-3.4.3\bin\Rscript.exe" "D:\RTest\DB.r"

我收到以下错误:

[RODBC] ERROR: state 28000, code 18456, message [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.

如何在不发送用户名和密码作为PsExec的一部分的情况下解决此错误?

我们愿意使用任何替代方法来取代PsExec。

r database windows kerberos psexec
1个回答
5
投票

问题不在于你的代码。你看到了经典的“双跳”问题。当您使用集成Windows身份验证(也称为)登录工作站时,Server1知道您的身份,但RServer不知道您的身份,因为从Server1传递给它的内容不是您的身份令牌,而是机器帐户凭据Server1(本地系统)。由于可能不允许匿名访问RServer,因此连接失败:Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'

在这种情况下,RServer基本上是“Server2”,如下面的屏幕截图所示。从您的客户端工作站的角度来看,它距离您是第二跳。

enter image description here

要使其工作,您需要在Server1上配置Kerberos委派,以便能够将任何身份令牌传递给RServer,以便连接成功。请注意,此标识令牌不是用户名或密码,而是Kerberos票证。您在运行该进程的帐户上配置Kerberos委派,该进程将启动从Server1到RServer的连接。该帐户需要有一个。阅读本文中的步骤以了解此问题以及如何配置SPN:Understanding Kerberos Double Hop

进一步参考:

SQL Server returns error “Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.” in Windows application

Web App getting Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'

Permissions for PSExec run from SQL job

© www.soinside.com 2019 - 2024. All rights reserved.