调用-Sqlcmd -InputFile“\\ UNC \ Path”访问被拒绝?

我正在研究将在源主机SOURCEHOST01上安排的PowerShell脚本概念certificate,并调用远程SQL服务器SQLSERV01SQLSERV02上的命令。 计划的操作顺序如下:

  1. 从源主机上存储的文本文件获取SQL Server主机名列表\\SOURCEHOST01\PATH\SQLSERVERHOSTNAME.LIST

  2. 对于每个SQL服务器,调用命令将每个SQL服务器上的SQL脚本\\SOURCEHOST01\PATH\simple_sp_who.sql复制到%TEMP%

  3. 在每个SQL服务器上使用指定的SQL脚本Invoke-Sqlcmd

这是我到目前为止的代码:

 Get-Content \\SOURCEHOST01\PATH\SQLSERVERHOSTNAME.LIST | Foreach-Object { Invoke-Command -ComputerName $_ -ScriptBlock { $FileSource = "\\SOURCEHOST01\PATH\" $FileDest = "$Env:TEMP\SQL\" $Database = "Master" $InputFile = "$FileDest\simple_sp_who.sql" Copy-Item $FileSource -Destination $FileDest -Recurse Invoke-Sqlcmd -ServerInstance $_ -Database $Database -InputFile $InputFile } } 

结果错误:

 Access is denied + CategoryInfo : PermissionDenied: (\\SOURCEHOST01\PATH\:String) [Copy-Item], UnauthorizedAccessException + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.CopyItemCommand + PSComputerName : SQLSERV01 

由于文件权限问题,该脚本似乎在Copy-Item上失败。 我正在运行的testing环境以域pipe理员身份运行。 我敢肯定,这是一个简单的问题,我忽略了,但我已经开始重复步骤,所以我需要一双新的眼睛。

编辑:

以下是我最后的结果:

  Get-Content \\SOURCEHOST01\PATH\SQLSERVERHOSTNAME.LIST | Foreach-Object { $SQLSource = Test-Path "\\$($_)\C$\Windows\Temp\SQL\" $FileSource = "\\SOURCEHOST01\PATH\" $FileDest = "\\$($_)\C$\Windows\Temp\SQL\" IF ($SQLSource -eq $True) { Remove-Item -Recurse -Force $FileDest Copy-Item -Recurse $FileSource $FileDest } ELSE { Copy-Item -Recurse $FileSource $FileDest } $date = Get-Date -UFormat "%Y%m%d-%H%M" $ScriptBlockContent = { $Database = "Master" $InputFile = "C:\Windows\Temp\SQL\simple_sp_who.sql" Invoke-Sqlcmd -ServerInstance $_ -Database $Database -InputFile $InputFile } Invoke-Command -ComputerName $_ -ScriptBlock $ScriptBlockContent | Out-File -filePath "\\SOURCEHOST01\PATH\Logs\$date-$_.rpt" -NoClobber } 

似乎产生了预期的结果。

我的第一印象是错误的,但我认为这是你的修复。 Invoke-Command在双跃validation方面存在问题(试图连接到远程机器,然后从那里连接到networking共享)。 这可以通过使用CredSSP来​​解决,CredSSP有自己的一套步骤和安全问题。

为了避免CredSSP的复杂性和安全漏洞,这可能是另一个解决scheme:

 $Database = "Master" $InputFile = "C:\Windows\Temp\SQL\simple_sp_who.sql" Get-Content \\SOURCEHOST01\PATH\SQLSERVERHOSTNAME.LIST | Foreach-Object { Copy-Item -Path "\\SOURCEHOST01\PATH\" -Destination "\\$($_)\C$\Windows\Temp\SQL" -Recurse Invoke-Command -ComputerName $_ -ScriptBlock { Invoke-Sqlcmd -ServerInstance $_ -Database $Database -InputFile $InputFile } }