アクセスカウンタ

プロフィール

Author:croissant3

カテゴリー

最近の記事

月別アーカイブ(タブ)

最近のコメント

最近のトラックバック

月別アーカイブ

ブロとも申請フォーム

この人とブロともになる

月別アーカイブ

カレンダー

03 | 2014/04 | 05
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 - - -

小さな天気予報


-天気予報コム- -FC2-

全ての記事を表示する

全ての記事を表示する

PCノンセクションの10♪
PCに関することを色々と。っつうか最近VBネタばっかorz
スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
↑参考になったら拍手よろろ
たまごっち パスワード 解析

たまごっちプラスカラー
どうにかパスワードを解析出来ました♪






と書くとどれだけ釣れるか? のテスト。
なんかファンキーやね。。。
↑参考になったら拍手よろろ
FC2 Management

テーマ:ソフトウェア - ジャンル:コンピュータ

BIOSパスワード解除

マザーボードのBIOSで設定されたパスワードを解除する場合、

デスクトップPCならボタン電池を引っこ抜いて放置しておけば
パスワード情報はクリアされたりする訳ですが、

ノートPCの場合は一筋縄でいかないケースもある訳で・・
そういう場合はフリーソフトになっているCMOSPWDってツールで
解除できるそうな。

http://www.cgsecurity.org/wiki/CmosPwd

試したことないですが・・情報までに。。

細かいことは cmospwd でググりましょう。。




因みにHDDパスワード解除(上書き)する場合は atapwd ね。
http://croissant3.blog66.fc2.com/blog-entry-46.html
http://croissant3.blog66.fc2.com/blog-entry-47.html


↑参考になったら拍手よろろ

テーマ:PC不調 - ジャンル:コンピュータ

boot.ini

1台のサーバの中でデュアルブートを組んで
ある時にはxxx,xxx,xxx,xxx というIPアドレスのサーバ、
またある時はyyy.yyy.yyy.yyyというIPアドレスというサーバ、
てな具合に起動するOSを切換える運用をした場合、
Windowsの自動更新で自動リブートされちゃうと
意に反したOSでブートされる時がある・・・・orz

どうしてか?というとデュアルブートの選択画面で
一定時間入力がないとデフォルトのOSを勝手にブートしてしまうから。

ユーザからのOSの選択がない場合、
タイムアウトせずに永遠に選択を待ち続ける方法ってないの?
昔はBOOT.iniでそんな設定出来たような・・・

結論から言うと BOOT.ini のtimeout行のパラメータを "-1" にすれば
ユーザからのOS選択が行われない限り永遠にブートしません。

==========================================================
[boot loader]
timeout=-1
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows .NET Standard Server" /fastdetect
multi(0)disk(1)rdisk(0)partition(2)\WINDOWS="Microsoft Windows XP Professional"
==========================================================

デュアルブート時のOS選択のタイムアウトのデフォルトが30秒だとイライラするから
タイムアウト値を短くする方法はあちこちで紹介されてますが、
逆パターンって余り紹介されてないんですよね。

因みにこの設定ってbootcfgじゃ出来ないらしく、
メモ帳を使って直接boot.iniを編集しなきゃいけないらしいですよ。。

↑参考になったら拍手よろろ

テーマ:ソフトウェア - ジャンル:コンピュータ

VB6.0でEXIF取得(その3)ツール公開

以前、自分が使う為に自作したEXIFを使ったJPEGのリネームソフト、
公開して欲しいというリクエストが時々来るので思い切ってWEBに上げてみました。

ここから

公開するにあたって使用するライブラリの著作権の話もありリネーム機能のみに削ってます。
はっきり言って機能的な所は他のツールの方が賢いです。。

あえて売り文句を出すならば・・・・もし取得できたら
撮影時間にコンマ何秒の値までリネームの要素に入れる事ですかね。
1秒間に何枚も撮影するデジイチの連射の場合、こんなのが良いのかも知れません。

[メイン画面]
メイン

[オプション]
オプション

[確認画面]
確認



↑参考になったら拍手よろろ

テーマ:ソフトウェア - ジャンル:コンピュータ

VB6.0でEXIF取得(その2)

EXIF情報を取得するなら ExifReader.clsの利用が私としてはお勧め。

自宅ではデジカメのJPEGファイルを撮影時間でリネーム、
更にVGAサイズに縮小するツールを作成してWEB用に加工してます。

JpegRenamer


ポイッとファイルを投げ込むだけで加工するのでお気軽極楽です。

↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

VB6.0でEXIF取得(その1)

デジカメで撮影したJPEGには撮影時間やシャッタースピードやら
様々なデータが埋め込まれている。いわゆるEXIF情報というやつ。

.NETのプラットフォームならば比較的簡単にEXIF情報が取り出せるのだけど
VB6.0でEXIF情報を取り扱うにはどうすれば良いのか?という話です。

★★★EXIF情報の取得に関して★★★

(1)Jhead.exeの利用
   海外製のコマンドラインツールにJhead.exeというのがある。
   これをDOS窓から使えばEXIF情報が標準出力されるという寸法。
   Wsh経由でJhead.exe xxx.jpg とでもすればOK。

   http://www.sentex.net/~mwandel/jhead/

