use strict; use Win32::OLE; # datetime型のデータが文字列で取得できる。 use Win32::OLE::variant; # 指定タイプライブラリのコンスタントが参照可能 use Win32::OLE::Const 'Microsoft ActiveX Data Objects 2.0 Library'; # エラー時に本処理を中止し、Perlがエラーメッセージを出力し、本プロセスが終了する。 Win32::OLE->Option(Warn => 3); # DBサーバー名とDB名設定 my $server = 'np:\\\\.\pipe\mssql$microsoft##ssee\sql\query'; my $db = 'SUSDB'; # WINDOWS 認証設定 my $connStr = "Provider=sqloledb;". "Data Source=$server;". "Initial Catalog=$db;". "Integrated Security=SSPI;"; print "$connStr\n"; # DB接続 my $objDB = Win32::OLE->new("ADODB.Connection"); $objDB->Open($connStr); $objDB->{Errors}->{Count} and die "cannot connect '$connStr'"; # テーブル有無チェック my $rs = Win32::OLE->new("ADODB.Recordset"); $rs->Open("Select count(*) existance From sysobjects Where NAME = 'tbUpdate'", $objDB); if ($rs->{existance}->{Value} == 0) { # テーブル無しの場合 die "Table is not find"; } $rs->Close(); # データ読み出し $rs = Win32::OLE->new("ADODB.Recordset"); $rs->{CursorLocation} = adUseClient; $rs->Open(qq{ SET NOCOUNT ON; SELECT RevisionID, COUNT(SupersededUpdateID) AS counter INTO #X1 FROM SUSDB.dbo.tbRevisionSupersedesUpdate GROUP BY RevisionID; SELECT COUNT(RevisionID) AS counter, SupersededUpdateID INTO #Y1 FROM SUSDB.dbo.tbRevisionSupersedesUpdate GROUP BY SupersededUpdateID; SELECT B.updateID, B.LegacyName, A.Title, A.Description, D.Title AS Category, F.KBArticleID, G.SecurityBulletinID, H.MoreInfoURL, A.RevisionID, #X1.counter AS SupersedeUpdateCount, #Y1.counter AS SupersededUpdateCount FROM SUSDB.dbo.tbPreComputedLocalizedProperty A INNER JOIN SUSDB.dbo.tbUpdate B ON A.UpdateID = B.UpdateID INNER JOIN SUSDB.dbo.tbRevisionInCategory C ON A.RevisionID = C.RevisionID INNER JOIN SUSDB.dbo.tbPrecomputedCategoryLocalizedProperty D ON C.CategoryID = D.CategoryID INNER JOIN SUSDB.dbo.tbRevision E on E.localUpdateID = B.localUpdateID LEFT JOIN SUSDB.dbo.tbKBArticleForRevision F ON F.RevisionID = E.RevisionID LEFT JOIN SUSDB.dbo.tbSecurityBulletinForRevision G ON G.RevisionID = E.RevisionID INNER JOIN SUSDB.dbo.tbMoreInfoURLForRevision H ON H.RevisionID = E.RevisionID LEFT JOIN #X1 ON A.RevisionID = #X1.RevisionID LEFT JOIN #Y1 ON B.updateID = #Y1.SupersededUpdateID WHERE A.ShortLanguage = 'en' AND D.CategoryType = 'UpdateClassification' AND D.ShortLanguage = 'en' AND E.islatestRevision = 'True' AND H.ShortLanguage = 'en' ORDER BY G.SecurityBulletinID; }, $objDB); while(!$rs->EOF and $rs->{RecordCount} != 0){ print join ',', map {(s/"/""/g or /[\r\n,]/) ? qq("$_") : $_} ( $rs->{Fields}->{UpdateID}->{Value}, $rs->{Fields}->{Title}->{Value} ); print "\n"; $rs->MoveNext(); } $rs->Close(); # DB切断 $objDB->Close();
-
3月からWindows Updateがうまく行かない。かなり以前の職場でWSUSといろいろと格闘したので、Windows Updateの扱いはよく知っているつもりではあるが、簡単には治らなかった。 次の累積パッチで治るかなと思って放置していたが、4月分もあたっていないし、最悪再イ...
-
AndroidスマホとカーナビをBluetooth接続をしている。 Google Play Musicではカーナビに楽曲情報が表示されるが、YouTube Musicでは表示されない。曲の頭出しや停止・再生はカーナビ側から操作ができる。 結論から言うと、AVRCPのバージョン...
-
iPadを落としたら、イヤホンジャックが抜けずに途中からポキっと行ってしまった。 仕方がないので修理をすることに。 使っているヘッドセットはlogicoolのH151 STEREO HEADSET。
-
QEMU上でWindows10の仮想PCを動かしていたが、そろそろWindows11に対応冴えておく必要があると思い、アップグレードしようとした。 結論的には、Win10はBIOSで動いていたのに対し、Win11はUEFIセキュアブートにしなければならなく、HDDイメージにEFI...
-
HKU\.DEFAULT(HKEY_USERS\.DEFAULT)は、あちこちで間違った認識をされている。HKU\.DEFAULT(HKEY_USERS\.DEFAULT)は、デフォルトユーザとかテンプレートユーザと呼ばれるアカウント(=今後作成されるユーザアカウントの初期設定)...
2009/12/14
Windows Internal DatabaseへのPerlからのアクセス
WSUSのDBから必要なデータを直接引き抜きたかったので, いろいろと調べた結果のメモ
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