IT Soldier Sakuri !!

Oracle使い。いつのまにかIT戦士になってしまったさくりの可哀想な奮闘記。

WSUS(WindowsServerUpdateService)が接続エラーとなってKBが表示できない!

だいぶ遅くなってしまいましたが、あけましておめでとうございます。
本年もどうぞよろしくお願いします。

新年早々…というか実は年末からなんですけど、
WSUS(WindowsServerUpdateService)の調子が悪い(;´д`)

うちはこんな感じで更新プログラムを配信してるんだけど、
・更新プログラムが公表されたら、システム部全員に配信する。
・2週間ほどシステム部全員が問題なければ、全ユーザに配信する。

[すべての更新プログラム]で[承認済み]を[すべて]表示させようとすると、
f:id:itsoldiersakuri:20160111155325p:plain
こんな感じで[エラー:接続エラー]となってしまって表示できない。
f:id:itsoldiersakuri:20160124195806p:plain
何度やってもダメ。

どうやら更新プログラムが多すぎて表示させるのにタイムアウトになってるっぽい。
35,000件くらいでそれってどうなんだろう。


だが、いきなり全ユーザに更新プログラムは配信したくない。
(正直更新プログラムにバグが多すぎて信じられないのです。)

な、なんとかしなくては…
だって、実は12月の更新プログラム当ててないんだもの。

対応策としては順番的にこんな感じです。

①もう使用しない累積更新を削除
下記サイトの「A. 過去の「IE の累積的なセキュリティ更新プログラム」を WSUS 上で拒否済みに設定」を実施。
「IE の累積的なセキュリティ更新プログラム」が承認されていると、更新プログラムの検出処理時に WSUS クライアントの CPU 使用率が高くなる - Japan WSUS Support Team Blog - Site Home - TechNet Blogs
だってもうIE6とかIE7とかの更新はいらないもんね。
もう少ししたら、IE8とかWindowsXPとかの更新も拒否できる!!!

②クリーンアップウィザードの実行
 正直これは毎月実施した方がいいと思う。
 たまれば溜まる程、時間がかかるし、タイムアウトで何もできなくなる可能性がある。

1.サーバーマネージャーより[役割]-[WindowsServerUpdateServices]-[UpdateServices]-[オプション]を選択し、[サーバークリーンアップウィザード]をクリックする。
f:id:itsoldiersakuri:20160124185350p:plain

2.全✔のまま[次へ]
 ※当ててない更新とかがあっても大丈夫!消えたりしないよ!
f:id:itsoldiersakuri:20160124185423p:plain


③インデックスの更新
詳細はコチラ。
WSUS DB インデックスの再構成の手順について - Japan WSUS Support Team Blog - Site Home - TechNet Blogs


1.UAC(ユーザー アカウント制御)をOFFにしないと絶対エラーになるので注意!
UACをOFFにするには、コンパネで「UAC」と検索して、OFFに。
f:id:itsoldiersakuri:20160124185950p:plain

2.「SQL Server Management Studio Express」をインストール。
Download Microsoft SQL Server Management Studio Express from Official Microsoft Download Center

3.SQL Server Management Studio Expressをクリック。
f:id:itsoldiersakuri:20160124190925p:plain

4.サーバー名は下記をコピペして、認証:[Windows 認証]を選択し、[接続]ボタンをクリックする。
\\.\pipe\mssql$microsoft##ssee\sql\query
f:id:itsoldiersakuri:20160124190947p:plain

5.[データベース]-[SUSDB]を右クリックし、[新しいクエリ]を選択する。
f:id:itsoldiersakuri:20160124191031p:plain

6.右の欄に下記のテキストを貼りつけて、[実行]ボタンをクリックする。
※実行時間は2分くらい?

f:id:itsoldiersakuri:20160124191050p:plain

/****************************************************************************** 
This sample T-SQL script performs basic maintenance tasks on SUSDB 
1. Identifies indexes that are fragmented and defragments them. For certain 
   tables, a fill-factor is set in order to improve insert performance. 
   Based on MSDN sample at http://msdn2.microsoft.com/en-us/library/ms188917.aspx 
   and tailored for SUSDB requirements 
2. Updates potentially out-of-date table statistics. 
******************************************************************************/ 
 
USE SUSDB; 
GO 
SET NOCOUNT ON; 
 
-- Rebuild or reorganize indexes based on their fragmentation levels 
DECLARE @work_to_do TABLE ( 
    objectid int 
    , indexid int 
    , pagedensity float 
    , fragmentation float 
    , numrows int 
) 
 
DECLARE @objectid int; 
DECLARE @indexid int; 
DECLARE @schemaname nvarchar(130);  
DECLARE @objectname nvarchar(130);  
DECLARE @indexname nvarchar(130);  
DECLARE @numrows int 
DECLARE @density float; 
DECLARE @fragmentation float; 
DECLARE @command nvarchar(4000);  
DECLARE @fillfactorset bit 
DECLARE @numpages int 
 
-- Select indexes that need to be defragmented based on the following 
-- * Page density is low 
-- * External fragmentation is high in relation to index size 
PRINT 'Estimating fragmentation: Begin. ' + convert(nvarchar, getdate(), 121)  
INSERT @work_to_do 
SELECT 
    f.object_id 
    , index_id 
    , avg_page_space_used_in_percent 
    , avg_fragmentation_in_percent 
    , record_count 
FROM  
    sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'SAMPLED') AS f 
WHERE 
    (f.avg_page_space_used_in_percent < 85.0 and f.avg_page_space_used_in_percent/100.0 * page_count < page_count - 1) 
    or (f.page_count > 50 and f.avg_fragmentation_in_percent > 15.0) 
    or (f.page_count > 10 and f.avg_fragmentation_in_percent > 80.0) 
 
PRINT 'Number of indexes to rebuild: ' + cast(@@ROWCOUNT as nvarchar(20)) 
 
PRINT 'Estimating fragmentation: End. ' + convert(nvarchar, getdate(), 121) 
 
SELECT @numpages = sum(ps.used_page_count) 
FROM 
    @work_to_do AS fi 
    INNER JOIN sys.indexes AS i ON fi.objectid = i.object_id and fi.indexid = i.index_id 
    INNER JOIN sys.dm_db_partition_stats AS ps on i.object_id = ps.object_id and i.index_id = ps.index_id 
 
-- Declare the cursor for the list of indexes to be processed. 
DECLARE curIndexes CURSOR FOR SELECT * FROM @work_to_do 
 
-- Open the cursor. 
OPEN curIndexes 
 
-- Loop through the indexes 
WHILE (1=1) 
BEGIN 
    FETCH NEXT FROM curIndexes 
    INTO @objectid, @indexid, @density, @fragmentation, @numrows; 
    IF @@FETCH_STATUS < 0 BREAK; 
 
    SELECT  
        @objectname = QUOTENAME(o.name) 
        , @schemaname = QUOTENAME(s.name) 
    FROM  
        sys.objects AS o 
        INNER JOIN sys.schemas as s ON s.schema_id = o.schema_id 
    WHERE  
        o.object_id = @objectid; 
 
    SELECT  
        @indexname = QUOTENAME(name) 
        , @fillfactorset = CASE fill_factor WHEN 0 THEN 0 ELSE 1 END 
    FROM  
        sys.indexes 
    WHERE 
        object_id = @objectid AND index_id = @indexid; 
 
    IF ((@density BETWEEN 75.0 AND 85.0) AND @fillfactorset = 1) OR (@fragmentation < 30.0) 
        SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE'; 
    ELSE IF @numrows >= 5000 AND @fillfactorset = 0 
        SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD WITH (FILLFACTOR = 90)'; 
    ELSE 
        SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD'; 
    PRINT convert(nvarchar, getdate(), 121) + N' Executing: ' + @command; 
    EXEC (@command); 
    PRINT convert(nvarchar, getdate(), 121) + N' Done.'; 
END 
 
-- Close and deallocate the cursor. 
CLOSE curIndexes; 
DEALLOCATE curIndexes; 
 
 
IF EXISTS (SELECT * FROM @work_to_do) 
BEGIN 
    PRINT 'Estimated number of pages in fragmented indexes: ' + cast(@numpages as nvarchar(20)) 
    SELECT @numpages = @numpages - sum(ps.used_page_count) 
    FROM 
        @work_to_do AS fi 
        INNER JOIN sys.indexes AS i ON fi.objectid = i.object_id and fi.indexid = i.index_id 
        INNER JOIN sys.dm_db_partition_stats AS ps on i.object_id = ps.object_id and i.index_id = ps.index_id 
 
    PRINT 'Estimated number of pages freed: ' + cast(@numpages as nvarchar(20)) 
END 
GO 
 
 
--Update all statistics 
PRINT 'Updating all statistics.' + convert(nvarchar, getdate(), 121)  
EXEC sp_updatestats 
PRINT 'Done updating statistics.' + convert(nvarchar, getdate(), 121)  
GO 


7.下記メッセージが出たらOK。画面を全て閉じる。
f:id:itsoldiersakuri:20160124191659p:plain

とりあえず、これでなんとか解決。
WSUSって意外にチャチいし、お守りがめんどくさいのよね。。。

WindowsUpdateが急に失敗する?! KB2687455

お久しぶりです!

死の淵から這い上がりつつあります。さくりです。

すごい仕事が忙しいのに加え、組合が…すごい…・゚・(。✖д✖。)・゚・
本社近くに組合本部があるんだけど、
そこで平日に1泊2日で今年何やるか…とか打合せするの。
地方の支店の方たちが泊まりなのはわかるけど、
自宅まで40分の私まで宿泊要請がきて参った…。
宿泊を断ると、「これだから本社は…」とか
「親睦を深めようとする気がない」とか超詰られるヽ( ε∀ε )ノえぇぇえ!?
でも宿泊は断固拒否しました。(おうち大好き💛)


さて、本題です。
10/28あたりからWindowsUpdateが失敗している人いませんか?
自宅のPCは大丈夫なのに、なぜか会社のPCは軒並みWindowsUpdateが失敗する…
と調査したところ、どうやらMicrosoftのバグのようです。

Windows32bitOSで、Office2010がインストールされているPCに対し、
何故かOffice2010 64bit用のWindowsUpdateが検出されるようになってる!

\\٩(๑`ȏ´๑)۶// 激オコ!

