SQL Server PowerShell执行Get-ChildItem登录失败致数据库备份失败
先明确核心问题:你的PowerShell会话使用的work\sql账户无法登录目标SQL Server实例computer\instance,导致SQL Server PowerShell Provider无法读取数据库列表,最终触发备份失败。下面是具体的排查和解决步骤:
问题回顾
你使用的备份脚本在虚拟服务器上运行正常,但在公司另一台服务器执行时触发登录失败错误:
Set-Location "SQLSERVER:\SQL\computer\distance\Databases" foreach ($database in (Get-ChildItem)) { $dbName = $database.Name Backup-SqlDatabase -Database $dbName -BackupFile "E:\bu\$dbName" }
错误提示:
Get-ChildItem : SQL Server PowerShell provider error: Failed to read child items. [Failed to connect to server computer\instance. --> Login failed for user 'work\sql'.]
At line:1 char:23
- ForEach($database in (Get-ChildItem))
~~~~~~~~~~~~~- CategoryInfo : ReadError: (SQLSERVER:\SQL...\instance\Databases:SqlPath) [Get-ChildItem], GenericProviderException
- FullyQualifiedErrorId : CannotReadChildItems,Microsoft.PowerShell.Commands.GetChildItemCommand
进入目标路径执行ls时也会触发相同错误。
排查与解决步骤
1. 验证work\sql账户的SQL登录权限
登录目标SQL Server实例(推荐用SQL Server Management Studio):
- 展开安全性 > 登录名,确认
work\sql账户是否存在。如果不存在,右键新建登录名,选择Windows身份验证,输入work\sql,并至少赋予它VIEW ANY DATABASE服务器权限(用于查看数据库列表)和目标数据库的BACKUP DATABASE权限(用于执行备份)。 - 如果账户已存在,检查它的状态是否为启用,且登录类型为Windows身份验证(
work\sql看起来是域账户,需匹配对应登录类型)。
2. 确认PowerShell的运行身份
当前运行PowerShell的账户是否为work\sql?如果不是,可通过以下命令以该账户身份启动新的PowerShell会话,再执行备份脚本:
Start-Process powershell.exe -Credential work\sql
这样会话会以work\sql的身份运行,避免身份不匹配导致的登录问题。
3. 绕过SQLSERVER:\路径,显式指定连接参数
SQLSERVER:\ Provider的自动连接偶尔会出现身份验证异常,你可以直接通过Get-SqlDatabase和Backup-SqlDatabase的参数指定实例与凭据,更可靠:
$instanceName = "computer\instance" $backupRootPath = "E:\bu\" # 如需手动输入凭据,启用下面这行 $sqlCredential = Get-Credential -Message "输入SQL登录凭据" # 获取目标实例下的所有数据库 $databases = Get-SqlDatabase -ServerInstance $instanceName -Credential $sqlCredential foreach ($db in $databases) { $backupFilePath = Join-Path -Path $backupRootPath -ChildPath "$($db.Name).bak" # 建议添加.bak后缀,方便识别备份文件 Backup-SqlDatabase -ServerInstance $instanceName -Database $db.Name -BackupFile $backupFilePath -Credential $sqlCredential }
这种方式无需依赖SQLSERVER:\路径,直接建立连接,减少环境依赖问题。
4. 检查SQL Server的远程连接与防火墙设置
- 在SSMS中右键目标实例 > 属性 > 连接,勾选“允许远程连接到此服务器”。
- 确认SQL Server Browser服务处于运行状态(如果是命名实例,需要该服务解析实例名称)。
- 检查目标服务器的防火墙规则,允许PowerShell所在服务器访问SQL Server的端口(默认1433,命名实例可能使用动态端口,可在SQL Server配置管理器中查看)。
内容的提问来源于stack exchange,提问作者saaraa

