見出し画像

【ツール】Office文書プロパティから個人情報を一括削除する

PowerShellスクリプトでOffice文書プロパティから個人情報を一括削除する

Microsoft Officeで作成された文書には、作成者や最終更新者などの個人情報がプロパティに含まれていることがあります。これらの情報は、サイトに公開するときやメールで送る際など共有する際にプライバシー上の懸念を引き起こす可能性があります。Officeアプリで一つ一つ削除することもできますが大量にある場合やそもそも作った人ではない場合、大変です。


そこで、PowerShellスクリプトを使用して、Office文書のプロパティから個人情報を一括で削除するツールを作ってみました。

Office文書のプロパティクリーナー

Office文書のプロパティクリーナーは、PowerShellスクリプトで作成されたGUIアプリケーションです。このスクリプトは、指定されたフォルダ内のMicrosoft Office文書(Word、Excel、PowerPoint)を検索し、選択されたファイルのプロパティから個人情報を削除します。

※ファイルの中身の個人情報を消す機能はありません。
※Word、Excel、PowerPointがインストールされている必要があります。

特徴

  • Word(.doc、.docx、.docm)、Excel(.xls、.xlsx、.xlsm)、PowerPoint(.ppt、.pptx、.pptm)のファイル形式に対応

  • フォルダ内のOffice文書を再帰的に検索し、リストビューに表示

  • リストビューでファイルを選択し、一括で個人情報を削除

  • ファイル名でリストビューに表示されるファイルをフィルタリング

使い方


  1. スクリプトを実行すると、Office文書のプロパティクリーナーのウィンドウが表示されます。

  2. 「参照」ボタンをクリックし、Office文書が含まれるフォルダを選択します。

  3. リストビューに表示されたファイルをチェックまたはチェック外しして、処理対象のファイルを選択します。

  4. 「個人情報を削除」ボタンをクリックして、選択したファイルから個人情報を削除します。

スクリプトのソースと実行手順

Office文書のプロパティクリーナーのPowerShellスクリプトのソースコードを以下に示します。
PowerShellを起動したら以下のコードを張り付けて実行するだけです。

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$form = New-Object System.Windows.Forms.Form
$form.Text = 'Office文書のプロパティクリーナー'
$form.Size = New-Object System.Drawing.Size(600, 450)
$form.MinimumSize = New-Object System.Drawing.Size(600, 450)
$form.StartPosition = 'CenterScreen'

$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10, 20)
$label.Size = New-Object System.Drawing.Size(580, 20)
$label.Text = '個人情報を削除するOffice文書が含まれるフォルダを選択してください:'
$form.Controls.Add($label)

$textBox = New-Object System.Windows.Forms.TextBox
$textBox.Location = New-Object System.Drawing.Point(10, 50)
$textBox.Size = New-Object System.Drawing.Size(480, 20)
$textBox.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left -bor [System.Windows.Forms.AnchorStyles]::Right
$form.Controls.Add($textBox)

$button = New-Object System.Windows.Forms.Button
$button.Location = New-Object System.Drawing.Point(500, 50)
$button.Size = New-Object System.Drawing.Size(75, 23)
$button.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Right
$button.Text = '参照'
$button.Add_Click({
    $foldername = New-Object System.Windows.Forms.FolderBrowserDialog
    $foldername.Description = "フォルダを選択してください"
    $result = $foldername.ShowDialog((New-Object System.Windows.Forms.Form -Property @{TopMost = $true }))
    if ($result -eq [Windows.Forms.DialogResult]::OK){
        $textBox.Text = $foldername.SelectedPath
        $files = Get-ChildItem -Path $foldername.SelectedPath -Include *.doc, *.docx, *.xls, *.xlsx, *.ppt, *.pptx, *.docm, *.xlsm, *.pptm -Recurse
        Update-ListView $files
    }
})
$form.Controls.Add($button)

$listView = New-Object System.Windows.Forms.ListView
$listView.Location = New-Object System.Drawing.Point(10, 120)
$listView.Size = New-Object System.Drawing.Size(575, 170)
$listView.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left -bor [System.Windows.Forms.AnchorStyles]::Right
$listView.View = [System.Windows.Forms.View]::Details
$listView.FullRowSelect = $true
$listView.GridLines = $true
$listView.CheckBoxes = $true
$listView.Columns.Add("ファイル名", 470) | Out-Null
$listView.Columns.Add("ステータス", 100) | Out-Null
$listView.Add_MouseDoubleClick({
    if ($listView.SelectedItems.Count -eq 1) {
        $item = $listView.SelectedItems[0]
        $file = Get-Item -Path $item.Text
        Invoke-Item $file.FullName
    }
})
$form.Controls.Add($listView)

$filterLabel = New-Object System.Windows.Forms.Label
$filterLabel.Location = New-Object System.Drawing.Point(10, 90)
$filterLabel.Size = New-Object System.Drawing.Size(50, 20)
$filterLabel.Text = "フィルタ:"
$form.Controls.Add($filterLabel)

$filterTextBox = New-Object System.Windows.Forms.TextBox
$filterTextBox.Location = New-Object System.Drawing.Point(70, 90)
$filterTextBox.Size = New-Object System.Drawing.Size(200, 20)
$filterTextBox.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left
$filterTextBox.Add_TextChanged({
    $files = Get-ChildItem -Path $textBox.Text -Include *.doc, *.docx, *.xls, *.xlsx, *.ppt, *.pptx, *.docm, *.xlsm, *.pptm -Recurse
    Update-ListView $files
})
$form.Controls.Add($filterTextBox)