(2)ExifReader.clsの利用
   上記Jhead.exeは単に標準出力で垂れ流されるEXIF情報をとっ捕まえる方法ですが、
   海外製クラスライブラリ、ExifReader.clsはJPEGファイルにバイナリアクセスして
   必要なEXIF情報を取得します。関数化されているので結構便利。
   例えば撮影時間を取り出すならこんな感じ。

   Dim ExifObj As New ExifReader
   ExifObj.Load "C:\test.JPG"
   MsgBox ExifObj.Tag(DateTimeOriginal)

   http://sourceforge.net/project/showfiles.php?group_id=56110

   ExifReader.clsはソース配布な為、自分でいくらでも手直しが出来るのが良いです。

(3)シェアウェアの利用
   お金を払ってシェアウェアのライブラリを購入する方法もあり。

★★★EXIF情報の削除に関して★★★

   JPEGに埋め込まれているEXIF情報を手っ取り早く削除するなら
   Jhead.exe のオプションが利用できます。

   prompt> Jhead.exe -du C:\test.JPG

★★★EXIF情報の書き込みに関して★★★

   JPEGファイルを生成する関係上、
   VCを動員してlibjpeg.libをリンクしてdllを作ったりと結構めんどい感じ。
   今のところExif情報の修正をする要望がないので保留。

こんな感じですかね。

↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

TrueImage

げっ。TrueImageって・・・スケジュールバックアップには対応しているけど
スケジュールリストアには対応してないでやんの。orz

PCをデュアルブートにして、予備OSを稼働中に
現用OSを定期的にリストアしようとしてたんだけど・・orz
NetVaultを使うしかないか?
↑参考になったら拍手よろろ

テーマ:ソフトウェア - ジャンル:コンピュータ

フレームつきページの読み取り

WebBrowserに対してDHTMLで操作を行う際、
ページの読み込みが完全に終わるまで待ってから
コチョコチョと操作を行う流れになる。。 

実際にはWebBrowserのDocumentCompleteイベントをトリガーに
コチョコチョ操作を実装する訳で・・・
通常のフレーム分割されていないページなら
DocumentCompleteイベントを1度待てば済む話。


ところがフレーム分割されているページだと
DocumentCompleteイベント、BeforeNavigate2イベントが
非同期に複数パカパカとイベントが上がってくる。
さて全てのドキュメントを読み込むには
どこまで待てば良いのか?というのが今回のテーマ。


結果から話す。

WebBrowserのDocumentCompleteでこんな実装をすれば良い。

'----------------------------------
If pDisp Is WebBrowser.Object then
  '最後の親フレーム
Else
  '子供フレーム
  '読み込み途中なので無視
  Exit Sub
End If

'コチョコチョ処理をここから実装。
  :
  :
'-----------------------------------


ちなみにDocumentCompleteが発生する前に何か処理をしたい場合も一緒。

BeforeNavigate2イベントの中で

'-----------------------------------
If pDisp Is WebBrowser.Object then
  '親フレーム
Else
  '子フレームなので無視
  Exit Sub
End If
'初期化処理などをココに実装
  :
  :
'------------------------------------

解説するとフレームつきページを読み込んだ時の流れはこんな感じ。

BeforeNavigate2(親フレーム) 発生
BeforeNavigate2(子フレーム) 発生
BeforeNavigate2(子フレーム) 発生
BeforeNavigate2(子フレーム) 発生
DocumentComplete(子フレーム) 発生
DocumentComplete(子フレーム) 発生
DocumentComplete(子フレーム) 発生
DocumentComplete(親フレーム) 発生

子は順不同、最初と最後に必ず親フレームのイベントが上がってくる。
この親フレームのイベントを捕まえるには
pDisp Is WebBrowser.Object という条件で
判断が出来るという仕組み。


この様に実装しておくとフレーム分割されたページでも
pDispを使えば最後までドキュメントを読み込んだタイミングを
捕らえることが可能です。


↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

VBでmht保存(おまけ)

ちなみにクラムメディアの問題集はマウスでコピペが出来ないよう
JavaScriptで細工しています。

mht保存したファイルに記載されているJavaScriptの一部、
実際には1行をコメントアウトするだけで
コピペガードは外せます。

私はコピペガードを外した上で
OutLookにHTML形式でペタペタ貼り付けて
自分だけの問題集を作りました。
↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

VBでmht保存(その2)

とりあえずこんな感じで作ってみました。

CRAM



WebBrowserでWebを表示、保存ボタンを押すと
「Webページを保存」画面で
ファイル名、保存形式を自動入力し
mht保存を行います。

もうちょい時間があれば1問1問自分でWEBを巡回して
勝手にmht保存する形にしたかったのですが
そこまで作っている時間がなかった。orz


今回もmht保存する関数のソースを載せてみます。


Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Const LB_SETTOPINDEX = &H197
Private Const GW_HWNDNEXT = 2
Private Const GW_CHILD = 5
Private Const WM_ACTIVATE = &H6
Private Const WM_CLOSE = &H10
Private Const WM_COMMAND = &H111
Private Const WM_COPY = &H301
Private Const WM_GETTEXT = &HD
Private Const WM_GETTEXTLENGTH = &HE
Private Const WM_PASTE = &H302
Private Const WM_QUIT = &H12
Private Const WM_SETTEXT = &HC
Private Const WM_CLEAR = &H303
Private Const EM_SETSEL = &HB1
Private Const EM_REPLACESEL = &HC2
Private Const BN_CLICKED = 0
Private Const BM_CLICK = &HF5
Private Const CB_SETCURSEL = &H14E



Public Sub SaveAs_Input()

'名前を付けて保存ダイアログを検索、
'ファイル名を入力し、mht形式をSendKeysで選択、
'保存ボタンを押すだけ


Const WINDOW_NAME As String = "Web ページの保存"
Const BUTTON_NAME As String = "保存(&S)"

