O script Powershell não funciona quando é iniciado a partir do SSH (ou winexe) de um cliente Mac ou Linux

1

Eu tenho um script Powershell para fazer backup do MSSQL em uma caixa do Windows Server 2008 R2. Faz o backup de um banco de dados específico para um disco local e, em seguida, move o backup para um volume CIFS montado na rede. Ele funciona 100% bem quando executado localmente, não importa como eu invoco isso. Eu instalei o Freesshd (mais recente) para poder iniciar o script usando um agendador (não o agendador de tarefas do Windows). Eu estou constantemente recebendo cannot be loaded because the execution of scripts is disabled on this system. Please see "get-help abo ut_signing" eu conecto via SSH, invoco o powershell, e então executo. \ Scriptname. Executando get-executionpolicy retornando remoteSigned . Estou logado como a conta de administrador local via autenticação de senha.

#################
# Backup MSI    #
# A POwershell  #
# Script.       #
#################
#load SQL snap-in
Add-PSSnapin *SQL*

#pull the current date
$date = Get-Date -Format yyyyddMM

#set location of backup files and create it if not present
$DIRECTORY = "D:\Temp\"

if (-Not (Test-Path $DIRECTORY) ) { md $directory }

#Grab the database names into an array
$dbname = dir 'SQLSERVER:\SQL\MYHOST\MYDBMSSQL\Databases' | Select Name

#Backup each database found which matches the regex "stats".
$dbname | foreach { $_.Name.ToString() }|where { $_ -match "stats" } | foreach {$bakfile = "$DIRECTORY" + $_ + "_" + $date + ".bak";
"Backing up Database: $_"; Invoke-Sqlcmd -QueryTimeout 10000 -SuppressProviderContextWarning -Query "BACKUP DATABASE $_ TO DISK=N'$bakfile' WITH INIT";}

# Move Backup from local disk to CIFS mount
Copy-Item $DIRECTORY\*.bak \e-nfs-01.mycompany.net\backup-bi-em\Backups
Remove-Item $DIRECTORY\*.bak
cd \e-nfs-01.mycompany.net\backup-bi-em\Backups

#Get array of existing Backups
$backups=@( ls \e-nfs-01.mycompany.net\backup-bi-em\backups\*.bak|sort-object -property CreationTime -descending|foreach { $_.Name } )

#Delete Anything Beyond 3 Newest Backups
if ($backups.Length -gt 3 ) {
    foreach ($_ in $backups[3..$backups.Length]) { Remove-Item $_ }
}
    
por sed_and_done 26.03.2015 / 18:36

3 respostas

3

Você parece ter dois problemas diferentes que o impedem de fazer o que deseja aqui - Redirecionamento do Sistema de Arquivos ExecutionPolicy e SysWOW64.

Política de Execução de Bypass

Para ignorar a política de execução, faça isso ao iniciar o PowerShell, da seguinte forma:

PowerShell.exe -ExecutionPolicy Bypass -File .\scriptname.ps1

Ignorar o redirecionamento do sistema de arquivos

Como o freeSSHd parece ser um aplicativo de 32 bits, o Windows tenta garantir nenhum problema de compatibilidade em sua máquina de 64 bits, por meio de alguns truques interessantes (ou comportamento "lixo", dependendo do seu preconceito). Uma maneira é através do Redirecionador do sistema de arquivos

Para desabilitar o redirecionamento do sistema de arquivos, você pode chamar o Wow64DisableWow64FsRedirection função da API do Win32 , e todas as chamadas subseqüentes desse segmento não serão mais afetadas pelo redirecionamento:

$MethodSignature = @"
[DllImport("kernel32.dll", SetLastError=true)]
public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);
"@

$Kernel32 = Add-Type -MemberDefinition $MethodSignature -Namespace "Kernel32" -Passthru

$ptr = [IntPtr]::Zero
$Result = $Kernel32::Wow64DisableWow64FsRedirection([ref]$ptr)

# Now you can call 64-bit Powershell from system32
C:\Windows\System32\WindowsPowershell\v1.0\powershell.exe -ExecutionPolicy Bypass -File .\Script.ps1

Salve as opções acima como um script ( wrapper.ps1 ) e chame-o de ssh com:

powershell -ExecutionPolicy Bypass -NoProfile -File .\wrapper.ps1

Para evitar módulos ou snap-ins de 64 bits do perfil que está sendo carregado na sessão de 32 bits

    
por 26.03.2015 / 18:52
0

Use o WinRM para invocar remotamente o script com o contexto de segurança adequado O SSH não sabe como delegar a representação (nem deve) também usar o planejador embutido no Windows, que também pode invocar com as credenciais apropriadas.

    
por 26.03.2015 / 19:51
0

O Windows é horrível. Freesshd parece ser o caminho a percorrer para um SSH Daemon para Windows, e para obter Powershell para trabalhar em todo SSH foi a pior experiência que tive com computadores em um longo tempo. No final, com uma sugestão do meu colega de trabalho, foi assim que resolvi:

Inicialmente, configurei isso como um trabalho do Agendador de Tarefas do Windows, e estava tudo bem, mas meu chefe queria que nós o chamássemos de nosso agendador principal e usássemos o SSH para fazer isso. Depois de um milhão de falhas no powershell, acabei chamando a CLI do agendador de tarefas do Windows via SSH para que o ambiente fosse o de um processo local. ssh -l Administrator windows.server.name 'schtasks /RUN /TN "Backup MSI Stats DB"' concluído.

    
por 26.03.2015 / 22:00