Translate

2018年1月26日金曜日

PowerShellでクライアントのアプリケーション一覧を取得する

 多数のクライアントPCを管理していると、どこにどのアプリケーションをインストールしたか覚えていられなくなります。各部署の長さんがしっかり管理してくれてるといいんですが、適当に要望を上げるだけだから次第にどこに何がインストールされてるのかわからなくなっていきます。
 クライアント管理用のソフトウェアがあると簡単に解決できるのですが、これが結構高価なもので年間ライセンスで普通にクライアントPC数台買えるようなレベルだったりします。
 そこでPowerShellを使ってクライアントPCにインストールされているアプリケーションの一覧を取得する方法について説明します。

準備作業

 まずは準備作業として監理したいクライアントPCで、リモートからPowerShellが実行できるように設定する必要があります。
 クライアントPCの管理者モードのPowerShellで次のコマンドを実行するだけなんですが、1台ずつ実行していくのは結構大変です。
Enable-PSRemoting -Force
 そこで次のコマンドラインをGPOのスクリプトや、ウィルス検知ソフトの管理システムなどを使って一斉に実行させます。
powershell -command "& {Enable-PSRemoting -Force}"
 ※注意 リモートからPowerShellを実行できるようにすると、リモートからいろいろなことが実行できてしまいますので、セキュリティ上の検討をよく行ってから実行してください。

一覧の取得

 次に一覧を取得するには、PC上(サーバである必要はありません)でドメイン管理者の権限でPowerShellを起動します。
 立ち上げたPowerShellに次のコマンドを入力して実行します。[]はオプショナル、<>内は適所修正してください。
Invoke-Command -ComputerName <コンピュータ名1>[, <コンピュータ名2>] -ScriptBlock {
>> Get-WmiObject Win32_Product [-Filter "Name like '<アプリケーション名>'"]} |
>> Select-Object Name, PSComputerName |
>> Export-CSV -Path <出力先のパス> -Encoding Default
 例えば2台のPC(computer1、computer2)から名前に"Microsoft"が含まれるアプリケーションの一覧を取得して、"C:\test.csv"に出力する例は次の通りです。
Invoke-Command -ComputerName computer1, computer2 -ScriptBlock {
>> Get-WmiObject Win32_Product -Filter "Name like '%Microsoft%'"} |
>> Select-Object Name, PSComputerName |
>> Export-CSV -Path C:\test.csv -Encoding Default
 出力したデータはExcelで集計するなどするとどのPCに何がインストールされているかの一覧が簡単にできると思います。

コマンドの説明

各コマンドについて軽く触れておきます。

Enable-PSRemoting

PowerShellのリモート実行を有効にします。WinRMの実行やファイヤーウォールの例外設定などが実行されます。

Disable-PSRemoting

PowerShellのリモート実行を無効にします。Enable-PSRemotingを実行すると再起動しても無効化されませんので注意してください。

Invoke-Command

 1台以上のリモートPC上でPowerShellのコマンドを実行します。出力はコマンドを入力したPCに返されます。

Select-Object

出力する列を選択します。

Export-CSV

出力をCSV形式にして保存します。"-Encoding Default"を付けずに実行すると日本語が文字化けします。

2017年12月18日月曜日

GPOを使ったWindows10の管理について

 グループポリシーを使ってWindows 10を管理する際に注意する点について、現在わかっている範囲の注意点を記録します。

 Windows 7までのクライアントPCをGPOで管理していて、そのままWindows 10の管理に移行すると問題が発生することがあります。
 それらの項目とその影響について簡単にまとめています。同じく悩んでいる人の参考になれば幸いです。

影響のあるGPOの項目

  • 一時記憶された移動プロファイルのコピーを削除する
  • インターネット上のWindows Updateに接続しない
  • イントラネットのMicrosoft更新サービスの保存場所にある署名済み更新を許可する

■一時記憶された移動プロファイルのコピーを削除する

 移動プロファイルを使っているコンピュータでユーザーがログオフした際に、ローカルPCからプロファイルの情報を削除します。
 セキュリティのことを考えてクライアントPCに個人情報を残さないように、この項目を設定しているとはまることが多いです。

場所

コンピュータの構成 > ポリシー > 管理用テンプレート > Windowsコンポーネント > Windows Update

英語表記

