Windows Server 2008R2ボックスにMSSQLをバックアップするためのPowershellスクリプトがあります。特定のDBをローカルディスクにバックアップしてから、ネットワークにマウントされた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 $_ }
}
ここで必要なことを実行できない2つの異なる問題があるようです。ExecutionPolicyとSysWOW64ファイルシステムリダイレクトです。
実行ポリシーをバイパスするには、PowerShellを起動するときに次のようにバイパスします。
PowerShell.exe -ExecutionPolicy Bypass -File .\scriptname.ps1
FreeSSHdは32ビットアプリケーションのように見えるため、Windowsは、いくつかの気の利いたトリック(または先入観によっては「ガベージ」動作)によって、64ビットマシンで互換性の問題が発生しないようにします。 1つの方法は、 ファイルシステムリダイレクタ を使用することです。
ファイルシステムリダイレクトを無効にするには、 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に組み込まれたスケジューラーも使用します。
Windowsは恐ろしいです。 Freesshdは、Windows用のSSHデーモンを使用する方法のようです。また、PowershellをSSH全体で機能させることは、私が長い間コンピューターで経験した中で最悪の経験でした。結局、私の同僚からの提案で、これは私がそれを解決した方法です:
最初は、これをWindowsタスクスケジューラジョブとして設定しましたが、問題はありませんでしたが、上司はメインスケジューラから呼び出し、SSHを使用して呼び出すことを望んでいました。数百万のPowerShellに障害が発生した後、SSH経由でWindowsタスクスケジューラCLIを呼び出すことになり、環境がローカルプロセスの環境になりました。 ssh -l Administrator windows.server.name 'schtasks /RUN /TN "Backup MSI Stats DB"'
完了。