資格情報マネージャ読み書きプログラムをNode.jsで作成する
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つのルーチンに対して、今回のコードを組み込んでおきます。
単一実行ファイルを作成する
Node.js 18よりSingle executable applicationsという機能が装備され、標準で単独実行ファイルが作成できるようになりました。結果pkgはプロジェクト終了となっています。よって、以下のエントリーの単一実行ファイルを作成するを参考に、Node18以降はexeファイルを作成することが可能です。