使用PowerShell带凭据远程连接SQL Server失败求助
解决远程PowerShell会话中Invoke-Sqlcmd SQL认证登录失败问题
我来帮你梳理这个问题的核心原因和可行解决方案,你已经通过Enter-PSSession成功连接远程机器,但指定SQL凭据调用Invoke-Sqlcmd失败,而默认Windows认证能正常工作,大概率是SQL认证配置、凭据传递或实例标识的问题,试试下面的步骤:
1. 确认SQL Server启用混合认证模式
首先检查远程机器上的SQL Server是否允许SQL认证登录:
- 打开SSMS连接目标实例,右键实例 → 属性 → 安全性,确认服务器身份验证是「SQL Server和Windows身份验证模式」。
- 如果没启用,修改后需要重启SQL Server服务才能生效。
2. 修正ServerInstance参数的写法
既然已经在远程会话里,连接本地SQL实例时要使用本地标识,避免实例名解析问题:
- 默认实例用
localhost或. - 命名实例用
localhost\sqlinstanename或.\sqlinstanename
示例代码:
Invoke-Sqlcmd -Query "SELECT name FROM sys.databases" -ServerInstance ".\sqlinstanename" -User "sqlusername" -Password $sqlpassPowershell
3. 改用PSCredential对象传递凭据
单独传递-User和-Password有时候会因为远程会话的安全上下文出问题,用PSCredential对象更可靠:
# 在远程会话内创建凭据对象 $sqlUsername = "sqlusername" $sqlPassword = ConvertTo-SecureString "sqluserpass" -AsPlainText -Force $sqlCred = New-Object System.Management.Automation.PSCredential ($sqlUsername, $sqlPassword) # 调用Invoke-Sqlcmd Invoke-Sqlcmd -Query "SELECT QUERY" -ServerInstance ".\sqlinstanename" -Credential $sqlCred
4. 在远程会话内创建SecureString
SecureString是基于当前用户上下文加密的,如果你的本地用户和远程会话的用户不同,本地创建的SecureString在远程无法解密。所以一定要在远程会话内部执行凭据转换的代码,不要在本地转换后再传递。
5. 验证SQL登录名的有效性
先排除登录名本身的问题:
- 用SSMS在远程机器上直接用该SQL用户名和密码登录,确认能执行查询。
- 执行SQL查询检查登录状态:
SELECT name, is_disabled, default_database_name FROM sys.server_principals WHERE name = 'sqlusername'- 如果
is_disabled为1,需要启用该登录名; - 如果
default_database_name对应的数据库不存在,需要修改登录名的默认数据库。
- 如果
6. 确保使用最新版SqlServer模块
旧版模块可能存在参数兼容性问题,在远程会话内检查并更新模块:
# 查看已安装的模块版本 Get-Module SqlServer -ListAvailable # 升级模块(需管理员权限) Update-Module SqlServer
内容的提问来源于stack exchange,提问作者Prashant Kankhara
相关产品推荐
相关产品推荐

