TEMTECOMAI ORTHOSTATIC HYPOTENSION

元ダメプログラマで現ダメ中間管理職の駄文

まぁね、WSUS がため込んでるデータ量が多すぎて処理が続行不可になってるって話じゃないと思ってますよ。
そこはまだ楽観的です。
新しい更新プログラムも取りに行けているしクライアントも Windows Update の処理ができていますし。

とは言え広大なネットの海にダイブして下記の情報を引っかけました。
その割にはどちらも Technet のフォーラムですが。。。

Getting past WSUS Cleanup Wizard time out, removing unnecessary updates.

なんかね、WSUS 3.0 が使っているデータベースが持っているストアド プロシージャーに spGetObsoleteUpdatesToCleanup ってのがあるらしいんですよ。
Get Obsolete Updates って言うぐらいだから古い更新情報を取得するってことだよね。
で、こいつはヒットした更新情報の ID 一覧を出力する。
そして spDeleteUpdate っていうストアド プロシージャの引数 @localUpdateID にヒットした ID を与えてあげると更新情報のレコードを削除するよっていう話らしい。

ただ spGetObsoleteUpdatesToCleanup で尋常じゃない数の更新情報が出力されるので、結果をいったん一時テーブルに登録して、WHILE を使って一つずつ spDeleteUpdate に渡してやろうっていうのが次のリンク。

WSUS Cleanup - can this be done is phases?

ザックリとまとめるとこんな感じ。
use SUSDB;
GO

DECLARE @var1 INT
DECLARE @msg nvarchar(100)

-- spGetObsoleteUpdatesToCleanup の結果を一時テーブル #results に格納
CREATE TABLE #results(Col1 INT)
INSERT INTO #results(Col1) EXEC spGetObsoleteUpdatesToCleanup

DECLARE WC Cursor FOR
    SELECT Col1 FROM #results
	
OPEN WC
FETCH NEXT FROM WC
INTO @var1

WHILE(@@FETCH_STATUS > -1)
BEGIN
    SET @msg = 'Deleting ' + CONVERT(varchar(10), @var1)
    RAISERROR(@msg, 0, 1) WITH NOWAIT EXEC spDeleteUpdate @localUpdateID=@var1
    FETCH NEXT FROM WC
    INTO @var1
END

CLOSE WC

DEALLOCATE WC

DROP TABLE #results

これを sql ファイルとして保存して Management Studio とかで流してあげればいいよね。

それでどれだけ効果があるのかわからないけれど。

-- 追記です --

この件、解決しましたのでリンクしておきます。

WSUS 3.0 SP2 on Windows Server 2008 R2 (Windows Internal Database 使用)

WSUS のクリーンアップは時間がかかる。
ホントにかかる。
数日待たされる可能性もある。

その間ずっと管理者でログオンして管理ツールを開いていることになる。
リモート デスクトップから操作してたら作業用 PC の電源も切れなくなってしまうし、だからと言ってサーバーにログオンしっぱなしってのもよろしくない。
ならばタスクで自動実行すればいいんじゃないだろうか、と。


とか思っていたらマイクロソフトのスクリプト センターにありましたよ。 さすが Scriptyng Guys だ。
WSUS Cleanup
https://gallery.technet.microsoft.com/ScriptCenter/fd39c7d4-05bb-4c2d-8a99-f92ca8d08218/