Dim hwnd As Long    '親   Dialog
Dim hChild As Long   '子供  ComboBoxEx32
Dim hhChild As Long   '孫   ComboBox
Dim hhhChild As Long  'ひ孫  Edit


'名前を付けて保存ウィンドウの検索
hwnd = FindWindow(vbNullString, WINDOW_NAME)


'ファイル名入力用のエディットボックスの検索
'ダイアログ-->ComboBoxEx32-->ComboBox-->Editの
'3段になっていることに注意。


If hwnd = 0 Then
  MsgBox "WEBページの保存画面が見つかりません"
  Exit Sub
End If

'エディットボックスの検索
hChild = SearchHandle(hwnd, "ComboBoxEx32")
If hChild = 0 Then
  MsgBox "WEBページの保存:ComboBoxEx32 が見つかりません"
  Exit Sub
End If

hhChild = SearchHandle(hChild, "ComboBox")
If hhChild = 0 Then
  MsgBox "WEBページの保存:ComboBox が見つかりません"
  Exit Sub
End If

hhhChild = SearchHandle(hhChild, "Edit")
If hhhChild = 0 Then
  MsgBox "WEBページの保存:Edit が見つかりません"
  Exit Sub
End If


'---- 保存ファイル名の入力 ----
'見つかったEditボックス(hhhChild)に SendMessage

Call SetForegroundWindow(hwnd)
SendMessage hwnd, WM_ACTIVATE, 1, ByVal 0&
SendMessage hhhChild, WM_ACTIVATE, 1, ByVal 0&
SendMessage hhhChild, WM_CLEAR, 0, ByVal 0&
SendMessage hhhChild, WM_SETTEXT, 0, ByVal "C: emp est.mht"


'---- コンボボックスからmhtを指定する ----
Dim tmpStr As String
Dim tmpCls As String
Dim tmpl As Long
Dim combownd As Long
Dim buf As String * 1024

'とりあえずダイアログの中の子供を一つ取得
combownd = GetWindow(hwnd, GW_CHILD)

Do While combownd <> 0
  '子供のクラス名を取得
  tmpCls = String(255, Chr(0))
  tmpl = GetClassName(combownd, tmpCls, Len(tmpCls))
  tmpStr = Left(tmpCls, tmpl)

  'クラス名がComboBoxならコンボボックスの中の文字列を取得する
  If tmpStr = "ComboBox" Then
    buf = String(1024, Chr(0))
    SendMessage combownd, WM_GETTEXT, 1024, ByVal buf

    Dim a As String
    a = Left(buf, InStr(1, buf, Chr(0), vbTextCompare) - 1)

    Select Case a
      Case "Web ページ、完全 (*.htm;*.html)"
          '---- TAB,DOWN,DOWN,TAB ----
          Call SetForegroundWindow(hwnd)
          SendMessage combownd, WM_ACTIVATE, 1, ByVal 0&
          DoEvents

          Call SetForegroundWindow(hwnd)
          SendMessage combownd, WM_ACTIVATE, 1, ByVal 0&
          SendKeys "{TAB}", True
          DoEvents
          Sleep 300

          Call SetForegroundWindow(hwnd)
          SendMessage combownd, WM_ACTIVATE, 1, ByVal 0&
          SendKeys "{DOWN}", True
          DoEvents
          Sleep 300

          Call SetForegroundWindow(hwnd)
          SendMessage combownd, WM_ACTIVATE, 1, ByVal 0&
          SendKeys "{DOWN}", True
          DoEvents
          Sleep 300

          Call SetForegroundWindow(hwnd)
          SendMessage combownd, WM_ACTIVATE, 1, ByVal 0&
          SendKeys "{TAB}", True
          DoEvents
          Sleep 300

          Exit Do

      Case "Web アーカイブ、単一のファイル (*.mht)"
          '---- TAB,TAB ----
          Call SetForegroundWindow(hwnd)
          SendMessage combownd, WM_ACTIVATE, 1, ByVal 0&
          DoEvents

          Call SetForegroundWindow(hwnd)
          SendMessage combownd, WM_ACTIVATE, 1, ByVal 0&
          SendKeys "{TAB}", True
          DoEvents
          Sleep 300

          Call SetForegroundWindow(hwnd)
          SendMessage combownd, WM_ACTIVATE, 1, ByVal 0&
          SendKeys "{TAB}", True
          DoEvents
          Sleep 300

          Exit Do

      Case "Web ページ、HTML のみ (*.htm;*.html)"
          '---- TAB,DOWN,UP,TAB
          Call SetForegroundWindow(hwnd)
          SendMessage combownd, WM_ACTIVATE, 1, ByVal 0&
          DoEvents

          Call SetForegroundWindow(hwnd)
          SendMessage combownd, WM_ACTIVATE, 1, ByVal 0&
          SendKeys "{TAB}", True
          DoEvents
          Sleep 300

          Call SetForegroundWindow(hwnd)
          SendMessage combownd, WM_ACTIVATE, 1, ByVal 0&
          SendKeys "{DOWN}", True
          DoEvents
          Sleep 300

          Call SetForegroundWindow(hwnd)
          SendMessage combownd, WM_ACTIVATE, 1, ByVal 0&
          SendKeys "{UP}", True
          DoEvents
          Sleep 300

          Call SetForegroundWindow(hwnd)
          SendMessage combownd, WM_ACTIVATE, 1, ByVal 0&
          SendKeys "{TAB}", True
          DoEvents
          Sleep 300

          Exit Do

      Case "テキスト ファイル (*.txt)"
          '---- TAB DOWN,UP,UP,TAB
          'MsgBox "txt"
          Call SetForegroundWindow(hwnd)
          SendMessage combownd, WM_ACTIVATE, 1, ByVal 0&
          DoEvents

          Call SetForegroundWindow(hwnd)
          SendMessage combownd, WM_ACTIVATE, 1, ByVal 0&
          SendKeys "{TAB}", True
          DoEvents
          Sleep 300

          Call SetForegroundWindow(hwnd)
          SendMessage combownd, WM_ACTIVATE, 1, ByVal 0&
          SendKeys "{DOWN}", True
          DoEvents
          Sleep 300

          Call SetForegroundWindow(hwnd)
          SendMessage combownd, WM_ACTIVATE, 1, ByVal 0&
          SendKeys "{UP}", True
          DoEvents
          Sleep 300

          Call SetForegroundWindow(hwnd)
          SendMessage combownd, WM_ACTIVATE, 1, ByVal 0&
          SendKeys "{UP}", True
          DoEvents
          Sleep 300

          Call SetForegroundWindow(hwnd)
          SendMessage combownd, WM_ACTIVATE, 1, ByVal 0&
          SendKeys "{TAB}", True
          DoEvents
          Sleep 300

          Exit Do

    End Select
  End If
  combownd = GetWindow(combownd, GW_HWNDNEXT)
