У меня есть сценарий Powershell для резервного копирования MSSQL на Windows Server 2008 R2. Он выполняет резервное копирование определенной БД на локальный диск, а затем перемещает резервную копию на сетевой том CIFS. Он работает на 100% нормально при локальном запуске, независимо от того, как я его вызываю. Я установил Freesshd (последний), чтобы иметь возможность запускать скрипт с помощью планировщика (а не планировщика задач Windows). Я постоянно получаю cannot be loaded because the execution of scripts is disabled on this system. Please see "get-help abo
ut_signing"
Я подключаюсь через SSH, вызываю powershell, затем запускаю. \ Scriptname. Бег get-executionpolicy
возвращается remoteSigned
. Я вошел в систему как локальный администратор с помощью аутентификации по паролю.
#################
# 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 $_ }
}
Кажется, у вас есть две разные проблемы, мешающие вам делать здесь то, что вы хотите - ExecutionPolicy и SysWOW64 File System Redirection.
Чтобы обойти политику выполнения, сделайте это при запуске PowerShell, например:
PowerShell.exe -ExecutionPolicy Bypass -File .\scriptname.ps1
Поскольку freeSSHd кажется 32-битным приложением, Windows пытается гарантировать отсутствие проблем с совместимостью на вашем 64-битном компьютере с помощью нескольких изящных уловок (или «мусорного» поведения, в зависимости от вашего предубеждения). Один путь - через Перенаправитель файловой системы
Чтобы отключить перенаправление файловой системы, вы можете вызвать Wow64DisableWow64FsRedirection
Функция Win32 API, и все последующие вызовы из этого потока больше не будут затронуты перенаправлением:
$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
Сохраните приведенное выше как сценарий (wrapper.ps1
) и вызвать его из ssh с помощью:
powershell -ExecutionPolicy Bypass -NoProfile -File .\wrapper.ps1
Чтобы избежать загрузки 64-разрядных модулей или оснасток из профиля в 32-разрядном сеансе
Используйте WinRM для удаленного вызова сценария с правильным контекстом безопасности. SSH не знает, как делегировать олицетворение (да и не должен) также использовать планировщик, встроенный в Windows, который также может запускаться с соответствующими учетными данными.
Окна ужасные. Freesshd кажется подходящим вариантом для SSH Daemon для Windows, и заставить Powershell работать через SSH было худшим опытом, который у меня был с компьютерами за долгое время. В конце концов, по совету моего коллеги, я решил это следующим образом:
Первоначально я настроил это как задание планировщика задач Windows, и это было нормально, но мой босс хотел, чтобы мы вызывали его из нашего основного планировщика и использовали для этого SSH. После миллиона сбоев PowerShell я в конечном итоге вызвал CLI планировщика задач Windows через SSH, чтобы среда была локальным процессом. ssh -l Administrator windows.server.name 'schtasks /RUN /TN "Backup MSI Stats DB"'
Готово.