[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")` 
 | out-null 
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer(); 
$cleanupScope = new-object Microsoft.UpdateServices.Administration.CleanupScope; 
$cleanupScope.DeclineSupersededUpdates = $true        
$cleanupScope.DeclineExpiredUpdates         = $true 
$cleanupScope.CleanupObsoleteUpdates     = $true 
$cleanupScope.CompressUpdates                  = $true 
#$cleanupScope.CleanupObsoleteComputers = $true 
$cleanupScope.CleanupUnneededContentFiles = $true 
$cleanupManager = $wsus.GetCleanupManager(); 
$cleanupManager.PerformCleanup($cleanupScope);
こいつを ps1 ファイルにしてタスク スケジューラーに登録しろ、という話ですかね。
スクリプトをパッと見てすぐにわかりますが、[Refrection.assembly]::LoadWithPartialName() で Microsoft.UpdateServices.Administration を読み込んでいるので、PowerShell らしくない方法ですよね。
Windows Server 2012 の WSUS は PowerShell 用のモジュールがあるらしいのですが、WSUS 3.0 には存在しない。 だからアセンブリを読み込んで処理を行う、ということでしょう。

スクリプトのほとんどの部分はクリーンアップ ウィザードの UI にあるチェックボックスの項目っぽいですね。 これらのプロパティに $true または $false を設定して処理項目を決定するわけですね。
ちょっと UI に表示されている処理項目と数が合わないけれど、まぁクリーンアップの範囲でしょう。
CleanupObsoleteComputers がコメントアウトされてます。 しばらく (30日だっけ?) アクセスしていないコンピューターの情報を削除するって処理でしょうか。

タスクで無人実行するのだから try-catch を使って、エラーもイベントログに出力するようにしたらいいんじゃないかね。

様々なバージョンの IE や Edge (Windows 10) での動作確認をするための仮想環境をマイクロソフトが提供してくれていることを知った。
https://dev.windows.com/ja-jp/microsoft-edge/tools/vms/windows/

2015年11月12日現在は以下の環境が用意されている。

テストの対象環境として準備されている仮想マシン

  • IE6 on XP
  • IE7 on Vista
  • IE8 on XP
  • IE8 on Win7
  • IE9 on WIn7
  • IE10 on Win7
  • IE10 on Win8
  • IE10 on WIn8.1
  • IE11 on Win7
  • MSEgde on Win10
仮想環境をホストするのが Windows の場合は以下のプラットフォームが選択可能。
  • VirtualBox
  • Vagrant
  • HyperV
  • VPC (対象の仮想マシンが Windows XP, Vista, 7 の場合のみ)
  • VMware
ホストが Mac の場合は VirtualBox、Vagrant、VMware、Parallels が選択でき、Linux の場合は VirtualBox と Vagrant が選択可能。

このページの日本語翻訳が恥ずかしいことになっている。
入力ミスか
機械語翻訳による誤訳ではなく、完全にヒューマン エラーだね。

WSUS 3.0 SP2 on Windows Server 2008 R2 (Windows Internal Database 使用)

WSUS のメンテナンスをしようと思った。
WSUS 3.0 には [クリーンナップ ウィザード] という GUI ツールがある。
実行してみた。
終わらない。
翌朝まで放置した。
データベース エラーでタイムアウトしていた。

いろいろ調べて回った。
メンテナンス自体をしばらくサボっていたため、日常メンテナンスに関する情報とタイムアウトに対する対策情報がゴチャゴチャとなってしまった。

まずはサボっていた日常メンテナンスから始めてみる。

WSUS 管理コンソールを起動する。
すでに存在しない古い Windows に関する更新情報を除外する。
[Update Services]-[サーバー]-[Update[オプション]-[製品とクラス] を開き、使っていない古い Windows を対象から外した。

IE の古い累積的なセキュリティ更新情報を "拒否" にする。
Japan WSUS Support Team blog "「IE の累積的なセキュリティ更新プログラム」が承認されていると、更新プログラムの検出処理時に WSUS クライアントの CPU 使用率が高くなる"
ただしこの検索結果一覧は使い勝手が悪すぎる。 検索結果のリストからは親子関係が分からない。 せめて親子関係を表すアイコンも表示されてほしかった。


これで再びクリーンアップ ウィザードを実行してみた。
やっぱりタイムアウトする。

では DB のインデックスを再構築してみよう。 WSUS と言えど情報は DB のレコードなのだから、肥大化した DB を整理してやれば軽くなるはず!!

Japan WSUS Support Team blog 「WSUS DB インデックスの再構成の手順について」
こいつも SQL なので Management Studio から実行。
あまり時間は掛からなかった。


クリーンアップ ウィザードを試してみた。
やっぱりタイムアウトする。

他にやれる事はないだろうか。
SQL で DB に直接介入するってのはどうだ?
WSUS DB にはメンテナンス用のストアド プロシージャーが用意されているのではないだろうか。
PowerShell で Update Service に介入するってのはどうだ?
GUI が CUI になっただけでかもしれないが管理コンソールで発生するタイムアウトは回避できるかもしれない。

まだチャレンジは続きそうだ。

-- 追記です --

この件、解決しましたのでリンクしておきます。

WSUS 3.0 SP2 on Windows Server 2008 R2 (Windows Internal Database 使用)

管理ツールの [Windows Server Update Services] でコンピューターの一覧を見てみると Windows 10 が Vista として表示されてしまう。 (Windows 8.1 も誤表示されていたらしいが WSUS のメンテをサポっていたので気づかなかった)

Microsoft からは WSUS 3.0 の不具合を修正する Hotfix がいくつか出ているようだが、どの Hotfix でも現象は治らない。
ちなみにこの環境にすでに適用してある Hotfix は以下の 4つ。


このうち 4つ目の KB2938066 の HotFix では、Windows Server 2012 R2、Windows 8.1、Windows Storage Server 2012 の表示名を修正するらしいのだが、こちらの環境では Windows 10 の誤表示は治っていない。
Japan WSUS Support Team Blog 「WSUS コンソール画面でオペレーティング システム名が正しく表示されない事象について」


そこで見つけたのが以下の情報
Windows Server Essentials Tips & Tricks 「Windows 10 on WSUS Shows as Windows Vista」

WSUS が使っている SUSDB というデータベースの中のテーブル [tbComputerTargetDetail] の中にはその環境で WSUS に登録されたコンピューターの情報が入っているので、こいつを修正するって感じか?
てっきり Windows OS に関するマスター テーブルのようなものがあってそいつを修正するのかと思ったが、現物の情報を修正するようだ。
UPDATE [SUSDB].[dbo].[tbComputerTargetDetail]
SET [OSDescription] = 'Windows 10'
WHERE [OSMajorVersion] = '10'
AND [OSMinorVersion] = '0'
AND [OldProductType] = '1'
AND ([OSDescription] <> 'Windows 10' or [OSDescription] IS NULL)


これを以下のようにして修正した。
上記のコードは SQL なので、こいつを実行する必要がある。
コマンドラインで実行すればいいのだけれど、いろいろと探索したいところなので SQL Server Management Studio を使う。
Windows Internal Database はリモートからログオンできないらしいのでサーバー自身にインストールを行う必要があるらしい。
この WSUS のサーバーには SQL Server 2008 R2 Management Studio Express をインストールした。

  1. SQL Server へログオンする。

サーバーの種類 : データベース エンジン
サーバー名 : \\.\pipe\mssql$microsoft##ssee\sql\query
認証 : Windows 認証
  1. [新しいクエリ] で先のコードを貼り付け実行する。


せっかくなので先のブログにあるように Windows 8.1 と Windows Server 2012 R2 に関する修正も入れる。
無事に終了。

最近 PowerShell のお勉強に力を入れています。
対象は主に Active Directory の管理。

それとは別に、Office 365 管理の文書を読んでいると Exchange の管理なんかにも PowerShell がバンバン搭乗してくる。
たしか Windows Server 2008 あたりから標準搭載されたんだっけ?
随分と不勉強な期間を過ごしてしまったものだ。。。

とりあえず Windows 8.1 の Active Directory 管理センターが生成するスクリプトを見て勉強中。
ユーザー アカウントを新規作成するだけでも 4つぐらいのスクリプトを流しているみたい。
  1. 基本的な項目を指定してアカウントを作成する。
  2. セキュリティ関連の設定をする。
  3. アカウントを有効にする。
  4. 次回ログオン時にパスワード変更を強制するようにする。

みたいな。
最初の New-ADUser コマンドレットにもう少し作業を集約できやしないかね。

あとは作成したスクリプトの中に値を指定していく方法を考えなくちゃね。
ユーザーを作成するケースは 3種類程度で、ケースごとに指定する項目が若干増減する。
ユーザーの情報を変更するケースも何種類かに限られる。
所属が変わる。
社内権限が変わる。
PC へのログオンを禁止する。 またはその逆。
メール アドレスが変わる。 (外部の POP3 なので連動しない)
削除のケースは一つだけ。 単純に削除するだけ。

この作業をするためのツールを自作するにしても、汎用的な作業に使えるようなものになってしまうと車輪の再発名になってしまうので、上に挙げたような実際に起こるケースを起点にすればいいのかな。

何らかの UI を作ったとして、入力したものを最終的に PowerShell に流すにはどうしたらいいのかな。
パイプを駆使すれば 1行のコマンドで済むだろう。それなら Shell で PowerShell を起動してコマンドを引数で与えれば大丈夫かもしれない。
コマンドが複数行になってしまう場合はどうだろう。 スクリプトファイルを生成してから渡せばいいのかな。

というか UI の言語から直接 PowerShell をコントロールすることはできるのかな。
UI は何で作ればいいんだろうか。
Windows フォーム? 今更だなぁ。。。
今の主流派 WPF なのかな?
Windows フォームの開発者たちは既に WPF を習得しちゃったのかな。 MVVM とか書籍を読んでも概念ばかりでよくわからないよ。

Windows IME や Office IME の話。
昔は [Alt] を押しながら [半角/全角] だったっけ。
いつごろからか [半角/全角] だけでも行けるんだよね。

もうそろそろ [変換] キーで切り替えられるようになりませんかね。
ホームポジションから離れるのが嫌なのです。
私は [入力/変換文字なし] の場面での変換キーの役割を [IME-オン/オフ] に変更し、同じ場面での [Shift] + [変換] を再変換に変更しています。
とは言え、再変換に対応していないソフトが未だに多すぎるため再変換は使いません。

まだ英語版しか出ていなくて、バージョン 1.1では DHCP サーバー管理ツールの mcc コンソールなど一部は未搭載。(PowerShell でなら管理できるらしい)
今すぐ日本語の Windows 10 にインストールするにはちょっとだけ余分な手数が必要らしいので大人しく日本語版が出るのを待っている状況。

メイン機である Windows 7 (Windows Server 2008 / 2008 R2) 向けの Active Directory 管理センターで日常業務は問題なし。
ただ最近気がついたのだけれど Windows 8, Windows Server 2012 / 2012 R2 向けの管理センターでは後ろで生成されてる PowerShell のスクリプトを見ることができるって機能があるらしく、これが気になって仕方がない。

今更 Windows 8.1 に戻すのもアレだし、、、ってことで、MSDN サブスクリプションで落とした Windows 8 Pro の iso を使って仮想マシンを立てることにした。
アップデートが多すぎて 8.1 までの道のりは長い。

こんな大人になっちゃいけないよ

と子ども言い聞かせる際に挙げる例、

「人に迷惑をかけない」
具体性に欠けるね。

「人の物を盗む大人になってはいけない」
年頃になったら親の財布からお金を抜くだろう。 麻疹のように避けられない。 大人になる通過儀礼だ。

ということで、自分の子どもがいないオレが親戚のお子ちゃまに言い聞かせている例。
」片側 2車線の道路が混んでいるからといって右に左に車線変更しながら少しでも前に出ようとする浅ましい、卑しい、さもしい大人になってはいけない」
「ましてや前の車を抜こうとして車線変更したのに、思ったよりも隙間がなかったから元の車線の元の位置に戻ってくるような情けない大人になってはいけない」

予想通りポカンとした反応だが、こんな大人、多いよね。

婚て字はく書いてノ書いて横棒書いてノ書いてレ書いてノ書いて尻尾書いて縦横縦横横って書くのよ〜

婚て字はく書いてノ書いて横棒書いてノ書いてレ書いてノ書いて尻尾書いて縦横縦横横って書くのよ〜

離れるって字はチョンして横棒メ書いてエルに縦棒縦書いて横書いて縦書いてム書いてノ書いて縦棒チョンしてティー書いて横棒三つ書くのよ〜

↑このページのトップヘ