メイン | 2004年02月 »

2004年01月31日

プロセスの実行の防止

多くの学校では、生徒がフロッピーディスクにまずいプログラムを入れてきて実行することがあると思う。フロッピーディスクだから、NTFSのアクセス権でなんとかできる問題ではない。
Microsoft の TechNet にプロセスの実行の防止という記事があった。WSHからWMIを使って、プロセスが起動するたびにその名前をチェックして条件に合えばプロセスを kill する。

それを perl に移してみたのが以下のもの(Windows XP 用) 。
A:ドライブと E:ドライブの実行ファイルが起動されるとそのプロセスが kill される。フロッピーディスクだけでなく、CD-ROMドライブや、ユーザのホームディレクトリからの実行を防止するように改造するのは簡単だろう。
use Win32::OLE;
$strComputer=".";
$wmi = Win32::OLE->GetObject(
  "WinMgmts:{impersonationLevel=impersonate}!//".
  "$strComputer\\root\\cimv2"
) or die;
$colMonitoredProc = $wmi->ExecNotificationQuery(
  "select * from __instancecreationevent within 1".
  " where TargetInstance isa 'Win32_Process'"
);
while(1){
  $objLatestProcess = $colMonitoredProc->{NextEvent};
  $proc_name=$objLatestProcess->TargetInstance->Name();
  if($proc_name=~/a:/ or $proc_name=~/e:/){
    $objLatestProcess->TargetInstance->Terminate();
  }
}

上記のスクリプトだとコマンドプロンプトが開いてしまうので、別のプロセスからウィンドウを開かないようにして起動するのが使いやすいかも。
use Win32;
use Win32::OLE;
use Win32::Process;

if($ARGV[0] eq "-eXecute"){
  shift;
  procchk(@ARGV);
}else{
  my $path=Win32::ExpandEnvironmentStrings("%PATH%");
  ($perl_path)=grep(/perl/i, split(/;/,$path));
  $perl_path=~s/\\$//;
  $perl_path.="\\perl.exe";
  $perl_path="" if(! -e $perl_path);
  $script_path=Win32::GetFullPathName($0);
  
  ($strComputer, @inhibit)=@ARGV;
  $strComputer ||= ".";
  @inhibit = qw/a:\ z:\ e:\ install/ if(! @inhibit);
  Win32::Process::Create($ProcessObj, $perl_path,
    $perl_path.' "'.$script_path.
    "\" -eXecute $strComputer @inhibit",
    0, NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW, "."
  )|| die ErrorReport();
}

sub ErrorReport{
  die;
}

sub procchk{
  my ($strComputer, @inhibit)=@_;
  return if $inhibit[0] eq "";
  grep(s/\\/\\\\/g,@inhibit);
  $check_str=join(" or ",map("\$_[0]=~/$_/i",@inhibit));
  eval("\$check_name = sub {$check_str}");

  $wmi = Win32::OLE->GetObject(
    "WinMgmts:{impersonationLevel=impersonate}!//"."
    $strComputer\\root\\cimv2"
  );
  $colMonitoredProc = $wmi->ExecNotificationQuery(
    "select * from __instancecreationevent within 1 ".
    "where TargetInstance isa 'Win32_Process'"
  );
  while(1){
    $objLatestProcess = $colMonitoredProc->{NextEvent};
    $proc_name=
      $objLatestProcess->TargetInstance->Name();
    if($check_name->($proc_name)){
      $objLatestProcess->TargetInstance->Terminate();
    }
  }
}

投稿者 augustus : 21:29 | コメント (0) | トラックバック

2004年01月28日

条件に合うユーザを一括でグループに加える

Windows 2003 server で条件に合うユーザを一括であるグループに加えたいという場面に昨日遭遇した。
具体的には abc.local(仮名) というドメインに所属している ログオンIDが zt で始まるユーザを全て seito(仮名)というグループに加えるという仕事。


条件に合うユーザを捜すには dsquery user が使える。
dsquery user -samid zt*

グループに加えるには dsmod group が使える
dsmod group "CN=seito,CN=Users,OU=abc,OU=local" -addmbr メンバーの識別名
(メンバーの識別名を省略すると標準入力から読み込まれる)

以上を組み合わせて完成品は
dsquery user -samid zt* | dsmod group "CN=teiji,CN=Users,OU=abc,OU=local" -addmbr
(一行で入力)

