VBA等のスクリプト系は、Windowsの資格情報マネージャに格納されてる情報を直接取得する事が出来ません。かといって、Web API等のアクセスに必要な情報を直書きしたり、そのままレジストリに書き込んで読み書きでは不安です。

そこで今回、Node.js + Keytar + nexeでexeを作成し、コマンドラインの標準出力でVBA側にパスワードを渡す手法を考えてみました。

※正直言って実用的じゃないので、素直に暗号化モジュール使って、暗号/複合を実装したほうがなんぼもマシだと思います

難易度:

今回使用するモジュール

今回は、Node.jsにコマンドライン引数を渡して処理し、返り値をDOS窓の標準出力を取得する形で手に入れます。

ソースコード

Node.js側コード

  • optionDefinitionsにて、コマンドライン引数オプション-s-u-gの場合の処理を用意しています。
  • コマンドラインとして、node index.js -u ユーザID -s パスワードとすると、パスワードを資格情報マネージャにセットします。
  • コマンドラインとして、node index.js -u ユーザID -g ユーザIDとすると、パスワードを資格情報マネージャからゲットします。
  • -gの時の処理、-sの時の処理それぞれを条件分岐で作成します。
  • setPasswordでkeytarを使ってパスワードをセットします。
  • getPasswordでkeytarを使ってパスワードをゲットします。
  • keytar自体、非同期で実行されるので、callbackやthenなどを利用して値を取得後に標準出力で出すようにコードを記述する必要があります。
  • servicenameは、利用するウェブサービス等の名称と組み合わせる何か(例えばUser ID)で組み立てます。これを元に資格情報マネージャにセットしたり、取得したりします。

VBA側コード

  • WSHを利用してexecにてコマンドラインを実行しています(今回はとりあえずパスワードの取得の部分だけ)
  • StdOut.ReadAllにて標準出力(console.log())に出力された内容を取得しています。
  • コマンドプロンプトの画面はexecの場合、非表示に出来ません。しかし、Runの場合今度は標準出力を取得できません。
  • VBSを利用したコマンドプロンプト非表示のテクニックがあるので、こちらを利用すると尚良いでしょう。
  • パスワード取得とパスワードセットの2つのルーチンに対して、今回のコードを組み込んでおきます。

関連リンク

共有してみる: