使用OPENDATASOURCE读取网络路径Excel文件遇权限错误排查
在SQL Server Management Studio(SSMS)中执行以下SQL读取Excel文件:
SELECT top 2 * FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0', 'Data Source=C:\SSIS\Excel.xlsx;Extended Properties="EXCEL 12.0;IMEX=1;HDR=NO"')...[Sheet1$]; SELECT top 2 * FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0', 'Data Source=\\app1\App_Files\SSIS\Excel.xlsx;Extended Properties="EXCEL 12.0;IMEX=1;HDR=NO"')...[Sheet1$];
触发报错的条件
- 本地运行SSMS
- Excel文件存于网络共享路径
- 使用Active Directory(AD)用户登录SSMS(该用户可通过资源管理器访问目标文件,且与SQL Server服务账户为同一用户)
报错信息
OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "The Microsoft Access database engine cannot open or write to the file '\app1\App_Files\SSIS\Excel.xlsx'. It is already opened exclusively by another user, or you need permission to view and write its data.".
Msg 7303, Level 16, State 1, Line 3
Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".
可正常运行的修改项
- 在SQL Server服务器上直接运行SSMS
- 使用SQL Server身份验证(SQL用户)而非AD用户
- 将Excel文件移至服务器本地路径
已验证本地执行select auth_scheme from sys.dm_exec_connections where session_id=@@spid返回KERBEROS,但问题仍未解决;服务器上执行该语句返回NTLM且可正常读取文件。
一、验证Kerberos委派配置完整性
虽然auth_scheme显示为KERBEROS,但需确认以下核心配置是否到位:
- SQL Server服务账户的委派设置:
- 在AD用户和计算机中,找到SQL Server服务账户,打开属性→委派标签,确保勾选「信任此用户用于委派到任何服务(仅限Kerberos)」,或针对目标文件共享的服务(如
cifs/app1)设置约束委派。 - 执行
setspn -L <SQL服务账户>,确认存在MSSQLSvc/<SQL服务器名>:<端口>和MSSQLSvc/<SQL服务器FQDN>:<端口>两种SPN。
- 在AD用户和计算机中,找到SQL Server服务账户,打开属性→委派标签,确保勾选「信任此用户用于委派到任何服务(仅限Kerberos)」,或针对目标文件共享的服务(如
- 文件共享服务器的SPN:
- 执行
setspn -L <文件服务器计算机账户>,确认已注册cifs/app1和cifs/app1.域名的SPN。
- 执行
- 本地Kerberos票据验证:
- 执行
klist get MSSQLSvc/<SQL服务器FQDN>:<端口>,确认能获取有效Kerberos票据,且票据包含正确的委派权限。
- 执行
二、检查ACE驱动的运行上下文限制
Microsoft ACE OLEDB驱动跨网络访问时存在兼容性与权限限制:
- 32位/64位一致性:
- 确保SQL Server与ACE驱动位数完全一致(均为32位或64位),混合位数会导致权限传递异常。
- 驱动交互权限:
- 在SQL Server服务属性→登录标签中,临时勾选「允许服务与桌面交互」测试(生产环境需谨慎),排查驱动是否因无法访问交互桌面导致权限问题。
- 文件共享与NTFS权限:
- 确认SQL Server服务账户在目标文件共享(
\\app1\App_Files)和Excel文件的NTFS权限中拥有读取权限,即使AD用户与服务账户为同一用户,服务进程的权限上下文仍需单独配置。
- 确认SQL Server服务账户在目标文件共享(
三、替代方案(绕过Kerberos限制)
若Kerberos配置无法快速解决,可采用以下临时方案:
- SQL Server代理作业:
- 在服务器上创建代理作业,以SQL Server服务账户或拥有共享权限的AD账户运行读取Excel的SQL,本地SSMS仅调用作业或查看结果。
- 服务器端映射网络驱动器:
- 在SQL Server服务器上,以服务账户身份映射网络驱动器(如
Z:对应\\app1\App_Files\SSIS),OPENDATASOURCE中使用映射路径Z:\Excel.xlsx,需确保映射在服务启动时自动建立。
- 在SQL Server服务器上,以服务账户身份映射网络驱动器(如
- 改用OPENROWSET:
- 尝试使用OPENROWSET语句,权限传递逻辑可能不同:
SELECT TOP 2 * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;IMEX=1;HDR=NO;Database=\\app1\App_Files\SSIS\Excel.xlsx', [Sheet1$]);
- 尝试使用OPENROWSET语句,权限传递逻辑可能不同:
四、其他排查要点
- 确认目标Excel文件未被其他程序锁定(如Excel客户端打开),报错信息中的「已被独占打开」可能是真实情况,关闭所有关联程序后重试。
- 在SSMS中打开「服务器对象→链接服务器→提供者→Microsoft.ACE.OLEDB.12.0」,确保勾选「允许进程内」和「动态参数」选项。
内容的提问来源于stack exchange,提问作者Lazer