そりゃ失敗するわ…
ちなみに下記3件。

「KB2687413」・・・何故かインストール成功
「KB2837582」・・・何故かインストール成功
「KB2687455」・・・インストール失敗

ネット経由でWindowsUpdateしている方も、WSUS(WindowsServerUpdateService)でも同様の事象

毎日毎日「更新をインストールしてシャットダウン」が表示されてうざい。
もう!どうしたらいいの?と思ったら非表示にできました。


「1個の重要な更新プログラムが利用可能です」をクリックする。
もし、この表示がない場合は、[更新プログラムの確認」をクリックすると出てくるはず。
f:id:itsoldiersakuri:20151101200425p:plain


更新プログラムを右クリックして、[更新プログラムの非表示]を選択し、[OK]ボタンをクリックする。
f:id:itsoldiersakuri:20151101200434p:plain


緑になればOK
f:id:itsoldiersakuri:20151101200444p:plain

ちなみにインストール成功しちゃってるUpdateは特に削除したりしなくても問題ないみたい。

Microsoftからもチラ記事ながら出ました。blogs.technet.com



【2015/11/03 追記】

どうやら不具合は解消した模様です。
が、ちょっと腑に落ちないのは非表示にしたはずのKBが跡形もなく消え去っていること。
どうやったんだろう???
これって、Microsoftやりすぎじゃない?!
と思うのは私だけかな…。

VBScriptでERRのログファイルがあったらメールに添付して送信する

一般職のお姉さんがどう見ても高校生にしか見えないので、
「いくつなんですか?」と超上から目線で伺ったところ、
34歳という回答で心底驚きました。
まさか年上だったなんて…(° ꈊ °|||)
2年目くらいだと思ってたよ…。
なんとお子さんもいました( ⓛ ω ⓛ *)
失礼ついでに「旦那さんはロリコンなんですか?」とも聞いておいたヽ(≝∀≝)ノ



今日は「エラーログが出たらメールで送信されるようにして」と
いうことで朝からプログラミングなう。
こういうゴミプログラ…便利ツールを作るのが私のお仕事。
魔法使いだからね!

初めてVBScriptを使ってみたけど、ExcelVBAとほとんど同じなんだね。
宣言のところで、型を指定できないのにちょっとハマッたけど…。


あと、ファイルの存在チェックをするために、
FileSystemObjectのFileExists()を使おうと思ったんだけど、
ワイルドカードが使えなくて困った。
CopyFile()、MoveFile()、DeleteFile()ではワイルドカード使えるのに何で?

そんなときに下記サイト様に神的なFunctionが置かれていたので、
お借りします(*`・ω・)ゞ
FileExists()でワイルドカードが使えない。その代替方法: Windows Script Programming

' **********************************************
' ***   ログファイルを送付する
' ***
' ***   作成者:  SAKURI
' ***   作成日:  2015/09/17
' ***
' **********************************************
Dim myAttachment
Dim objFileSys
Dim strScriptPath
Dim strBadFile
Dim numFlg
Dim fnameArrayList
Dim objFolder

Set objNetwork = WScript.CreateObject("WScript.Network")
Set oMsg = CreateObject("CDO.Message")

'送り主
oMsg.From = "xxxx@sample.com"

'宛先
oMsg.To = "xxxx@sample.com; xxxx@sample.co.jp "


'ログファイルの存在チェック
Set objFileSys = CreateObject("Scripting.FileSystemObject")

If FileExists("c:\sakuri\LOG\ERR*.log") = True Then

    'メールタイトル
    oMsg.Subject = "ログファイル送信【" & Now & "】"

    'メール本文
    oMsg.TextBody = "自動配信メールです。" & vbCrLf & _
    "-------------------------" & vbCrLf & _
    Now & vbCrLf & _
    "-------------------------" & vbCrLf & _
    "添付のログファイルを確認してください。"

    '添付ファイル
    Set objFolder = objFileSys.GetFolder("c:\sakuri\LOG\ERR")
    For Each objItem In objFolder.Files
        If mid(objItem.Name,1,3) = "ERR" Then
            oMsg.AddAttachment("c:\sakuri\LOG\ERR\" & objItem.Name)
        End if
    Next

Else
    'メールタイトル
    oMsg.Subject = "データは正常に処理されました。【" & Now & "】"

    'メール本文
    oMsg.TextBody = "自動配信メールです。" & vbCrLf & _
    "-------------------------" & vbCrLf & _
    Now & vbCrLf & _
    "-------------------------" & vbCrLf & _
    "データは正常に処理されました。"

End If

Set objFileSys = Nothing

'SMTPサーバ設定
oMsg.Configuration.Fields.Item _ 
  ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
oMsg.Configuration.Fields.Item _ 
  ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "XXX.XXX.XXX.XXX"
oMsg.Configuration.Fields.Item _
  ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 
oMsg.Configuration.Fields.Update
oMsg.Send


Function FileExists(Spec)
 Dim fso
 Dim ParentFolderName
 Set fso=CreateObject("Scripting.FileSystemObject")
 ParentFolderName=fso.GetParentFolderName(Spec)
 If ParentFolderName="" Then ParentFolderName="."
 On Error Resume Next
 fso.CopyFile Spec,ParentFolderName
 FileExists=Err.Number<>53
End Function

WSUS(WindowsServerUpdateService)で、「Windows10を入手する」はどうなるか?

今日は課のメンバー総出で、ランチに行ってきた。
サンドイッチとサラダとポテトフライとスープとコーヒーで950円。
f:id:itsoldiersakuri:20150916132603j:plain
めっちゃおいしい(๑♜д♜)!
そしてオサレでお店でした。



さて、今日の議題

うちの会社のWindowsUpdateは
WSUS(WindowsServerUpdateService)でハンドリングしている。

基本的には全部当てるんだけど、
システム部のPCに先行してパッチを当ててちょっと運用してから
問題ないことを確認して、全社にオープンするようなイメージ。
たまにセキュリティパッチを当てたら、Excelのマクロが動かなくなった!!
とかもあるので念のため。

で、今回はちまたで噂の「Windows10を入手する」のお話し。

プライベートなPCたちはタスクバーのところに
「Windows10を入手する」が出てきていると思います。

これ、クリックしたらWindows10になっちゃいますよね?

それまずいよ!うちの会社まだWindows7なんです。
Windows10なんていう最新PCの動作検証なんてまだまだなんです。

では「Windows10を入手する」は果たしてどうやって入ってくるのかというと、WindowsUpdateなのです。


ということで、
WSUSで「Windows10を入手する」を制御(拒否)したい!
KB番号:KB3035583


勇んでWSUSで検索するも…あれ?ない?!!
f:id:itsoldiersakuri:20150916133633p:plain

調べてみたところ、杞憂だったようです。
ドメイン参加済みのPCは対象にならない。
・Enterprise版は対象にならない。

https://social.technet.microsoft.com/Forums/windows/es-ES/f82af2f4-1585-4470-8cea-131fca0f65bd/windows-10-reservation-update-kb3035583-not-showing-in-my-wsus?forum=w8itproappcompat


なーんだ、よかった!

AD管理ツールを自分のPCから操作する方法

しばらく体調不良であっぷあっぷしてたけど、ようやく回復しつつあります。
お久しぶりです。さくりです。

先日、急に部長に呼び出されて会議室に行くと、

部長 「内示です。」
さくり「えっ…?」オロオロ(゚ロ゚;))((;゚ロ゚)オロオロ

なになに?こないだヘマしたから飛ばされるの?と尋常じゃなくテンパる。

部長 「なんだその顔はwww
    さくりは組合の幹部に使命されました。」
さくり「はっ?!」
部長 「社命なので断れません。以上。」

というわけで、組合の幹部にさせられてしまいました。
何故組合なのに組合員でもない部長から?しかも社命?って思ったけど、
組合の幹部になると仕事を抜けることも多いから、
必ず人事→その人の上司(部長・課長)→本人という内示(?)になるらしい。

超クソめんどくさいけど、仕方がない。
組合費の使い方はいくらか自由になる立場なので、
どうにかしてシルクドソレイユを組合行事に組み込むぞー!!!



今日、一般職のお姉さんがAD(ActiveDirectory)でユーザ作成をしていたんだけど、
わざわざADサーバにリモートデスクトップして、AD管理メニューを起動してたの。
超手間じゃん!自分のPCからやっていいのよ?と言ったところで、
やり方がわからないと。

「AD管理ツールを自分のPCから操作する方法」をまとめました。


「リモートサーバー管理ツール」とググると出てくるので、
Microsoftのダウンロードセンターにアクセスする。

[日本語]を選択して、[ダウンロード]ボタンをクリックする。
f:id:itsoldiersakuri:20150915165614p:plain

必要な方(64bitだったら上、32bitだったら下)を選択して、[次へ]ボタンをクリック。
f:id:itsoldiersakuri:20150915165648p:plain

ダウンロードが始まる
f:id:itsoldiersakuri:20150915165704p:plain

ダウンロードしたファイルをダブルクリックでインストール
f:id:itsoldiersakuri:20150915165714p:plain

[はい]をクリック
f:id:itsoldiersakuri:20150915165733p:plain

[同意します]をクリック
f:id:itsoldiersakuri:20150915165748p:plain

インストールが終わったら、[閉じる]をクリック
f:id:itsoldiersakuri:20150915165814p:plain

[コントロールパネル]→[プログラム]→[Windowsの機能の有効化または無効化]をクリック
f:id:itsoldiersakuri:20150915165854p:plain

しばらくお待ちください、みたいな画面が出るので待つ。(2分くらい?)
[リモートサーバー管理ツール]-[役割管理ツール]-[AD DSおよびAD LDSツール]-[AD DSツール]-[Active Directory管理センタ]にチェックをつける。
※勝手に付随するやつもチェックつくので、それはそのままに。
[OK]ボタンをクリックする。
f:id:itsoldiersakuri:20150915170120p:plain

あら、ふしぎ!
[スタート]ボタンを押すと、[管理ツール]というのができて、
その中にAD管理系のメニューができています!!
f:id:itsoldiersakuri:20150915170302p:plain

いちいちサーバにリモートデスクトップするよりずっと便利だよね!!

ただひとつだけ難点がある。
ADサーバが複数台存在する場合、どのADに接続するのかは運次第。

え?今どのADサーバに接続してるの?とか、
使いたくないADサーバに接続しちゃったっぽいなとか、そんな場合には、
[操作]-[ドメインコントローラの変更]で現在どのADに接続しているかの確認と、
他のADへの接続変更ができる。

Oracle ORA-12541: TNS: リスナーがありません。

土日は体調不良でほぼ寝たきりで過ごした。
せっかくの土日が…(˚ ˃̣̣̥ω˂̣̣̥ )
今日も午前中までは体調悪かったけど、午後から徐々に復活。
一体なんだったのか。
木曜日の夜に食べた月見バーガーのせいなのか。
単純にあぶらっこいものが耐え切れなかったのか。
(そんなにか弱くはないはずなんだけどな…)
夕飯にかつ丼(煮てないやつね)食べて実験です。


今日はこちらのエラーを。

ORA-12541: TNS: リスナーがありません。

会社ではもちろん見たことはないけれど、
自分でデータベースを立ち上げてからは度々目にする。

DBサーバでリスナーが上がっていないときに出るエラー。
他にもtnsnames.ora と listener.ora 内のアドレスやホスト名、ポート番号などが一致していないときにも発生する。

もちろん接続できないので、リスナーちゃんと上がってるのにな…ってときには
設定を再確認しなくちゃいけない。

Oracle ORA-12154: TNS: 指定された接続識別子を解決できませんでした。

今日は朝から具合悪かった。。。
いつもは9時の終業ギリギリまで1時間半くらいは
近くのカフェでまったり朝活をしている私だけど、
座ってるだけでも気持ち悪くて、8時すぎに会社へ。

会社着いた途端、吐き気に襲われて死にかけた。
(# `)3')▃▃▃▅▆▇▉ブォォォォ
とはならなかったけど、やばかった…。
急いでその日にやらなきゃいけないことは全部して、
(途中一昨日のことを部長にネチネチ嫌味言われて)
10:30に早退。

こんなことなら最初から休めばよかったよ…(・:゚д゚:・)ハァハァ


Oracle関連でエンドユーザから一番多い問い合わせはコチラ。

ORA-12154: TNS: 指定された接続識別子を解決できませんでした。

これは95%くらいtnsnames.oraにサービス設定がされていない場合。

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = SAKURI-VAIO)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

こんな感じでエンドユーザのPCに入ってるtnsnames.oraに追記してあげればOK。

Pathはだいたいこんなところ。

C:\app\product\11.2.0\client_1\network\admin

ただし、面倒なのは上書き禁止の所に入っているので、
一旦デスクトップとかにコピーして、そこで追記して、
C:\app\product\11.2.0\client_1\network\admin\tnsnames.ora
にうわっかぶせする。

一応初期設定のマニュアルっていうかバッチを用意してるんだけど、
エンドユーザはそういうことなかなかちゃんとしてくれないもんなんだよな。

ログオンスクリプトとかに仕込んだ方がいいのかな。