製品コラム

セイテクエンジニアのブログ  製品コラム  ネットワークドライブの容量監視-BOM for Windows FAQ(仮)

 

 

ネットワークドライブの容量監視-BOM for Windows FAQ(仮)

2024年10月23日配信
2024年10月23日更新
執筆者:セイ・テクノロジーズ エバンジェリスト

 「BOM for Windows」を使用する上での、よくあるお問い合わせ問い合わせについて、不定期で詳しく解説します。製品に関するよくある問い合わせについては、こちらでご確認ください。製品のサポート技術情報については、こちらで検索することができます。

 

Q. BOMでネットワークドライブの空き容量を監視できません

 

 ネットワークドライブの空き領域や使用率をBOMを使用して監視したいのですが、BOMの監視項目「ディスク容量監視」に、接続中のネットワークドライブが表示されません。どうすれば監視できるでしょうか。

 

A. カスタム監視でスクリプトを実行することで対応可能です

 

 BOMのユーザーズマニュアルで説明されているように、BOMに標準で用意されている監視項目「ディスク容量監視」は、監視対象のコンピューターに存在する論理ディスクドライブの容量を監視するものであり、ネットワークドライブについてはマウントされていても対象にはなりません(画面1)。

BOM for Windows Ver.8.0 ユーザーズマニュアル|BOM for Windows Ver.8.0ダウンロード

画面1
画面1 BOMの「ディスク容量監視」では、ネットワークドライブを監視することができない

 

 ネットワークドライブの接続はユーザーごとに保存される設定であり、通常、接続先ごとに接続のための資格情報(ローカルまたはドメインのユーザー名とパスワード)が必要です。また、ネットワーク越しの監視は、ネットワークの接続性の影響を受けるため、ネットワークに問題がある場合、監視データが抜け落ちてしまうという問題もあります。継続的な容量監視のためには、監視対象のサーバーにBOMをインストールして監視することを強くお勧めします。NAS(ネットワーク接続型ストレージ)やLinuxのSambaサーバーの場合は、ネットワークの接続性の影響は避けられませんが、代理監視の方法で監視することができます。いずれの場合も監視対象にはBOMのライセンスが必要です。

 

 そのことを踏まえた上で、「カスタム監視」を使用したネットワークドライブの監視例を紹介します。カスタム監視を使用すれば、あらゆるものを監視することができます。工夫が必要ですが、ネットワークドライブの監視も不可能ではありません。

 

 ログオン中のユーザーのネットワークドライブの情報は、「Get-PSDrive」コマンドレット(Microsoft Learn)で取得することができます(画面2)。

 

画面2
画面2 Get-PSDriveコマンドレットを使用して、ネットワークドライブ(ドライブ文字N)の空き容量や使用率を取得する

 以下の「get-netdrivefree.ps1」および「get-netdrivefreeGB.ps1」は、引数にドライブ文字(例: .¥get-netdrivefree.ps1 N)を渡すことで、それぞれディスク使用率(%)と空き領域(GB)を返すサンプルスクリプトです。

[get-netdrivefree.ps1]get-netdrivefree.txt形式でダウンロード

Param($DriveLetter)
if ($PSBoundParameters.Count -ne 1) { exit }

$DriveLetter = $DriveLetter.Substring(0,1)
try {
  $used = (Get-PSDrive -Name $DriveLetter -ErrorAction Stop).Used
  $free = (Get-PSDrive -Name $DriveLetter -ErrorAction Stop).Free
  $total= $used + $free
  return ($free / $total * 100)
}
catch {
  exit
}

[get-netdrivefreeGB.ps1]get-netdrivefreeGB.txt形式でダウンロード
Param($DriveLetter)
if ($PSBoundParameters.Count -ne 1) { exit }
$DriveLetter = $DriveLetter.Substring(0,1)
try {
  $free = (Get-PSDrive -Name $DriveLetter -ErrorAction Stop).Free
  return ($free / 1024 / 1024 / 1024)
}
catch {
  exit
}


 しかし、このサンプルスクリプトをBOMのカスタム監視に指定して実行しても、テストや監視は失敗します。その理由は、スクリプトが監視対象のシステムアカウント(NT AUTHORITY¥SYSTEM)の権限で実行されるからです。システムアカウントは、当然のことながらログオン中のユーザー(「BOMマネージャー」を実行しているユーザー)ではないので、ログオン中のユーザーと同じネットワークドライブがマウントされているはずがありません。存在しないドライブを参照しようとして例外エラーが発生し、スクリプトが監視データの値を返さない(exitで終了)ため、テストや監視は失敗という扱いになります(画面3)。

