You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 20:05:28