Delete cached copies of roaming profiles

影響

  • Windowsストアが使えない
  • ストアアプリが使えない
  • ログインするたびにスタートメニューが初期化され、インストールしたアプリケーションのショートカットが消える

■インターネット上のWindows Updateに接続しない

 WSUSを使っていると下手にWindows Update上から更新プログラムをダウンロードされないように制限をかけることが多い項目と思われます。
 WSUSの製品と分類の説明を見ていると"Windows 10 Feature On Demand"が「オプション機能」に該当するというように説明されていますが、英文の別の記事内の説明ではWSUSはこの項目をサポートしていないと説明されています。

場所

コンピュータの構成 > ポリシー > 管理用テンプレート > システム > ユーザー プロファイル

英語表記

Do not connect to any Windows Update Internet locations

影響

  • アプリと機能内のオプション機能の管理で機能の追加できない
  • 開発者モードに変更できない

■イントラネットのMicrosoft更新サービスの保存場所にある署名済み更新を許可する

 WSUSを使っているとクライアントPCはイントラネット上のサーバから更新プログラムをダウンロードするため、この設定が必要かと思っていたら大間違いでした。
 この項目を有効にしていると署名が一致しないためダウンロードしたファイルが破棄されWindows Updateが失敗します。
 ちなみにWindows7までは問題なく成功するため原因がわかりにくいです。

場所

コンピュータの構成 > ポリシー > 管理用テンプレート > Windowsコンポーネント > Windows Update

英語表記

Allow signed updates from an intranet Microsoft update service location

影響

  • Windows Updateの更新プログラムのダウンロードに失敗する

2017年11月2日木曜日

Windows10でWSUSを使ったWindowsUpdateに失敗する

 WSUSを使って社内のクライアントのWindows Updateを管理していると、Windows7以前のコンピュータでは問題ないのに、Windows10(おそらくWindows8以降、未確認)では更新プログラムのダウンロードに失敗することがあります。

■原因

ダウンロードしたファイルの署名に問題がある。
Windows Updateのログを確認していると、上記のようなログが記録されています。(実際のログは記録をとっていないため失念しました)
通常、WSUSを使ってWindows Updateを管理する場合、GPOを使ってクライアントの設定を一括で変更していると思いますが、次の項目を有効にしている場合に問題が発生するようです。

■改善方法

GPOの次の項目を「無効」または「未構成」にする。
コンピュータの構成
  ポリシー
    管理テンプレート
      Windows コンポーネント
        Windows Update
          イントラネットのMicrosoft更新サービスの保存場所にある署名済み更新を許可する

■備考

 説明を読んでいるといかにも必要そうに見えるんですけど、有効にすると署名の判定で拒否されてダウンロードに失敗するようです。
 しかもWindows7では同じ設定でも問題なくダウンロードされるため有効にしていると原因を突き止めるのが難しくなっています。
 うまくいかない原因の一つと思われますので一度確認してみてください。

■その他

その他にも既存のGPO設定を使っていると、Windows 10で発生する問題について次の記事でまとめています。

2017年8月8日火曜日

Windows Updateが失敗する問題の対処法

 Windowsの機能拡張やセキュリティ更新などシステム管理には必須のWindows Updateですが、ごくまれに更新中に失敗すると何度やっても更新できなくなることがあります。
 これまでのMSP(個別の更新プログラム)なら、Microsoftカタログから更新プログラムをダウンロードしてきて手動で更新したり、DISMを使ってクリーンナップすることで大体問題が解決するのですが、最近良くWindows Updateで見かける「品質ロールアップ」は若干事情が違うようです。

■対処法

 Windowsの更新プログラムは通常MSPファイルが使用されますが、品質ロールアップではMSUファイルが使用されます。
 MSPファイルによる更新の場合は「DISM」を使ってから、再度Windows Updateを実行したり手動で更新プログラムをインストールすることで大体の問題が解決します。
 MSUファイルによる更新の場合は「システム更新準備ツール」を使って解決させます。

