Сценарий Powershell, не работающий при запуске от SSH (или winexe) от Клиента Linux или Mac

У меня есть сценарий Powershell для резервного копирования MSSQL на поле Windows Server 2008 R2. Это создает резервную копию определенного DB к локальному диску, затем перемещается, резервное копирование на Сеть смонтировало объем CIFS. Это работает 100%-й штраф, когда выполнено локально, неважно, как я вызываю его. Я установил Freesshd (последний), чтобы смочь запустить сценарий с помощью планировщика (не планировщик задач окон). Я постоянно добираюсь 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 $_ }
}
1
задан 26 March 2015 в 19:36
3 ответа

Похоже, что у вас есть две разные проблемы, мешающие вам делать то, что вы хотите здесь - ExecutionPolicy и SysWOW64 Перенаправление файловой системы.

Обход политики выполнения

Чтобы обойти политику выполнения, сделайте это при запуске 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-битный сеанс

3
ответ дан 3 December 2019 в 18:40

Использование WinRM для удаленного вызова сценария с правильным контекстом безопасности SSH не знает, как делегировать олицетворение (и не должен), также использовать планировщик, встроенный в окна, который также может запускаться с надлежащие полномочия.

0
ответ дан 3 December 2019 в 18:40

Винда ужасная. Freesshd кажется подходящим вариантом для SSH Daemon для Windows, и заставить Powershell работать через SSH было худшим опытом, который у меня был с компьютерами за долгое время. В конце концов, благодаря предложению моего коллеги, я решил это следующим образом:

Изначально я настроил это как задание планировщика заданий Windows, и это было нормально, но мой босс хотел, чтобы мы вызывали его из основного планировщик и используйте для этого SSH. После миллиона сбоев PowerShell я вызвал интерфейс командной строки планировщика задач Windows через SSH, чтобы среда была локальным процессом. ssh -l Администратор windows.server.name 'schtasks / RUN / TN "Backup MSI Stats DB"' Готово.

0
ответ дан 3 December 2019 в 18:40

Теги

Похожие вопросы