調べて、学ぶ

検索したり実験したことを覚えとくブログ

runasコマンドの代替を考えた

runasはつかえねぇ

職場で動いている業務システム(20年もののヴィンテージ)ですが、更新データを受け取るようにwindowsのログオン後に起動するバッチを、スタートアップフォルダに仕込んでいた。 ...のですが、

問題

  • 新しいユーザIDでログインするたびにスタートアップフォルダに仕込まなきゃいけない
  • 更新バッチには一部Admin必須となるコマンドが含まれている(regsvr32とか)ので、ipc$共有を使ってadmin権を行使していたが、コマンド実行のためにバッチファイルにadminユーザのパスワードが入っている。

  • 「ipc$共有でadmin権行使」は、windows10(8かもしれない)からどうも聞いてない様子(正式なドキュメント見つからず)

一時凌ぎ

  • スタートアップフォルダに仕込むのはやめて、AD環境なんだからログオンスクリプトに変更
  • $ipcできない&バッチにパスワードがあるのは、runas /savecredにしよう(資格情報がバッチリ残るけどテキストで残るよりは...)

これで試してみたのですが、新しいユーザが初めてログインする時は「とてつもなく待たされた挙句にrunasのパスワード待ち」というダメダメな形に。
キッティング時に我々が我慢すればいいのですが、知らないところでユーザ名を変更してログインされるとユーザが同じ目に遭う。

キッティングを担当している後輩くんも調べてくれて、どうもこれは「ログインスクリプト内でrunasが実行されて、パスワードの入力待ちでタイムアウトするまで待ち続けている」のだろうという結論に至った。

ならばrunasにパラメータを差し込めば とも思うが、方法が見つからない...

やりたいこと

  • admin権を行使してプログラムを実行したい
    • ユーザをadministratorsに入れるのは却下
    • runasは(/savecredするにしても)どうしても一回だけパスワードを入力する必要があるので、なんとかパスワードをパラメータで渡したい

※ちなみにrunas /savecredは、ユーザがカラクリに気づくとかなりまずい(ユーザがadmin権を悪用できてしまう)ので”最終手段”まで格下げ。

となると、もうrunasなんて使えねぇじゃん。

他ユーザで実行といえば

そういえば「タスクスケジューラ」はログオンしてない時でもアカウントを起動できるオプションがある。タスクスケジューラといえばatコマンド。 これ、ちゃんと使うのは初めてだな...「at /?」でヘルプを...

このATコマンドは廃止されました。代わりにschtasksコマンドを使用してください。

!? いつの間に...

結果(解決)

ということで、以下のコマンドを作成

@echo off
schtasks /create /tn <タスク名> /tr <実行するコマンド> /sc onece /st 23:59 /u <admin権を持っているユーザ> /p <パスワード>
schtasks /run /tn <タスク名>
schtasks /delete /tn <タスク名>

1行目でこれから使うコマンド(パスワード入っている)を非表示に。
2行目で「admin権を持つユーザで実行するタスクを作成」(”once”で一回だけ実行)、
3行目で(1行目の/tnの)「タスクを今すぐ実行」、
4行目で(1行目の/tnの)「タスクを削除」(このタスクの存在を消す)。

ずっと悩んでた”忌まわしい因習”が一つ断ち切れたw