本校の環境では ログオンID が zt から始まるユーザは全て teiji グループに所属しているので、「特定のグループのメンバーを全て、別のあるグループに所属させる」という方針でもうまく行くと思う。
dsquery group -samid teiji | dsqet group -members | dsmod group "CN=seito,CN=Users,OU=abc,OU=local" -addmbr
(一行で入力)

詳しくは ディレクトリ サービスのコマンド ライン ツール などを参照されたい。

投稿者 augustus : 06:24 | コメント (0) | トラックバック

2004年01月25日

Active Perl の ppm をインターネットに接続されていないPCで使う。

Active Perl でモジュールを追加するには PPM を使うのが簡単だ。最新のモジュールを Active State 社のサイトに探しに行ってくれ大変便利なのだが、インターネットから切り離されたPCで Perl のモジュールを入れたいときもあるだろう。そういうときは PPM の rep コマンドを利用してモジュールの場所を指定すれば良い。

  1. まずは、インターネットに繋げるPCで追加したいモジュールをダウンロードしてくる。 http://ppm.activestate.com/PPMPackages/ には zip で圧縮されたモジュールがあるので、適当なディレクトリに解凍しておく。それを好きな外部メディアを使ってモジュールを追加したいコンピュータにコピーしておく。(ここでは C:\perl_mod にコピーしたとする。)
  2. コマンドプロンプトから PPM を起動する。
  3. PPM のプロンプトから
    rep add 適当な名前 モジュールを入れたディレクトリ名
    と入力する。(ディレクトリ名のところには ppd ファイルが入っているディレクトリを指定する。) モジュールが C:\perl_mod にあるなら、
    rep add local_perl_mod c:\perl_mod
    みたいに入力すれば良い。
    次に別のモジュールを追加するときもこのディレクトリを利用するようにすれば、 rep add コマンドをもう一度やる必要はない。
  4. ここまで用意しておけば ppm の install コマンドが使える。ただし、依存関係にあるモジュールが入っていないときはうまく行かない。
rep add コマンドは、PPM がモジュールを探しに行く場所の指定を行うものである。だから、同じディレクトリにモジュールを保管するようにすれば、次回から rep add コマンドを入力せずにモジュールのインストールが可能になる。

詳しくは ppm を起動した状態で help rep と入力すると説明を読むことが出来る。

投稿者 augustus : 16:29 | コメント (5) | トラックバック

2004年01月24日

Active Perl の ppm をプロクシー越しに行う

プロクシー経由でインターネットに接続されているLAN内のコンピュータで Active Perl のモジュールを入れたい場面がある。
そういうときは環境変数 HTTP_proxy でプロクシーサーバの場所とポートを指定してから ppm を起動すれば良い。

例: proxyサーバが proxy1 で ポート 8080 なら、コマンドプロンプトから
set HTTP_proxy=http://proxy1:8080
と入力してから ppm を起動する。
proxy1 のところは IP アドレスで指定することも可能。

参考:
http://www.geocities.co.jp/HeartLand-Gaien/3495/comp/perl1.html

投稿者 augustus : 13:16 | コメント (0) | トラックバック

2004年01月21日

cacls.exe が力不足のとき

NTFS のアクセス権をコマンドラインから変更するツールとして、Windows NT, 2000, XP, 2003 server などでは標準で cacls.exe がある。ところが、この cacls.exe はアクセス権の種類として、フルコントロール、変更、書込、読込しか与えることができず、細かい設定ができない。

もう少し細かく設定したいときには
unicacls.exe
xcacls.exe を使うとよい。

<<< unicacls の使用例 >>>
XXX という名のフォルダーにseitoグループはファイルを作成でき、自分の作ったファイルは変更可能で、他人の作ったファイルの中身は覗けないという設定
unicacls XXX /T /E /G seito:rwx- "Creator Owner":C system:F administrators:F
要は、フォルダーとサブフォルダーに対して書込の権利を与えて、ファイルに対しては権限を与えない。そのままだと、自分で作ったファイルも編集できないので Creator Owner グループを使うことを考えた。

投稿者 augustus : 02:55 | コメント (0) | トラックバック

2004年01月18日

Explorer のオプション

エクスプローラのオプションを調べようとして、
explorer /?
とやってみると、
パス '/?'は存在しないか、ディレクトリではありません。
と答えられてしまった。しかたがないので、googleさんに尋ねて調べたのが、以下の結果。

