現在の版: 2.2.0(アセンブリ 2.2.0.0)。変更点は CHANGELOG.md。ビルド済みバイナリの取得・履歴は GitHub Releases を参照してください。
Excel(VBA)や VBScript から SSH 接続を行うための COM コンポーネントです。まず VbaSshLogin でホスト・認証情報を組み立て、VbaSSH.Open に渡して接続します(戻り値は Boolean。失敗時は LastError を参照)。続けて Execute → Close の順で呼び出します。
[ VbaSshLogin ] ホスト・ポート・ユーザー名
ログイン情報 + パスワード または 秘密鍵パス
│
│ .Open login(成功=True)
▼
[ VbaSSH ] ────── SSH セッション ──────► リモート
│ (認証・対話シェル)
│ .Execute "…" (既定は同一シェルで状態継続)
│ .Close
▼
切断
複数ホストへ同時に接続するときは、VbaSSH のインスタンスをホストごとに用意し、それぞれに別の VbaSshLogin を渡します。
- Windows
- .NET Framework 4.8 以降(Windows 10 / 11 では多くの環境で既に入っているか、Windows Update で提供されます)
- Visual Studio 2026(内部バージョン 18)Community など(ソースからビルドする場合)
- リポジトリをクローンする。
VBASSH.slnを Visual Studio で開く。- NuGet(PackageReference)を復元する。初回は Visual Studio の自動復元、または
msbuild VBASSH.sln /t:Restore/nuget restore VBASSH.slnなどで依存 DLL を取得してください(従来のpackages.configは使用しません)。 - Release または Debug でビルドする。
生成物はVBASSH\bin\<構成>\に出力されます(VbaSSHLibrary.dllなど)。
ZIP や手動コピーで配布する場合は、少なくとも次のファイルを同一フォルダに揃えてください(欠けると実行時に読み込みエラーになります)。
| ファイル | 役割 |
|---|---|
VbaSSHLibrary.dll |
本ライブラリ(COM) |
Renci.SshNet.dll |
SSH.NET |
BouncyCastle.Cryptography.dll |
暗号関連 |
Microsoft.Bcl.AsyncInterfaces.dll |
SSH.NET の依存 |
Microsoft.Extensions.DependencyInjection.Abstractions.dll |
同上 |
Microsoft.Extensions.Logging.Abstractions.dll |
同上 |
System.Buffers.dll |
同上 |
System.Formats.Asn1.dll |
同上 |
System.Memory.dll |
同上 |
System.Numerics.Vectors.dll |
同上 |
System.Runtime.CompilerServices.Unsafe.dll |
同上 |
System.Threading.Tasks.Extensions.dll |
同上 |
System.ValueTuple.dll |
同上 |
VbaSSHLibrary.pdb(デバッグシンボル)と VbaSSHLibrary.xml(XML ドキュメント)は任意です。.tlb は RegAsm /tlb: で生成する別ファイルで、ビルド出力には含まれません。
補足: 構成によっては ビルド時に COM 登録(RegisterForComInterop) が走ります。レジストリ書き込みで失敗する場合は、Visual Studio を管理者として起動するか、下記コマンドライン手順のように RegisterForComInterop=false でビルドし、登録は RegAsm を別途行ってください。
本リポジトリでは、ビルド環境の一例として次の x64 用 vcvars を使ってから MSBuild を起動します(インストール先が異なる場合はパスを読み替えてください)。
call "C:\Program Files\Microsoft Visual Studio\18\Community\VC\Auxiliary\Build\vcvars64.bat"
"C:\Program Files\Microsoft Visual Studio\18\Community\MSBuild\Current\Bin\MSBuild.exe" VBASSH.sln /t:Restore,Build /p:Configuration=Release /p:Platform="Any CPU" /p:RegisterForComInterop=falseリポジトリ直下で実行するか、同等の内容を scripts\build-release.cmd から実行できます(上記 vcvars64.bat のパスはスクリプト内に記載済み)。成功時は続けて dotnet test(VBASSH.Tests)まで実行します(dotnet が PATH に必要です)。
単体テストのみ手動で再実行する場合: dotnet test VBASSH.Tests\VBASSH.Tests.vbproj -c Release --no-build で MSTest(ネットワーク不要な検証のみ)を実行できます。
vcvars64.bat のあと環境変数 Platform が x64 になることがあり、ソリューションに無い Release|x64 が選ばれて失敗します。その場合は /p:Platform="Any CPU" を付けてください(スクリプトでは指定済み)。
ActiveX 形式のため、利用前に RegAsm.exe で登録します。管理者として起動した「コマンド プロンプト」または「ターミナル」で、VbaSSHLibrary.dll があるディレクトリに移動してから実行してください。
手順イメージ(テキスト)
- スタートメニューで「cmd」を検索 → 管理者として実行
- 黒いコンソールが開き、プロンプトが
C:\Windows\System32>などになっている - 次項の
cdで DLL フォルダへ移動する
作業ディレクトリの例:
cd C:\path\to\VbaSSHLibrarycd のあと、プロンプトの カレントパスが上記フォルダに変わっていることを確認します(C:\path\to\VbaSSHLibrary> のようになる想定)。
登録コマンドの例(32 ビットの .NET Framework 4.x):
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" VbaSSHLibrary.dll /tlb:VbaSSHLibrary.tlb /codebase成功時の目安(テキスト): コンソールに 型の登録に成功しました。 や アセンブリの登録に成功しました。 に相当するメッセージが出て、終了コード 0 で戻る。同じフォルダに VbaSSHLibrary.tlb が生成または更新される。
64 ビット用の RegAsm が必要な場合は Framework64 配下を使います。ビルド構成(AnyCPU / x64 など)に合わせて選んでください。
.NET Framework が未導入の場合は ダウンロード .NET Framework 4.8 からランタイムを入手してください。
VbaSSHLibrary.dll と同じフォルダに、ビルド出力(bin\Release)に並んでいる すべての依存 *.dll(Renci.SshNet.dll、BouncyCastle.Cryptography.dll、Microsoft.Extensions.*.dll、System.*.dll など)を置いてください。カレントディレクトリがそのフォルダかも併せて確認してください。
RA0000 時のチェック(テキスト)
| 確認すること | 対処の例 |
|---|---|
| カレントディレクトリが DLL と違う | cd で VbaSSHLibrary.dll があるフォルダへ移動してから RegAsm を再実行 |
| 依存 DLL が同フォルダに無い | bin\Release の内容をまとめてコピーし、不足が無いか確認 |
| パスに誤りがある | dir VbaSSHLibrary.dll でファイルが見えるか確認 |
VBE で ツール → 参照設定 を開き、VbaSSHLibrary.tlb を追加し、一覧の VbaSSHLibrary にチェックが付いていることを確認します。
参照ダイアログの操作順(テキスト)
- Excel で Alt + F11(または「開発」タブの Visual Basic)で VBE を開く
- メニュー ツール → 参照設定…
- 参照 ボタン → エクスプローラで
VbaSSHLibrary.tlbを選択 → 開く - 一覧で VbaSSHLibrary に ✓ が付いていることを確認 → OK
コードでは Dim x As New VbaSSHLibrary.VbaSshLogin のように型名が補完できれば参照は通っています。
Dim login As New VbaSSHLibrary.VbaSshLogin で生成し、プロパティで値を設定します。
| プロパティ | 説明 |
|---|---|
Host |
ホスト名または IP |
Port |
ポート(既定 22) |
UserName |
ログインユーザー名 |
Password |
パスワード認証用(鍵のみのときは空のまま) |
PrivateKeyFilePath |
秘密鍵ファイルのパス(パスワードのみのときは空) |
PrivateKeyPassphrase |
鍵のパスフレーズ(不要なら "") |
認証の切り替え: PrivateKeyFilePath が 空でないときは 秘密鍵ファイル認証(サーバ側の authorized_keys に対応する公開鍵が登録されている想定)。空のときは Password でパスワード認証です。
VbaSshLogin を 1 個渡して接続します。戻り値は Boolean(成功 True / 失敗 False)。失敗時は LastError に理由が入ります。login が Nothing のときのみ ArgumentNullException が発生します。
接続後の Execute については、UsePersistentShell = False(コマンドごとの SshCommand)のとき、リモートの終了コードが LastExitStatus に入ります(対話シェル既定時は -1)。
Public Sub ExamplePassword()
Dim login As New VbaSSHLibrary.VbaSshLogin
login.Host = "192.168.0.10"
login.Port = 22
login.UserName = "user"
login.Password = "secret"
Dim ssh As New VbaSSHLibrary.VbaSSH
If Not ssh.Open(login) Then
Debug.Print ssh.LastError
Exit Sub
End If
Debug.Print ssh.Execute("uname -a")
ssh.Close
End SubPublic Sub ExamplePrivateKey()
Dim login As New VbaSSHLibrary.VbaSshLogin
login.Host = "192.168.0.10"
login.UserName = "user"
login.PrivateKeyFilePath = "C:\Users\me\.ssh\id_ed25519"
login.PrivateKeyPassphrase = ""
Dim ssh As New VbaSSHLibrary.VbaSSH
If Not ssh.Open(login) Then
Debug.Print ssh.LastError
Exit Sub
End If
Debug.Print ssh.Execute("uname -a")
ssh.Close
End Sub鍵形式は SSH.NET 対応の OpenSSH / PEM / PuTTY .ppk などを指定できます。
Public Sub MultipleSessions()
Dim ssh1 As New VbaSSHLibrary.VbaSSH
Dim ssh2 As New VbaSSHLibrary.VbaSSH
Dim L1 As New VbaSSHLibrary.VbaSshLogin
L1.Host = "192.168.0.100" : L1.UserName = "user1" : L1.Password = "pass1"
Dim L2 As New VbaSSHLibrary.VbaSshLogin
L2.Host = "192.168.0.101" : L2.UserName = "user2" : L2.Password = "pass2"
If Not ssh1.Open(L1) Then Debug.Print ssh1.LastError: Exit Sub
If Not ssh2.Open(L2) Then Debug.Print ssh2.LastError: Exit Sub
Debug.Print ssh1.Execute("cd /; ls -la")
Debug.Print ssh2.Execute("tar cvf backup.tar *.php")
ssh1.Close
ssh2.Close
End Sub**既定(UsePersistentShell = True)**では、SSH.NET の ShellStream でサーバ上の 同一対話シェルを使います。そのため cd のあとに続く Execute では、カレントディレクトリやシェル変数が維持され、通常の SSH セッションに近い操作ができます。
Public Sub ExampleWithBlock()
Dim L As New VbaSSHLibrary.VbaSshLogin
L.Host = "example.com"
L.UserName = "user"
L.Password = "secret"
With New VbaSSHLibrary.VbaSSH
If Not .Open(L) Then Debug.Print .LastError: Exit Sub
.Execute "cd ~/hogehoge"
Debug.Print .Execute("pwd")
Debug.Print .Execute("ls -la")
Debug.Print .Execute("tar cvf backup.tar *.php")
.Close
End With
End Sub- 各コマンドの完了は、内部で 一意の同期マーカー(
echo __VBASSH_…__)を使って待ち合わせています。 - 長時間コマンドは
ShellCommandTimeoutSeconds(既定 120 秒)以内に終わる必要があります。 - リモートが sh/bash 以外で
echoの挙動が異なる場合は、動作に注意してください。
**従来どおり「コマンドごとに独立した exec」**にしたい場合は、接続後に UsePersistentShell = False を設定してください(cd は次行に引き継がれません)。
アセンブリ 2.0 より、次の旧形式は 廃止されています。
Open host, port, user, passOpenWithPrivateKey ...
上記の VbaSshLogin + Open login に置き換えてください。再ビルド後は RegAsm の再実行と、VBA の 参照の更新(必要なら)を行ってください。
アセンブリ 2.2 より: Open の戻り値は String から Boolean に変更されました。接続失敗時は例外ではなく False と LastError を確認する形にしてください(login が Nothing のときは従来どおり例外)。
VbaSshLoginのパスワード・鍵パス・パスフレーズは、ログやDebug.Printに出さないでください。- 処理の終わりに
ClearSecrets()を呼ぶと、プロパティを空文字に戻せます(.NET の文字列即時消去の限界はclsVbaSshLogin.vbのコメント参照)。 - 配布 ZIP に 秘密鍵ファイル本体を同梱しない運用を推奨します。
手動の SSH クライアントでは成功するが、本ライブラリ経由では失敗する場合は、リモートの ログインシェル・環境変数・非対話実行の制限などが原因になることがあります。
- Visual Basic .NET(.NET Framework 4.8)
- SSH.NET 2025.1.0(
Renci.SshNet)および同梱の暗号・ログ用依存 DLL
SmartScreen は 未署名や ダウンロード元の評判が低いファイルを止めやすいです。次の組み合わせが現実的です。
-
Authenticode で
VbaSSHLibrary.dll(および配布 ZIP 内の各 EXE/DLL)に署名する
商用の コード署名証明書(DigiCert、Sectigo 等)を取得し、Windows SDK のsigntoolで署名します。強名(.snk)だけでは SmartScreen は満足しません(別物です)。 -
タイムスタンプを付ける
証明書の有効期限が切れたあとも署名を検証できるよう、signtoolに RFC3161 タイムスタンプ(例: DigiCert のhttp://timestamp.digicert.com)を指定します。 -
EV コード署名証明書(任意)
標準の OV に比べ、SmartScreen の 即時信頼が得られやすいと言われます(コスト・発行審査は重い)。 -
リリース時にハッシュを公開する
利用者が改ざんなく取得できたか確認できるよう、GitHub Releases の本文に SHA256 を記載します。ビルド後にscripts\compute-release-hashes.cmdを実行すると一覧を出せます。 -
Microsoft への申請(補助)
誤検知が続く場合は、Microsoft の該当フォーム などからファイル提出・誤検知報告を検討します(根本対策は署名と継続配布による評判です)。
テンプレート: scripts\sign-authenticode.example.cmd をコピーし、PFX パスと signtool のパスを環境に合わせて編集してください(秘密はリポジトリに含めないこと)。
- CONTRIBUTING.md … PR の進め方、COM / VBA 互換、破壊的変更の扱い、強名キーの注意
- docs/QA-CHECKLIST.md … リリース前の手動 QA 手順
- docs/RELEASING.md … メンテナ向け(GitHub Release・タグ・ZIP・SHA256)