画面3
画面3 カスタム監視で実行するスクリプトやプログラムは、監視対象のシステムアカウントによって実行されるため、存在しないネットワークドライブを参照しようとしてエラーが発生する

 

 この制限を回避する方法の1つは、ネットワークドライブの情報を取得するために、システムアカウントのPowerShellセッションでネットワークドライブに接続することです。通常、ネットワークドライブに接続するためには資格情報が必要になるため、スクリプト内でその安全性をどう確保するのかが課題になります。スクリプト内で「NET USE ドライブ文字: ¥¥サーバー名¥共有名 /User:ユーザー名 パスワード」の1行を書き込めば、簡単にネットワークドライブを接続することができますが、スクリプトのファイルが外部に流出すると、平文のパスワードも一緒に漏えいしてしまうリスクがあるからです。

 セキュリティの問題を緩和するために、パスワードを安全な形式で(暗号化して)、安全な場所にテキストファイルとして保存しておき、そのファイルを読み込んで資格情報を作成し、ネットワークドライブの接続に利用します。まず、次のコマンドラインをPowerShellで実行して、ユーザーのパスワードを安全な形式に変換してテキストファイルに保存します。Get-Credentialを実行すると、「資格情報の要求」ダイアログボックスが表示されるので、ネットワークドライブの接続に使用するユーザー名とパスワードを入力してください。

 

C:¥Scripts> $Cred = Get-Credential
C:¥Scripts> $Cred.Password | ConvertFrom-SecureString -key (1..16) | Set-Content .¥N_secret.txt

 

 次に、ネットワークドライブの接続処理を含む、別のカスタム監視用のスクリプト、例えば「Monitor_N.ps1」を作成し。カスタム監視で定期的に実行させるように構成します(画面4、画面5)。

 

画面4
画面4 パスワードを安全な形式で保存し、それを利用してネットワークドライブに接続して監視するスクリプト

 

画面5
画面5 ネットワークドライブの接続処理を含むカスタム監視用のスクリプトによる使用率と空き容量の監視

 次の「monitor_N.ps1」には、ドライブ文字($DriveLetter)、共有パス($UNCPath)、ユーザー名($UserName)、パスワードファイル($PasswdFile)、監視スクリプトのパス($ScriptFile)が定義されており、これらの情報を使用して、資格情報($cred)を作成し、システムアカウントのセッションからネットワークドライブの接続を試みます(定義内容は環境に合わせて変更する必要があります)。ネットワークドライブの接続後、先ほどの「get-netdrivefree.ps1」および「get-netdrivefreeGB.ps1」のいずれかを実行して、その返り値として返します。

 なお、この「monitor_N.ps1」は、指定したネットワークドライブがマウントされていなければマウントし、マウント済みであれば新たにマウントすることはしません。監視間隔ごとに、一時的にマウントし、監視が終わったらマウントを解除するように書き換えることもできます。それには、コメントアウト行を有効(行頭の#を削除)にしてください。同じネットワークドライブを同じ監視間隔で「get-netdrivefree.ps1」および「get-netdrivefreeGB.ps1」の両方で監視すると、同じネットワークドライブの割り当てを同じタイミングで行おうとして、一方の監視がエラーになることがあります。その場合は、監視間隔や監視開始時刻をずらすか、一方でのみ監視する(こちらを推奨)などして対処してください。

 また、この例では話を簡単にするためにパスワードファイルをスクリプトと同じ場所に保存していますが、ローカル管理者(Administratorsローカルグループ)とシステムアカウント(SYSTEM)だけが読み取りアクセス許可を持つ安全な場所に保存してください。

[monitor_N.ps1]monitor_N.txt形式でダウンロード/monitorGB_N.txt形式でダウンロード

$DriveLetter = "N"
$UNCPath = "\\192.168.0.1\work"
$UserName = "ws2022vm01\administrator"
$PasswdFile = "C:\scripts\N_secret.txt"
$ScriptFile = "c:\scripts\get-netdrivefree.ps1"
$securepasswd = Get-Content $PasswdFile|ConvertTo-SecureString -key (1..16)
$cred = New-Object System.Management.Automation.PSCredential $UserName,$securepasswd

try {
  #if (Test-Path $DriveLetter":") {
  #  Remove-PSDrive -Name $DriveLetter -ErrorAction Stop |Out-Null
  #}
  if (!(Test-Path $DriveLetter":")) {
    New-PSDrive -Persist -Name $DriveLetter -PSProvider FileSystem -Root $UNCPath  -Credential $cred -ErrorAction Stop |Out-Null
  }
  $ret = (powershell.exe $ScriptFile $DriveLetter)
  #Remove-PSDrive -Name $DriveLetter -ErrorAction Stop |Out-Null
  return $ret
}
catch {
  exit
}

blog_column_subscribe

blog_column_comment

最新記事