書式:
EXPLORER.EXE [/N] [/E] [, /ROOT, <オブジェクト>]
[, /SELECT, <サブ オブジェクト>]

オプション:
/N   新しいウィンドウでマイコンピュータ風の表示
/E   エクスプローラ風(左側にフォルダをツリー表示)。
/ROOT   開くウィンドウのルートを指定。
/SELECT   指定したオブジェクトを選択した状態で開く。

例:
explorer /e,/root,c:\
explorer /e,/select,"C:\program files\accessories"

実験してみると、select と root を両方指定したときは挙動がおかしいようだ。

参照:
マイクロソフト サポート技術情報 - 130510
W95:エクスプローラ起動時に使用できるオプション スイッチ

投稿者 augustus : 18:10 | コメント (0) | トラックバック

2004年01月17日

google 対策入門

google は言わずと知れた検索エンジンの雄である。
検索をする立場としても便利な方法がいろいろあるし、検索される立場としても上位に表示されやすくなるような方法がある。

Tech-Ezo プチ勉強会での Power Point 資料
google API を使ったCGIの例


Tech-ezoというのは勉強会を中心に活動している北海道のコンピュータ関係のグループである。そこで、2003年11月に「Web活用」というテーマで座談会形式のプチ勉強会が開かれた。そのときのネタに持ち込んだのが上記資料。

投稿者 augustus : 22:10 | コメント (0) | トラックバック

2004年01月16日

MovableType を MySQL で使う。

私がサーバを借りているIpowerWEBでは MySQL を使うことが出来る。せっかくなので、MovableType のデータを MySQL を使って保存するように設定し直してみた。手順は概ね以下の通り。

参考になったサイトは
http://209.204.217.175/readme/mtcfg.html

投稿者 augustus : 23:37 | コメント (0) | トラックバック

2004年01月15日

MOVABLE TYPE インストール

昨日からの大雪と強風のため外出する気分にならなかったので、ネット上をぶらぶらしているうちに BLOG の紹介ページにたどり着く。面白そうだったので MOVABLETYPE とその日本語化キットをダウンロードして、借りているサーバにインストールしてみる。
私が借りている IpowerWeb のサーバには必要なものは全部入っていたようですんなりインストール出来た。

インストールには以下のサイトを参考にした。
MovableType 日本語化手順

投稿者 augustus : 22:14 | コメント (1) | トラックバック

NTFSアクセス権も含めてファイルをコピーする方法

NTFS上でアクセス権も含めてそのままファイルやフォルダをコピーするにはどうしたらよいのだろうか。このTipsのキーワードは「xcopy」コマンドに「/O」オプションを付けて実行することだ。

NTFSアクセス権も含めてファイルをコピーする方法
Windows 2000 ヒント集

日経Windows pro windows 2003 server 特集

投稿者 augustus : 18:09 | コメント (0) | トラックバック

Windows 2000リソースキットのSubinacl.exe

某メーリングリストでファイルの所有権を変更する方法が質問されていた。それに対する答えが subinacl.

マイクロソフト サポート技術情報 - 265360
コマンド ラインを使用して複数のサブディレクトリのアクセス許可を編集する


##### Subinacl.exe ユーティリティを使用してサブディレクトリの所有権を変更する例
subinacl /subdirectories c:\winnt\profiles\*.* /setowner=administrator

投稿者 augustus : 18:02 | コメント (1) | トラックバック

dsquery

Windows 2003 server からの新しいコマンド。
例えば、ドメインのユーザを列挙したいとき、 dsquery user とすると DN名が出力される。
うちの学校のドメインでは、
dsquery user -desc *2-01-01* |dsget user とやると 2年1組1番の生徒のユーザ情報を検索できる。
これは便利だ。


Microsoft TechNet - Dsquery

投稿者 augustus : 16:14 | コメント (0) | トラックバック

Movable type のマニュアル

ありがたいことに日本語訳があった。

投稿者 augustus : 14:47 | コメント (0) | トラックバック

perl 5.8 での日本語の取扱

perl 5.8 での日本語の取扱について

use utf8;
use encoding "shift_jis";
use Encoding;

これでかなり jperl っぽく使える。

ただし、どこで encode, decode されているかが今ひとつよくわからないでいる。

投稿者 augustus : 14:35 | コメント (1) | トラックバック