$checkAllButton = New-Object System.Windows.Forms.Button
$checkAllButton.Location = New-Object System.Drawing.Point(10, 300)
$checkAllButton.Size = New-Object System.Drawing.Size(100, 30)
$checkAllButton.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left
$checkAllButton.Text = 'すべてチェック'
$checkAllButton.Add_Click({
    foreach ($item in $listView.Items) {
        $item.Checked = $true
    }
})
$form.Controls.Add($checkAllButton)

$uncheckAllButton = New-Object System.Windows.Forms.Button
$uncheckAllButton.Location = New-Object System.Drawing.Point(120, 300)
$uncheckAllButton.Size = New-Object System.Drawing.Size(120, 30)
$uncheckAllButton.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left
$uncheckAllButton.Text = 'すべてチェック外す'
$uncheckAllButton.Add_Click({
    foreach ($item in $listView.Items) {
        $item.Checked = $false
    }
})
$form.Controls.Add($uncheckAllButton)

$clearButton = New-Object System.Windows.Forms.Button
$clearButton.Location = New-Object System.Drawing.Point(250, 300)
$clearButton.Size = New-Object System.Drawing.Size(200, 30)
$clearButton.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Right
$clearButton.Text = '個人情報を削除'
$clearButton.Add_Click({
    foreach ($item in $listView.CheckedItems) {
        $file = Get-Item -Path $item.Text
        
        try {
            $doc = $null
            $extension = [System.IO.Path]::GetExtension($file.FullName)
            
            if ($extension -eq ".doc" -or $extension -eq ".docx" -or $extension -eq ".docm") {
                $word = New-Object -ComObject Word.Application
                $doc = $word.Documents.Open($file.FullName)
            }
            elseif ($extension -eq ".xls" -or $extension -eq ".xlsx" -or $extension -eq ".xlsm") {
                $excel = New-Object -ComObject Excel.Application
                $doc = $excel.Workbooks.Open($file.FullName)
            }
            elseif ($extension -eq ".ppt" -or $extension -eq ".pptx" -or $extension -eq ".pptm") {
                $powerpoint = New-Object -ComObject PowerPoint.Application
                $doc = $powerpoint.Presentations.Open($file.FullName)
            }
            
            if ($doc -ne $null) {
                $doc.RemoveDocumentInformation([Microsoft.Office.Core.MsoDocProperties]::msoPropertyTypeString)
                $doc.Save()
                $doc.Close()
                $item.SubItems[1].Text = "削除完了"
            }
        }
        catch {
            $item.SubItems[1].Text = "エラー"
        }
        finally {
            if ($word -ne $null) { $word.Quit() }
            if ($excel -ne $null) { $excel.Quit() }
            if ($powerpoint -ne $null) { $powerpoint.Quit() }
        }
    }
})
$form.Controls.Add($clearButton)

$instructionLabel = New-Object System.Windows.Forms.Label
$instructionLabel.Location = New-Object System.Drawing.Point(10, 340)
$instructionLabel.Size = New-Object System.Drawing.Size(580, 60)
$instructionLabel.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left -bor [System.Windows.Forms.AnchorStyles]::Right
$instructionLabel.Text = "使い方:`n1. 個人情報を削除するOffice文書が含まれるフォルダを選択します。`n2. リストビューに表示されたファイルをチェックまたはチェック外しします。`n3. [個人情報を削除] ボタンをクリックして、選択したファイルから個人情報を削除します。"
$form.Controls.Add($instructionLabel)

function Update-ListView($files) {
    $listView.Items.Clear()
    foreach ($file in $files) {
        if ($file.Name -like "*$($filterTextBox.Text)*") {
            $item = New-Object System.Windows.Forms.ListViewItem($file.FullName)
            $item.SubItems.Add("未処理") | Out-Null
            $item.Checked = $true
            $listView.Items.Add($item) | Out-Null
        }
    }
}

if ($args.Count -gt 0) {
    $folderPath = $args[0]
    if (Test-Path $folderPath) {
        $textBox.Text = $folderPath
        $files = Get-ChildItem -Path $folderPath -Include *.doc, *.docx, *.xls, *.xlsx, *.ppt, *.pptx, *.docm, *.xlsm, *.pptm -Recurse
        Update-ListView $files
    }
}

$form.Add_Shown({$textBox.Select()})
$result = $form.ShowDialog()


スクリプトを使用する前に、以下の点にご注意ください。

  • Microsoft Officeがインストールされている必要があります。

  • 大量のファイルを処理する場合、処理に時間がかかる場合があります。

  • ファイルから個人情報を削除すると、ファイルの更新日時が変更されます。

  • ファイルのバックアップを取ってから処理を行うことをお勧めします。

まとめ

Office文書のプロパティクリーナーを使用することで、Microsoft Office文書のプロパティから個人情報を簡単に削除することができます。このスクリプトは、GUIモードとコマンドラインモードの両方に対応しており、フォルダ内のOffice文書を再帰的に検索し、選択されたファイルから個人情報を一括で削除します。

ファイルのバックアップを取ってから処理を行うことをお勧めします。

この記事が気に入ったらサポートをしてみませんか?