Skip to content

kuwa2005/VBASSH

Repository files navigation

VbaSSHLibrary(VBASSH)

build

現在の版: 2.2.0(アセンブリ 2.2.0.0)。変更点は CHANGELOG.md。ビルド済みバイナリの取得・履歴は GitHub Releases を参照してください。

Excel(VBA)や VBScript から SSH 接続を行うための COM コンポーネントです。まず VbaSshLogin でホスト・認証情報を組み立て、VbaSSH.Open に渡して接続します(戻り値は Boolean。失敗時は LastError を参照)。続けて ExecuteClose の順で呼び出します。

構成のイメージ(テキスト)

  [ 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 など(ソースからビルドする場合)

ビルド

Visual Studio から

  1. リポジトリをクローンする。
  2. VBASSH.sln を Visual Studio で開く。
  3. NuGet(PackageReference)を復元する。初回は Visual Studio の自動復元、または msbuild VBASSH.sln /t:Restore / nuget restore VBASSH.sln などで依存 DLL を取得してください(従来の packages.config は使用しません)。
  4. Release または Debug でビルドする。
    生成物は VBASSH\bin\<構成>\ に出力されます(VbaSSHLibrary.dll など)。

Release フォルダに同梱するファイル(配布時)

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 ドキュメント)は任意です。.tlbRegAsm /tlb: で生成する別ファイルで、ビルド出力には含まれません。

補足: 構成によっては ビルド時に COM 登録(RegisterForComInterop が走ります。レジストリ書き込みで失敗する場合は、Visual Studio を管理者として起動するか、下記コマンドライン手順のように RegisterForComInterop=false でビルドし、登録は RegAsm を別途行ってください。

コマンドライン(vcvars64 + MSBuild)

本リポジトリでは、ビルド環境の一例として次の 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 testVBASSH.Tests)まで実行します(dotnet が PATH に必要です)。

単体テストのみ手動で再実行する場合: dotnet test VBASSH.Tests\VBASSH.Tests.vbproj -c Release --no-buildMSTest(ネットワーク不要な検証のみ)を実行できます。

vcvars64.bat のあと環境変数 Platformx64 になることがあり、ソリューションに無い Release|x64 が選ばれて失敗します。その場合は /p:Platform="Any CPU" を付けてください(スクリプトでは指定済み)。

COM としての登録(RegAsm)

ActiveX 形式のため、利用前に RegAsm.exe で登録します。管理者として起動した「コマンド プロンプト」または「ターミナル」で、VbaSSHLibrary.dll があるディレクトリに移動してから実行してください。

手順イメージ(テキスト)

  1. スタートメニューで「cmd」を検索 → 管理者として実行
  2. 黒いコンソールが開き、プロンプトが C:\Windows\System32> などになっている
  3. 次項の cd で DLL フォルダへ移動する

作業ディレクトリの例:

cd C:\path\to\VbaSSHLibrary

cd のあと、プロンプトの カレントパスが上記フォルダに変わっていることを確認します(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 からランタイムを入手してください。

RegAsm : error RA0000 : 入力アセンブリ 'VbaSSHLibrary.dll' またはその依存関係の 1 つが見つかりません。

VbaSSHLibrary.dll同じフォルダに、ビルド出力(bin\Release)に並んでいる すべての依存 *.dllRenci.SshNet.dllBouncyCastle.Cryptography.dllMicrosoft.Extensions.*.dllSystem.*.dll など)を置いてください。カレントディレクトリがそのフォルダかも併せて確認してください。

RA0000 時のチェック(テキスト)

確認すること 対処の例
カレントディレクトリが DLL と違う cdVbaSSHLibrary.dll があるフォルダへ移動してから RegAsm を再実行
依存 DLL が同フォルダに無い bin\Release の内容をまとめてコピーし、不足が無いか確認
パスに誤りがある dir VbaSSHLibrary.dll でファイルが見えるか確認

Excel VBA での参照設定

VBE で ツール → 参照設定 を開き、VbaSSHLibrary.tlb を追加し、一覧の VbaSSHLibrary にチェックが付いていることを確認します。

参照ダイアログの操作順(テキスト)

  1. Excel で Alt + F11(または「開発」タブの Visual Basic)で VBE を開く
  2. メニュー ツール参照設定…
  3. 参照 ボタン → エクスプローラで VbaSSHLibrary.tlb を選択 → 開く
  4. 一覧で VbaSSHLibrary に ✓ が付いていることを確認 → OK

