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

如何不使用NTLM连接采用gMSA账户的SQL Server实例?

连接gMSA运行的SQL Server实例的替代方法

针对你使用gMSA账户运行的SQL Server实例,除了默认的集成安全(可能自动使用NTLM),还有以下几种可行的连接方式:

1. 强制使用Kerberos身份验证

gMSA作为域托管服务账户,SQL Server实例通常会自动注册对应的服务主体名称(SPN)。你可以在连接字符串中明确指定强制使用Kerberos,避免回退到NTLM:

修改连接字符串,添加Authentication=ActiveDirectoryIntegrated(优先Kerberos),或手动指定SPN(自动注册有问题时用):

$instance = "SERVER.DOMAIN.LOCAL\INSTANCE"
$database = "DATABASE"
# 方式1:强制AD集成身份验证
$connectionString = "Server = $instance; Database = $database; Integrated Security = True; Authentication=ActiveDirectoryIntegrated;"
# 方式2:手动指定SPN
# $connectionString = "Server = $instance; Database = $database; Integrated Security = True; ServerSPN=MSSQLSvc/SERVER.DOMAIN.LOCAL:INSTANCE;"

$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString
$connection.Open()

对应修改你的Execute-SQL函数:

function Execute-SQL($query, [switch]$read, [switch]$write){
    $instance                    = "SERVER.DOMAIN.LOCAL\INSTANCE"
    $database                    = "DATABASE"
    # 使用Kerberos强制连接字符串
    $connectionString            = "Server = $instance; Database = $database; Integrated Security = True; Authentication=ActiveDirectoryIntegrated;"
    $connection                  = New-Object System.Data.SqlClient.SqlConnection
    $connection.ConnectionString = $connectionString
    $connection.Open()
    $cmd                         = New-Object System.Data.SqlClient.SqlCommand
    $cmd.Connection              = $connection
    $cmd.CommandText             = $query
    $cmd.CommandTimeout          = 0

    if($write){
        try{
            $cmd.ExecuteNonQuery() | Out-Null
        }catch{
            Write-Host $Error[0] -ForegroundColor DarkRed
            Write-Host $cmd.CommandText -ForegroundColor DarkGray
        }
    }elseif($read){
        try{
            $output                = ""
            $adapter               = New-Object System.Data.SqlClient.SqlDataAdapter
            $adapter.SelectCommand = $cmd
            $DataSet               = New-Object System.Data.DataSet
            $adapter.Fill($DataSet) | Out-Null
            $output                = $DataSet.Tables[0] | ?{$_}
            return $output
        }catch{
            Write-Host $Error[0] -ForegroundColor DarkRed
            Write-Host $query -ForegroundColor DarkCyan
        }
    }else{
        Write-Host "READ/WRITE NOT SPECIFIED" -ForegroundColor DarkCyan
    }
    $connection.Close()
}

2. 使用Azure AD身份验证(混合云/云环境适用)

如果你的SQL Server实例配置了Azure AD集成,可使用Azure AD身份验证方式,比如:

Azure AD用户密码登录

$connectionString = "Server = $instance; Database = $database; Authentication=ActiveDirectoryPassword; User ID=user@domain.com; Password=yourpassword;"

Azure AD服务主体登录

$clientId = "your-service-principal-client-id"
$clientSecret = "your-service-principal-secret"
$tenantId = "your-tenant-id"
$connectionString = "Server = $instance; Database = $database; Authentication=ActiveDirectoryServicePrincipal; User ID=$clientId; Password=$clientSecret;"

注意:推荐使用Microsoft.Data.SqlClient驱动(替代旧的System.Data.SqlClient)以获得完整的Azure AD支持。

3. 使用SQL Server模拟(需SQL端配置)

如果SQL Server实例允许,可通过EXECUTE AS语句切换到有权限的账户,前提是已在SQL端配置对应权限:

EXECUTE AS LOGIN = 'DOMAIN\AuthorizedUser'
-- 执行你的查询逻辑
REVERT

可将这段逻辑嵌入到PowerShell的查询语句中,实现权限切换后的连接操作。


内容的提问来源于stack exchange,提问作者Lord Helmet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:12:18