Loop

'---- 保存ボタンを検索してクリック
hChild = FindWindowEx(hwnd, 0, vbNullString, BUTTON_NAME)
If hChild = 0 Then
  MsgBox "WEBページの保存:保存ボタンが見つかりません"
  Exit Sub
End If
Call SetForegroundWindow(hwnd)
SendMessage hwnd, WM_ACTIVATE, 1, ByVal 0&
SendMessage hChild, WM_ACTIVATE, 1, ByVal 0&
SendMessage hChild, BM_CLICK, 0, ByVal 0&

End Sub





Public Function SearchHandle(hwnd As Long, ClsName As String) As Long
'hwndウィンドウから指定したクラスの部品を検索、
'ウィンドウハンドルを返すだけ


SearchHandle = 0

Dim hChild As Long

'とりあえずダイアログ画面の子供を1個取得
hChild = GetWindow(hwnd, GW_CHILD)

Dim tmpStr As String
Dim tmpCls As String
Dim tmpl As Long

Do While hChild <> 0
'クラス名を取得
  tmpCls = String(255, Chr(0))
  tmpl = GetClassName(hChild, tmpCls, Len(tmpCls))
  tmpStr = Left(tmpCls, tmpl)
  If tmpStr = ClsName Then
    'MsgBox ClsName & "見つけた!"
    SearchHandle = hChild
    Exit Function
  End If
  hChild = GetWindow(hChild, GW_HWNDNEXT)
Loop

'MsgBox ClsName & "みつからんかった"

End Function

↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

VBでmht保存(その1)

先日資格取得の為にクラムメディア(www.crammedia.com)の問題集を購入。
WEBで表示される問題と解答を保存したいと思い
ちまちまとローカルのHDDにmht形式で保存していたのだが、
結構めんどい。

フリーソフトの「Webよ止まれ ?EternalWeb?」というツールの使用もあるがファイル名の指定に困ってしまう。orz

仕方がないのでまたいつもの様に家内制手工業(自作)です。



とりあえずmht保存の方法を調べてみる

(1) CDO.Message オブジェクトで直接URLを指定して保存

  Set CDO=WScript.CreateObject("CDO.Message")
  Const adSaveCreateOverWrite = 2
  CDO.CreateMHTMLBody "http://www.yahoo.co.jp"
  CDO.GetStream.SaveToFile "C:\test.mht",adSaveCreateOverWrite

  この方法が一番簡単。
  CreateMHTLBodyの引数でユーザ、パスワードの指定は可能。
  しかしこの単純な認証作業で突破できないサイトは結構あるため
  クラムメディアでは試してないがおそらくこの方法は×。orz
  


(2) 「名前を付けて保存」を利用

  VBの画面にWebBrowserコントロールを貼り付けて、ページを表示して
  Me.WebBrowser.ExecWB を叩けば保存が出来る。

  Me.WebBrowserMain.ExecWB OLECMDID_SAVEAS, OLECMDEXECOPT_PROMPTUSER
  ※引数は適当に弄って下さい。

  しかしExecWBでは画像付きのhtmlファイルで保存することは出来たが
  mhtで保存出来ない様子。orz



(3) (2)を改良、ExecWBを利用して「名前を付けて保存」ダイアログを表示、
  入力部分はSendMessageなどで自動化。

  この方法だと
  保存ファイル名の入力はSendMessageでWM_SETTEXTを飛ばせばOK!

  コンボボックスでファイル形式にmhtを指定する事は
  SendMessageで出来たが・・mht形式で保存されず。orz
  コンボボックスを変更しただけではリストビューまで変更されないせいか?

  結局コンボボックスの変更を
  原始的にSendKeysを使ったところうまく出来ました。


保存方法についてはこれでOK。 ↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

HDDのパスワード解除(その2)

色々調べた所、通常ではアクセスできない領域(サービスエリア)に
HDDのシリアル番号やらベンダー情報と一緒にユーザパスワードやら
マスターパスワードが格納されているらしい。

いやらしい事に通常ではアクセスできない領域、
物理フォーマットも効かない領域なのでお手上げな状態。orz

しかし探せばあるもので、通常ではアクセスできないサービスエリアにアクセスして
パスワード情報を書き換えるツールを見つけました。(atapwd.exe)