■DISMを使う

 更新プログラムがMSPファイルだった場合、DISMを使ってクリーンナップをした後にWindows Updateを再実行します。もしくは、手動で更新プログラムをインストールする方法もあります。
  1. コマンドプロンプトを起動する
  2. 管理者権限を使ってコマンドプロンプトを起動します。
  3. DISMを実行する
  4. DISM.exe /Online /Cleanup-image /Restorehealth
    
  5. SFCを実行する
  6. sfc /scannow
    
  7. 再度Windows Updateを実行
  8. 再度Windows Updateを実行します。もしくは、Microsoft Update カタログから更新プログラムをダウンロードして手動でインストールします。

■システム更新準備ツールを使う

 更新プログラムがMSUファイルだった場合、システム更新準備ツールを使って問題を解決します。
  1. システム更新準備ツールをインストール
  2. システム更新準備ツールをダウンロードしてインストールします。
  3. 更新プログラムのダウンロード
  4. Microsoft Update カタログから問題のある更新プログラム(*.msu)をダウンロードする。
  5. ファイルをコピーする
  6. 「%SYSTEMROOT%\CheckSUR\packages」ディレクトリを作成し、そこに更新プログラムをコピーします。
  7. システム更新準備ツールを実行する
  8. システム更新準備ツールを実行します。

※注意

 ここでの説明はかなり省略している部分があります。例えば、システム更新準備ツールを使った出順の場合、作業1の前に問題のある更新プログラムを特定する作業があります。
 上手くいかない場合は下記の参考資料をご覧ください。

■参考資料


MSPファイルとは

 MSI(Windows Installer)でインストールされたプログラムの一部もしくは全ての設定やファイルを、修正または更新されたものに書き換えるためのパッケージです。通常「修正プログラム」や「更新プログラム」などと呼ばれています。

MSUファイルとは

 簡単に説明すると複数の更新プログラムをひとつのファイルにまとめたもので、Windows Updateスタンドアロン インストーラーというプログラムに関連付けられています。
 詳しくはこちらをご覧ください。

Microsoft Update カタログ

Microsoft Update カタログを使うと、Windows Updateの更新プログラムをダウンロードして手動でインストールする事ができます。更新プログラムには通常「KB○○」という番号が振られていますので、これを使って検索することが出来ます。ちなみにKBは「Knowledge Base」の略です。

2017年8月1日火曜日

PowerShellを使って特定のプログラムがインストールされているPCを調べる

 多数のPCを管理しているとどのPCにどのプログラムがインストールされているか把握しきれなくなってきます。記録を残して管理をしていても、記入漏れが発生したり、ユーザー自身がインストールしていることも・・・。
 そこで今回はPowerShellを使って、特定のプログラムがインストールされているPCからメールを送信する方法について説明します。
 FlashPlayerなんて勝手にインストールされるくせに、アップデートされずセキュリティホールだらけの古いバージョンが放置されるなんて日常茶飯事なので・・・。

PowerShellのスクリプトファイルを作る

 適当なファイル名、例えば「CheckProgram.ps1」などでスクリプトファイルを作成します。

CheckProgram.ps1の内容

Param(
[string]$program
)

$value = (Get-WmiObject -Class Win32_Product | Select-Object Name, Version | Select-String $program)

if ($value -ne $null) {
    $subject = $program + "が検出されました。"
    $computer = $env:COMPUTERNAME
    $encoding = [System.Text.Encoding]::UTF8
    $body = "Computer: " + $computer + "`r`n" + $value

    Send-MailMessage -to "to@example.com" -from "from@example.com" -subject $subject -body $body -encoding $encoding -SmtpServer "mail.example.com"
}
 プログラムの名称に引数「-program」で指定した文字列を含む場合、そのコンピュータ名とプログラム名、バージョンが「to@example.com」にメールが送られるようになります。
 Send-MailMessageの引数「-to」「-from」「-SmtpServer」は適所変更してください。

GPOでタスクスケジュールに登録する

 上で作成したスクリプトをタスクスケジュールで実行させます。トリガーの設定は適当に設定してください。
 新しく操作を追加し、操作には「プログラムの開始」、「プログラム/スクリプト」「引数の追加(オプション)」には下記の内容を設定します。

プログラム/スクリプト

powershell

引数の追加(オプション)

-NoProfile -ExecutionPolicy Bypass "\\example\scripts\CheckProgram.ps1" -program "Flash Player"
"\\example\scripts\CheckProgram.ps1"はスクリプトを保存したフルパスを指定します。
引数「-program」の後ろ("Flash Player")を変えることで別のプログラムの監視も出来ます。

