Invoke-Sqlcmd -InputFile “\\ UNC \ Path” O acesso é negado?

2

Estou trabalhando em um script Powershell de prova de conceito que será agendado em um host de origem SOURCEHOST01 e invocar comandos em servidores SQL remotos SQLSERV01 & %código%. A ordem planejada das operações é a seguinte:

  1. Obter uma lista de nomes de host do servidor SQL a partir do arquivo de texto armazenado no host de origem SQLSERV02

  2. Para cada servidor SQL, chame um comando para copiar um script SQL \SOURCEHOST01\PATH\SQLSERVERHOSTNAME.LIST to \SOURCEHOST01\PATH\simple_sp_who.sql em cada servidor SQL.

  3. %TEMP% em cada servidor SQL usando o script SQL especificado.

Aqui está o código que tenho até agora:

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 
    }
}

Erro resultante:

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

O script parece estar falhando no Copy-Item devido a problemas de permissão de arquivo. O ambiente de teste em que estou executando está executando tudo como Administrador de Domínio. Tenho certeza de que é um problema simples que estou negligenciando, mas comecei a repetir etapas, por isso preciso de um novo par de olhos.

EDITAR:

Veja o que acabei fazendo:

    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
     }

Parece produzir os resultados desejados.

    
por Confusias 02.10.2017 / 20:42

1 resposta

2

Minha primeira impressão foi errada, mas acho que essa é a sua correção. Invoke-Command tem problemas com a autenticação de salto duplo (tentando se conectar à máquina remota e, em seguida, se conectar a um compartilhamento de rede a partir dela). Isso pode ser corrigido usando o CredSSP, que possui seu próprio conjunto de etapas e problemas de segurança.

Para evitar as falhas de complicação e segurança do CredSSP, isso pode ser uma correção de outra perspectiva:

$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 
    }
}
    
por 03.10.2017 / 00:01