web-dev-qa-db-ja.com

MacまたはLinuxクライアントからSSH(またはwinexe)から起動したときにPowershellスクリプトが機能しない

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-executionpolicyremoteSignedを返します。パスワード認証を介してローカル管理者アカウントとしてログインしています。

#################
# 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
sed_and_done

ここで必要なことを実行できない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ビットセッションでロードされないようにするため

4

WinRMを使用して、適切なセキュリティコンテキストでスクリプトをリモートで呼び出すSSHは、偽装を委任する方法を知りません(また、そうすべきではありません)。また、適切な資格情報で呼び出すことができるWindowsに組み込まれたスケジューラーも使用します。

0
Jim B

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"'完了。

0
sed_and_done