2017年7月14日金曜日

WSUSの「接続エラー」の対処方法について

 WSUSを運用していると管理画面に「接続エラー」が表示されることがあります。最初のうちは「サーバノードのリセット」を行えば、再度接続できるようになるのですがその状態を放置し続けるとそのうちリセットしても再接続できなるなってきます。
 これはWSUSの運用を続けることで無駄なデータが蓄積されていくことによるもので、データベースの容量制限やメモリ不足であったり、IISのメモリ不足などさまざまな要因が重なることでおきるようです。
 以前、このブログ内でも「WSUSのクリーンアップ」という題名で紹介しておりますが、今回はそれでも問題が解決しない場合の対処方法について説明します。

■原因

接続エラーの主な原因は次のようなものが在るようです。
  • DBのディスク容量不足によりDBの処理に失敗する。
  • DBのメモリ不足によりDBの処理に失敗する。
  • IISのメモリ不足によりIISがクラッシュする。

■基本的な対策

 この対策は主にDBのディスク容量不足に対するものです。MSのサポート曰く基本的な対策として定期的に行ったほうが良いようです。
 詳しい内容は「WSUSのクリーンアップ」をご覧ください。

■IISの上限メモリを増やす

IIS内のアプリケーション(WsusPool)のメモリ制限を4GBに増やす。 4GBに設定すればほぼ安定するようですが、それでも安定しない場合はより多く確保してください。
  1. IISマネージャを起動して左ペインのWSUSのサーバ内にある「アプリケーションプール」を選択します。
  2. 次に右ペインの「WsusPool」右クリックして「詳細設定」を選択して詳細設定を開きます。
  3. 詳細設定内の「プライベートメモリ制限(KB)」を4000000(4GB)に設定する。
  4. 「OK」ボタンを押して設定を反映させる。

■DBの上限メモリを増やす

SQL ServerもしくはWindows Internal Databaseの最小メモリを1GBに増やす。

SQL Serverの場合

SQL Serverの場合はSQL Server Management Studioを起動して、サーバのプロパティを開き、メモリ内の「最小サーバーメモリ(MB)」を1024MBに設定するだけです。

Windows Internal Databaseの場合

  1. 管理者権限でコマンドプロンプトを起動します。
  2. Windows Internal Databaseに接続します。

    WSUS 3.0 SP2 の場合

    sqlcmd -E -S \\.\pipe\mssql$microsoft##ssee\sql\query
    

    Windows Server 2012 / 2012 R2 WSUS の場合

    sqlcmd -E -S \\.\pipe\MICROSOFT##WID\tsql\query
    
  3. 次のSQLを実行します。
    EXEC sp_configure 'show advanced options',1
    GO
    Reconfigure
    GO
    EXEC sp_configure 'min server memory',1024
    GO
    Reconfigure
    GO
    
  4. 次のSQLを実行しrun_value(最小メモリ)が1GBに設定されたことを確認します。
    EXEC sp_configure 'min server memory'
    GO
    
    出力例)
    name                                minimum     maximum     config_value run_value
    ----------------------------------- ----------- ----------- ------------ -----------
    min server memory (MB)                        0  2147483647         1024        1024
    

参考資料

より詳しい資料はMSのサポートページをご覧ください。詳しく説明されています。

2017年4月20日木曜日

OpenSSLの証明書をTomcatのkeystoreに変換する

OpenSSLで作成したX509形式の証明書を、Tomcatの.keystoreに変換する方法について説明します。

変換は一旦OpenSSLを使ってPKCS12形式に変換してからkeyToolを使って.keystoreに変換します。

SSL証明書の変換

SSL証明書: server.crt
キーストア: server.keystore
openssl pkcs12 -export -in server.crt -inkey server.key -out server.p12
keytool -importkeystore -srckeysotre server.p12 -srcstoretype PKCS12 -destkeystore server.keystore -deststoretype JKS

中間証明書付きSSL証明書の変換

SSL証明書: server.crt
中間証明書: ca.crt
キーストア: server.keystore
openssl pkcs12 -export -in server.crt -inkey server.key -out server.p12 -certfile ca.crt
keytool -importkeystore -srckeysotre server.p12 -srcstoretype PKCS12 -destkeystore server.keystore -deststoretype JKS