#atapwd.zipでググれば見つかります。(私はVer1.2を利用しました)
#なければ UltimateBootCD を探せ♪

使い方はFDからDOSを起動して、atapwd.exe を実行する様子。

DOS起動のFD、FD、FD、FD、・・ダンボールからFDを発掘するのも面倒なので
www.allbootdisks.com を利用してDOS起動用のFDを作成。
出来上がったFDから不要なツールを消して atapwd.exe をコピー。

FDからブート、DOSからatapwd.exeを実行し
目的のHDDに対してマスターパスワード、ユーザパスワードを再設定、
んでリブート後、

マザーのBIOSで設定したパスワードを教えてあげたら
通常通り起動できるようになりました(^^;

#再設定でなくマスターパスワード自体をクリアできれば
#完璧なのですが・・とりあえず起動できたのでOKとします。(^^;
↑参考になったら拍手よろろ

テーマ:PC不調 - ジャンル:コンピュータ

HDDのパスワード解除(その1)

PCをセットアップしようとした所、
内蔵していたHDDにパスワードが設定してありました。orz

そのPC自体が正常なら問題なく立ち上がるのですが
マザーボードが電池切れを起こしていた為
マザーボードが記憶していたHDDパスワードが飛んでいる様子。orz

PCを起動しようとしてもマザーボードのBIOSレベルで
「パスワードが一致しません」と蹴られてしまい
HDDを認識できない始末。orz

誰がパスワードを設定したのか?パスワードは?と
周りに聞いても全く解らない。

うーむ困った。orz

↑参考になったら拍手よろろ

テーマ:PC不調 - ジャンル:コンピュータ

VBでウィルススキャン(その2)

とりあえずウィルススキャンをかける方法について。

(1) 起動
  スキャンをかけるパスを引数に scan32.exe を叩けばよい。
  scan32.exe を叩くにはWSHを利用。

(2) 結果判定
  ウィルススキャンが実行中か、スキャン終了かは
  "閉じる(&F)"ボタンがEnableかDisableかを判断すれば良い。

  結果については・・・ステータスバーの値を読めば良い。
  ステータスバーを見れば"ウィルスは見つかりませんでした"とか
  メッセージが書いてあるので・・・

  とりあえずWSHでコマンドを叩くと同時にタイマーをセットして
  定期的にウィルススキャン画面の部品("閉じる(&F)")ボタンを
  検索、ボタンがDisableになっていたら
  結果を取得すれば良いって寸法。

実際にやってみたらひとつ問題が。(^^;
ステータスバーの文字の取得って面倒臭いのね。(知らんかった)


ステータスバーの場合って共有メモリを作ってウィルススキャンに対してSendMessageしてステータスバーの値を書き込んでもらって
ReadProcessMemoryで読み込んでなんたらかんたら・・・orz

昔からよくある常套手段らしいけど今そこまで調べてやっている時間もないし、
画面上にウィルススキャンの結果を確証代わり出す必要があったので、

ツール上にPictureBoxを用意、検査結果の画面をキャプチャして
PictureBoxに貼り付ける事でお茶を濁しました。(^^;



んで今回は珍しくソースを晒してみます。
APIを使って色々とやっているしサンプル代わりに
丁度良いので。。。。



'====== APIの定義 ========

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function IsIconic Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function ShowWindowAsync Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long

Private Declare Function IsWindowEnabled Lib "user32" (ByVal hWnd As Long) As Long
Private Const SW_RESTORE = 9
Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Const VK_SNAPSHOT = &H2C 'PrintScreen キー(P1051)
Private Const VK_LMENU = &HA4 'Altキー
Private Const KEYEVENTF_KEYUP = &H2 'キーはアップ状態
Private Const KEYEVENTF_EXTENDEDKEY = &H1 'スキャンコードは拡張コード

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const BM_CLICK = &HF5
Private Const WM_ACTIVATE = &H6


'===== タイマでウィルススキャン画面を監視する関数 ======

Public Function FindVirusCheckResult() As Boolean

FindVirusCheckResult = False

'ウィルススキャン画面の取得
Dim WINDOW_NAME As String
WINDOW_NAME = "VirusScan オンデマンド スキャンの状況 - " & UserData.MyCDDrive
'-- UserData.MyCDDrive ってのはウィルススキャンを行うパスの事
Const BUTTON_NAME As String = "閉じる(&F)"

Dim hWnd As Long
Dim hChild As Long
Dim ret As Long
Dim PicData As Picture

'ウィルススキャン画面の検索
hWnd = FindWindow(vbNullString, WINDOW_NAME)
If hWnd = 0 Then
  '画面が見つからない
  Exit Function
End If

'閉じるボタン検索
hChild = FindWindowEx(hWnd, 0, vbNullString, BUTTON_NAME)
If hChild = 0 Then
  '[閉じる] ボタンが見つからない
  Exit Function
End If

'ボタン状態を取得
ret = IsWindowEnabled(hChild)
If ret <> 1 Then
  '実行中あるいは一時停止中(閉じるボタンはDisable)
  Exit Function
End If

'タイマ停止
FormMain.Timer_ResultChecker.Enabled = False


'ウィルススキャン画面を最前面に持ってくるために
If IsIconic(hWnd) Then
  'もしアイコン化されていたら元に戻す
  Call ShowWindowAsync(hWnd, SW_RESTORE)
  DoEvents
  Sleep 3000
End If

'ウィルススキャン画面を最前面に移動
Call SetForegroundWindow(hWnd)


'ウィルススキャン画面をActiveにして
SendMessage hChild, WM_ACTIVATE, 1, ByVal 0&

'クリップボードをクリアして
Clipboard.Clear

'[ALT]+[Print Screen]でキャプチャして
Call keybd_event(VK_LMENU, &H56, KEYEVENTF_EXTENDEDKEY Or 0, 0)
Call keybd_event(VK_SNAPSHOT, &H79, KEYEVENTF_EXTENDEDKEY Or 0, 0)
Call keybd_event(VK_SNAPSHOT, &H79, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
Call keybd_event(VK_LMENU, &H56, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)

'一度Windowsに制御を戻して
DoEvents

'クリップボード経由で取り込む
If Clipboard.GetFormat(vbCFBitmap) Then
  FormMain.Picture_Result.AutoRedraw = True
  Set FormMain.Picture_Result.Picture = Clipboard.GetData
  FormMain.Picture_Result.Refresh
  FormMain.Picture_Result.AutoRedraw = False
End If

'最後にウィルススキャンの画面を閉じる。というか閉じるボタンを押す
PostMessage hChild, WM_ACTIVATE, 1, ByVal 0&
PostMessage hChild, BM_CLICK, 0, ByVal 0&

FindVirusCheckResult = True

End Function

ちなみにウィルススキャンのエンジンや定義ファイルのバージョンは
レジストリを検索したら書いてあったのでそれを取得しました。


本来ならウィルススキャンを行うための
OSレベルのAPIがありそうな気がするのだけど・・・
よくわからないorz



↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

VBでウィルススキャン(その1)

マカフィーウィルススキャンを VB (VB6.0) から実行する方法を考ていた。


色々調べてみた所どうやら検査したいディレクトリを引数に
C:\Program Files\Network Associates\VirusScanにあるscan32.exeを
叩いてやればOKって事がわかった。

要はDOS上から
prompt >scan32.exe C:\temp
てな感じ。


でもこのscan32.exeってのはGUIプログラムな訳
起動するとオンデマンドスキャンのダイアログが出てくるのよね。

VBから実行となるとウィルススキャン自体の終了を判定をしなければならない。するってぇと・・画面のステータスバーの文字列を監視すればいい?もしくはウィルススキャン画面の中断ボタンがEnableかDisableかを見る方法もあり?

んで更にウィルススキャンが終了しても"閉じる"ボタンを
マウスでクリックしないと処理が完全に終わらない。

なんか色々あるけどとりあえず WSHでscan32.exe を起動して
ウィンドウ監視してみますか。。。。
FindWindowでオンデマンドスキャンのウィンドウを
とっ捕まえて、ウィンドウ内の部品のハンドルを
FindWindowExでとっ捕まえれなんとかなるでしょう。


とりあえずやってみますか。
↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

VirtualComPort

最近私用でシリアル通信のプログラムを製作中。。。。

シリアルっつうても最近のPCにはくっついてなかったりする。orz
そんな事情も考えてUSB接続のUSB-Serialコンバータという製品が
色々なメーカから発売されているわけで・・・
試しにノートPCのUSBポート2つにそれぞれコンバータを接続して
クロスケーブルでつないで通信させてみた。

はっきり言って邪魔くさい。orz


なんとかならんか?とソフトを漁っていたら
ベクターでVirtualComPortなるソフトを見つけた。(^^;

https://www.ise-ics.co.jp/ics/system/virtualcomportcontents.htm

自分のPC内に仮想COMポートを2個作り出してクロスケーブルで
接続した(ような)環境を作ってくれるソフト。
しかも他のPCとネットワーク接続させて
Serial Over TCP/IP を実現させてくれるそうな。(^^;

試しに使ってみたら確かにつながった。他のPCとのネットワーク接続もOK。

しかし・・・体験版は5分間しか使えない。orz
5分じゃソフトの評価もできんよ。

まったく製造元は何を考えているのやら・・・・

せめて5?6時間使える方法はないか?と色々試行錯誤してみた。 ↑参考になったら拍手よろろ
■ 続きを読む。 ■

テーマ:プログラミング - ジャンル:コンピュータ

共通関数の移植作業(その1)

普段自分がコーディングする際に一緒に組み込んでいる
自前の関数をVB.NETに移植し始めました。

しっかし・・・VB.NET になった途端こんなにも変わるとは(^^;
型を把握するだけでも大変。orz

まぁ・VB.NETに慣れるトレーニングには良いですな。(^^;



↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

VB.NETお試し

先日 Visual Studio 2005 を入手したので早速インストールし少し触ってみた。


おぉ。サービスプログラムもウィザードから作れる♪
おぉ。コンソールプログラムでタイマークラスが使える♪



って事でサービス稼働中にタイマーでファイルに文字列を書き込む
超簡単なサービスプログラム(兼コンソールプログラム)を作ってみる。

・・え?FileSystemObject って今回どうなんの?
・・TextStreamObjectを作って書き込むんだけどな・・
・・え?Timerクラスって言っても記載は?
・・などとVB6とは全然違うやり方に頭から煙を出しながら

・・まさに1行1行調べながらのコーディング。orz


とりあえずコンパイルエラーが取れたので動かしてみる。

あ・エラーだ。何々?サービスインストーラが必要?
新たにサービスインストーラを追加して適当にプロパティを埋めて再ビルド。

えっと・・・InstallUtil TestServiceProg.exe

あ・サービスが登録できた。(笑)
サービス開始したら定期的にファイル出力してやんの。orz


今までVB6で散々悩んでいたのは何なの・・orz

↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

VB6でのサービスアプリケーションあれこれ

とりあえずVB6でのWindowsサービス(NTサービス)の実現方法を
色々調べてみました。

(1) NTSVC.OCX
  海外にソースとビルド済みのOCX、ヘルプなどが
  一式パックになって転がっています。(URL忘れた)

(2) リソースキット(instsrv.exe srvany.exe)
  NTだけでなくWindows 2003 Server のリソースキットにも含まれています。

  http://tooljp.com/qa/6E78397646A8C77949256A970045BA6C.html

(3) sexe
  フリーソフト。VECTORなどにも転がっています。

どれも試してみたのですが完全なCUIプログラムでないと
Windows 2003 Server では無理っぽいです。
XPだと動いたりするんですけどね。

CUIプログラムで作ろうとするとタイマーコントロールが使えない。orz
無限ループ作って無理やりやるとCPUの使用率がすんごい事に。orz
なんか良い方法はないものか・・・orz
↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

VB6でのWindowsサービス(NTサービス)

VB6でサービスアプリケーションを作りたいと前々から思っていましたが、
"NTSVC.OCX" というActiveXで実現出来る様子。

ただこのNTSVC.OCXってマイクロソフトが
このOCXのソース(VC製)を公開していて
既にサポート対象外だそうな。orz


どこまで使えるか判らないけどちょっと試してみますか。(^^;


↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

Windowsパスワード解析

先日あるPCのメンテをする際、Administrator権限をもってないから
メンテが出来ないって事で以前聞いたツールを使ってみた。

前々からこういうツールがあるって事は知っていたのですが、
いい機会なんでググってISOイメージを落としてCDブート。
約20分程度でAdministratorのパスワードが表示されました。(^^;

おかげさまでメンテは無事出来たわけですが
悪用したら怖いですねぇ。(^^;
↑参考になったら拍手よろろ

テーマ:フリーソフト - ジャンル:コンピュータ

リモートシャットダウン(UPS管理)その4

具体的な処理毎の実現方法について。

(1)UPS情報の取得処理
   →WMI を使ってバッテリー稼動可能な時間を取得。
(2)リモートシャットダウン処理
   →WSH を使って "shutdown.exe" を実行。
(3)自分のホスト名の取得
   →WMI を使って取得。今回のサーバってアクティブスタンバイの冗長サーバなんで
    自分がアクティブなのかスタンバイなのかを判断する必要がある。
(4)リモートシャットダウンのコマンド発行前に対象PCが起動しているかをチェック
   →WSH を使ってpingを実行。実行結果のログに"Reply" の文字列があれば起動中とみなす。

こんな感じですかね。

とりあえずVBScriptを組んでタスクスケジューラに突っ込んで
UPSの電源ケーブルを抜いた所、UPSの電池が切れる前に全部のPCが
自動シャットダウンしてくれました。うまく動いている様子です。

動いてくれたのは良いけど・・なんか恥ずかしい作り。
クールにサービスプログラムで実装したひ。
やっぱ.NETや2005っすかね。orz


↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

リモートシャットダウン(UPS管理)その3

てな訳で仕切り直し。改めて考えてみる。
とりあえずリモートシャットダウンのコマンドは"shutdown.exe"で決まり。
問題のトリガーは・・・・自分で検出するしかないか。orz
[UPSの残量の取得]
確かWMIの解説サイトにバッテリー情報の取り出し方法が書いてあったはず。
ためしにサンプルを基にテストプログラムを作ってみたら・・・
UPS情報が取れるじゃん。良いねぇ♪
更にサンプルで紹介されていたプロパティ以外に色々漁ってみたら
バッテリー稼動可能な時間や充電率まで取得が出来た。かんぺき。
これなら勝てる♪(by尾崎)

[何で作る?]
今回はXPでなくWindows 2003 Serverだから
フォームレスの常駐型のVBプログラムは使えないorz
なんとかの一つ覚えだけど・・・またタスクスケジューラで
定期的に監視する形にしますか。
UPSのバッテリー残量、シャットダウンコマンドの発行、
などなど考えたら VBScriptでも十分やね。

ってな訳で
「バッテリー残量をチェック、バッテリー稼動が可能な時間が15分以下だったら
リモートシャットダウンコマンドを発行するスクリプト」を
定期的にタスクスケジューラで動かす形に決まり。

タスクスケジューラのお世話にならず
サービスプログラムにしたいなぁ。orz
↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

リモートシャットダウン(UPS管理)その2

とりあえず色々ググってみました。

[リモートシャットダウン方法]
WindowsXP, Windows 2003 Server には
リモートシャットダウンをするためのDOSコマンドが標準であるらしい。
"shutdown.exe" うわぁ。べたべたな名前。
ためしにDOS窓から叩いてみた。あ・動いた。完璧じゃん。

[リモートシャットダウンのトリガー]
今回のUPSにはAPC社のPowerChuteって電源管理ソフトがついている。
電圧低下の検出と自動シャットダウンはこいつが行うわけだけど、
自動シャットダウンする前に好きなコマンドを叩くインターフェースが用意されてるじゃん。
ここにリモートシャットダウンのコマンドを埋め込めばOK?
思ったより簡単♪(^^;

[早速テスト]
ってな訳でリモートシャットダウン処理をVBScriptにして早速組み込んでみた。
あれ?動かない。どうして火が入らないんだ?
げ・・・・UPSに添付されているPowerChuteは機能限定のBasic版。
3万払ってDeluxe版を購入しないと自動シャットダウン前に
指定したコマンドは叩けないらしい。やられた。。orz

別のトリガー方法を考えないとあかんです。orz


↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

リモートシャットダウン(UPS管理)その1

今年の夏WindowsサーバにやっとAPC社のUPS(Smart-UPS 750JB)をくっつけた。
そしたら最近サーバがもう一台増えちまった。でもUPSは増えてない。orz

UPSって電源ケーブルとは別にUSBやシリアルポートでも繋いでおいて
電圧低下をそのケーブル経由で検出、バッテリー残量がなくなる前に
PCが自分自身をシャットダウン出来るようにしているのよ。

でもUPSの(PCと接続する)ポートって通常1個なのよね。

1台のUPSに複数PCの電源を繋いだ場合、(瞬断レベルの電圧低下なら問題ないけど)
長時間の停電などの場合自動シャットダウンできるのは1台だけ。orz
他のPCは電圧低下を認識できないからUPSの電池が切れたらアウト。(UPSの意味がない)
何とか他のPCを救う方法はないか?と考えてみた。。。。

電圧低下を検出したPCが他のPCをリモートシャットダウンすればいいじゃん。(^^;

てな訳でリモートシャットダウンの方法と
リモートシャットダウンのトリガーについて調べ始めました。


↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

これdo台 MASTER

せっかくだからもう1件。これも重宝してます。(^^;
これdo台MASTER : http://www.century.co.jp/products/suto/kd2535ma.html
HDDのディプリケータとしてよく使います。
ソフトで行うならパーティションマジックなどもありますが、
PCなしで直接HDDを2台繋いでコピーが取れるのはGood!!

ちなみに対応するHDDはIDE/SATAの3.5/2.5インチ。(完璧です)

HDD2台を繋いでPCからUSB/FireWire接続の外付けHDDとして使ってもOK。
PCを使わず単体でHDDディプリケータとして使ってもOK。
ちなみに今日はHDDを完全消去するのに使いました。

値段は少々高いですが、これを一度持つと手放せなくなりますよ。(^^;
↑参考になったら拍手よろろ

テーマ:便利ツール - ジャンル:コンピュータ

True Image

最近職場でAcronis社のTrue Imageというバックアップツールを使っています。
http://www.proton.co.jp/products/acronis-trueimage-9/
用途としてはOS自体のバックアップとリストア。
評価用機材(PC)で色々と検証作業を行っている訳ですが、RedHatを突っ込んだり、Windows2003Serverを突っ込んだりと日によってOSがコロコロ変わるので、セットアップ済みのOSイメージをバックアップしておいて、好きな時に好きなOSをリストアして作業してます。

通常私はTrue ImageをCDブートさせて外付けHDDやLAN上のHDDにバックアップイメージを保存したり読み出したりする訳ですが、CDブートというとHDDデバイスの認識率が命。

昨今のPCだと内蔵HDDがRAIDを組んでいたりするわけですが、結構このソフトはHDDデバイスの認識率が良いです。XPが自動認識しない内蔵のRAID-HDDどころかFiberChannel接続のDiskArrayまでも認識してくれます。(^^;
なんでOSをコロコロ変える人、環境構築をガシガシやっている人にはお勧めです。値段も安いし。
↑参考になったら拍手よろろ

テーマ:便利ツール - ジャンル:コンピュータ

カテゴリ追加

新たにカテゴリに「PCメンテ」を追加。 ↑参考になったら拍手よろろ

テーマ:雑記 - ジャンル:日記

Windowsユーザ一括登録ツール(その2)

一応こんなのが出来ました。
エクセルの中のデータを読み出してaddusersコマンドと
net share コマンドで一括登録します。

MakeAccountTool

これでこんなのが登録できます。
(1) ユーザ
  ユーザ名、説明、初期パスワード、各種チェックボックスの設定など
(2) グループ
  グループ名、属するユーザなど
(3) (1),(2)を使った共有フォルダのアクセス権


こんなのはエクセルのマクロで作っちまうのが
簡単かと思うのですが・・
私はエクセルのマクロは知らないんです。orz



[2006.09.14追記]
よくこの記事を検索して飛んでくる人が多いので補足。

巷じゃActiveDirectoryを使った方法がよく紹介されてます。
今回のサーバはActiveDirectoryは使わずに
ローカルユーザ、ローカルグループでやってるんで
それに合わせた方法になってます。

あとaddusers.exe でユーザ、グループ情報を一括登録する際、
addusers.exe に読ませるテキストファイルはUTF-16じゃないと文字化けします。(^^;
FileSystemObjectでOpenTestFileする際はUNICODE指定をしてください。

↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

Windowsユーザ一括登録ツール(その1)

先日Windowsサーバのセットアップの際に行うユーザ登録処理を
ツール使って一括登録出来ないか?と相談された。

色々ググってみた所、Windows2000サーバ用リソースキットに含まれている
addusers.exe を使えばテキストファイルに定義したユーザ情報を
インポートしてくれるそうな。。。。
そのほか共有フォルダの設定云々もnet share コマンドで一括登録できるらしい。

実現方法はとりあえず解った。

どうやってツール化しようか。
ユーザ情報、所属グループ、共有フォルダのパーミッションなどを入力した
EXCELのファイルを用意させておいて・・・・
そのEXCELの情報を読み出して、
VBからユーザ、グループ、共有フォルダの登録をする形にしますか。。。。

面白そうなネタだけど
この手のツールって転がってそう。。。(^^;
↑参考になったら拍手よろろ

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

メールフォーム

名前:
メール:
件名:
本文:



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。