如何使用AD组而非单个用户链接SQL Server表?
问题解答
首先明确:无法直接在连接串中指定AD组作为身份验证主体,因为Windows集成身份验证(Trusted_Connection=Yes)是基于当前运行Access的Windows用户身份生效的。只要该用户属于目标AD组,SQL Server就会自动应用该组的权限(datareader、datawriter等),无需在连接串中额外配置组信息。
你遇到的UID=myuser自动出现在连接串中的问题,是因为使用了dbAttachSavePWD参数导致的——这个参数用于保存SQL身份验证的密码,而在Windows集成验证场景下完全不需要,Access会错误地填充当前用户的信息。
修正后的实现步骤
- 调整连接串:使用纯Windows集成身份验证,不要包含UID、PWD参数:
strConnect = "ODBC;DRIVER=SQL Server;Database=mydatabase;Server=myserver;Trusted_Connection=Yes;"
- 修改TableDef创建逻辑:移除
dbAttachSavePWD参数(第二个参数传0即可,代表默认属性):
Set td = CurrentDb.CreateTableDef(stlocalTableName, 0, stRemoteTableName, strConnect)
- 验证前置条件:
- 确认当前运行Access的Windows用户已加入目标AD组(可通过命令行执行
whoami /groups查看组列表) - 确认SQL Server数据库已为该AD组分配了datareader、datawriter权限
完整示例代码
Sub CreateADGroupLinkedTable() Dim strConnect As String Dim td As TableDef Dim stlocalTableName As String Dim stRemoteTableName As String ' 配置参数 stlocalTableName = "LocalLinkedTable" stRemoteTableName = "RemoteSQLTable" strConnect = "ODBC;DRIVER=SQL Server;Database=mydatabase;Server=myserver;Trusted_Connection=Yes;" ' 创建链接表定义 Set td = CurrentDb.CreateTableDef(stlocalTableName, 0, stRemoteTableName, strConnect) ' 追加到当前数据库 CurrentDb.TableDefs.Append td ' 清理对象 Set td = Nothing End Sub
关键说明
- Windows集成身份验证会自动传递当前用户的身份,SQL Server会根据用户所属的AD组匹配权限,无需手动指定组
dbAttachSavePWD仅适用于SQL Server身份验证(需要输入账号密码的场景),在集成验证中使用会导致Access错误写入当前用户信息- 若需要以其他AD组用户身份连接,需通过Windows
runas命令以该用户身份启动Access,而非在连接串中配置组
内容的提问来源于stack exchange,提问作者Bytor
相关产品推荐
相关产品推荐

