如何在Python脚本中使用其他Windows凭据连接SQL Server
解决Python以非默认Windows身份连接SQL Server的问题
问题原因
你当前的代码同时设置了trusted_connection='yes'和UID/PWD参数,而SQL Server的ODBC驱动在启用Windows认证(trusted_connection='yes')时,会直接使用当前运行脚本的Windows进程凭据,完全忽略传入的UID和PWD参数,所以无法切换到指定用户。
解决方案
要以其他Windows用户身份通过Windows认证连接SQL Server,需要先在脚本中模拟目标用户的安全上下文,再建立数据库连接。可以借助pywin32库实现用户模拟:
步骤1:安装依赖
先安装pywin32库:
pip install pywin32
步骤2:完整代码示例
import pyodbc import win32api import win32security import win32con # 目标用户信息 target_username = r"DOMAIN\username" # 本地用户用 ".\username",域用户用 "域名\用户名" target_password = r"password" server = "server_name" database = "database_name" # 获取用户令牌 def get_user_token(username, password): try: return win32security.LogonUser( username, None, password, win32con.LOGON32_LOGON_INTERACTIVE, win32con.LOGON32_PROVIDER_DEFAULT ) except win32api.error as e: raise RuntimeError(f"登录目标用户失败: {e}") # 模拟用户并连接数据库 user_token = None try: user_token = get_user_token(target_username, target_password) # 模拟用户上下文 win32security.ImpersonateLoggedOnUser(user_token) # 建立数据库连接(此时使用模拟的用户身份) connection_string = f'DRIVER={{SQL Server}};SERVER={server};DATABASE={database};Trusted_Connection=yes' connection = pyodbc.connect(connection_string) print("连接成功") # 这里可以执行数据库操作,比如查询 cursor = connection.cursor() cursor.execute("SELECT @@VERSION") print(cursor.fetchone()) cursor.close() connection.close() finally: # 恢复原用户身份 if user_token: win32security.RevertToSelf() win32api.CloseHandle(user_token) except pyodbc.Error as e: print("数据库连接错误:", e)
注意事项
- 运行脚本的当前用户需要具备模拟目标用户的权限(通常本地管理员或域管理员拥有此权限)。
- 目标用户必须被授予SQL Server的Windows登录权限,且有权限访问指定数据库。
- 如果是本地用户,用户名格式用
.\username;域用户用域名\username。
替代方案(手动执行场景)
如果不需要脚本自动处理,可以用Windows的runas命令启动脚本,手动输入目标用户密码:
runas /user:DOMAIN\username "python your_script.py"
此时脚本内只需保留Trusted_Connection=yes的连接字符串,无需用户模拟代码。
内容的提问来源于stack exchange,提问作者Mueez Ahmad
相关产品推荐
相关产品推荐