コードでは Dim x As New VbaSSHLibrary.VbaSshLogin のように型名が補完できれば参照は通っています。

API の使い方(オブジェクト指向)

VbaSshLogin(ログイン情報)

Dim login As New VbaSSHLibrary.VbaSshLogin で生成し、プロパティで値を設定します。

プロパティ 説明
Host ホスト名または IP
Port ポート(既定 22
UserName ログインユーザー名
Password パスワード認証用(鍵のみのときは空のまま)
PrivateKeyFilePath 秘密鍵ファイルのパス(パスワードのみのときは空
PrivateKeyPassphrase 鍵のパスフレーズ(不要なら ""

認証の切り替え: PrivateKeyFilePath空でないときは 秘密鍵ファイル認証(サーバ側の authorized_keys に対応する公開鍵が登録されている想定)。のときは Password でパスワード認証です。

VbaSSH.Open(login)

VbaSshLogin を 1 個渡して接続します。戻り値は Boolean(成功 True / 失敗 False)。失敗時は LastError に理由が入ります。loginNothing のときのみ 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 Sub

秘密鍵ファイル(公開鍵認証)の例

Public 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

複数の Execute とカレントディレクトリ(対話シェル)

**既定(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 は次行に引き継がれません)。

v1 系 API からの移行(破壊的変更)

アセンブリ 2.0 より、次の旧形式は 廃止されています。

  • Open host, port, user, pass
  • OpenWithPrivateKey ...

上記の VbaSshLogin + Open login に置き換えてください。再ビルド後は RegAsm の再実行と、VBA の 参照の更新(必要なら)を行ってください。

アセンブリ 2.2 より: Open の戻り値は String から Boolean に変更されました。接続失敗時は例外ではなく FalseLastError を確認する形にしてください(loginNothing のときは従来どおり例外)。

秘密情報の取り扱い(セキュリティ)

  • VbaSshLogin のパスワード・鍵パス・パスフレーズは、ログや Debug.Print に出さないでください。
  • 処理の終わりに ClearSecrets() を呼ぶと、プロパティを空文字に戻せます(.NET の文字列即時消去の限界は clsVbaSshLogin.vb のコメント参照)。
  • 配布 ZIP に 秘密鍵ファイル本体を同梱しない運用を推奨します。

Execute が期待どおり動かないとき

手動の SSH クライアントでは成功するが、本ライブラリ経由では失敗する場合は、リモートの ログインシェル・環境変数・非対話実行の制限などが原因になることがあります。

技術スタック

  • Visual Basic .NET(.NET Framework 4.8)
  • SSH.NET 2025.1.0Renci.SshNet)および同梱の暗号・ログ用依存 DLL

Windows SmartScreen 対策(予防)

SmartScreen は 未署名ダウンロード元の評判が低いファイルを止めやすいです。次の組み合わせが現実的です。

  1. Authenticode で VbaSSHLibrary.dll(および配布 ZIP 内の各 EXE/DLL)に署名する
    商用の コード署名証明書(DigiCert、Sectigo 等)を取得し、Windows SDK の signtool で署名します。強名(.snk)だけでは SmartScreen は満足しません(別物です)。

  2. タイムスタンプを付ける
    証明書の有効期限が切れたあとも署名を検証できるよう、signtoolRFC3161 タイムスタンプ(例: DigiCert の http://timestamp.digicert.com)を指定します。

  3. EV コード署名証明書(任意)
    標準の OV に比べ、SmartScreen の 即時信頼が得られやすいと言われます(コスト・発行審査は重い)。

  4. リリース時にハッシュを公開する
    利用者が改ざんなく取得できたか確認できるよう、GitHub Releases の本文に SHA256 を記載します。ビルド後に scripts\compute-release-hashes.cmd を実行すると一覧を出せます。

  5. Microsoft への申請(補助)
    誤検知が続く場合は、Microsoft の該当フォーム などからファイル提出・誤検知報告を検討します(根本対策は署名と継続配布による評判です)。

テンプレート: scripts\sign-authenticode.example.cmd をコピーし、PFX パスと signtool のパスを環境に合わせて編集してください(秘密はリポジトリに含めないこと)。

コントリビューション・改造前の確認

About

VbaSSHLibrary: SSH from Excel VBA via COM (VB.NET, SSH.NET)

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors