PowerShell タイムスタンプを変更しろ!
元ボクサーの袴田巌さんの冤罪事件は大変痛ましかったな。
俺は無実であると主張したい。
人の人生ぶっ壊しやがって!48年もだゼ。
それになぁ!コンピュータと違って、
人生のロールバックはできんのじゃ!ボケ
さて、情報技術絡みの事件では昔、これまた証拠捏造によるクソだわけな事があった。
大阪地検特捜部の元主任検事が、捜査資料であるフロッピーディスクに保存されていたファイルのタイムスタンプを意図的に変更して、証拠捏造を図ろうとしたのである。
タイムスタンプとはつまり、ファイルの作成日時、更新日時、アクセス日時のことである。その事件では更新日時を変更したそうである。
今回は、このタイムスタンプの意図的な変更について取り上げてみたいと思う。
意図的な変更をするには、例えばフリーソフトでごろごろ転がっているタイムスタンプ変更ツールを使うというのが一つの手法であろう。その他、OSのシステム日付をいじってファイルを保存すれば、更新日時については簡単に変えられてしまう。
俺もタイムスタンプ変更をやったことがあるが、スゲぇ簡単にできてしまうものだった。なぜなら、PowerShellを使ったからな。待ってたゼ、PowerShell。
PowerShellのSet-ItemPropertyコマンドレットを使えば、できてしまうのだよなこれが。コマンドレットの名称から分かるとおり、タイムスタンプというのはプロパティであるから、変更ができるというわけだ。
どういう目的でタイムスタンプ変更をしたかは割愛するが、悪事のためではないことは宣言する!
では、あるフォルダ直下にあるファイルすべてに対して、作成日時、更新日時、アクセス日時の変更をかけるPowerShellスクリプトを提示したいと思う。
▼ソースはこれ
#----------------------------
# 処理名:タイムスタンプ変更
#----------------------------
#変更対象フォルダ
$folder = "C:\hoge"
#作成日時、更新日時、アクセス日時(yyyy/MM/dd HH:mm:ss形式)
$sakusei = "1999/12/31 12:59:00"
$koushin = "2000/01/01 00:00:00"
$akusesu = "2017/11/21 11:11:00"
Write-Host "実行中......"
#作成日時、更新日時、アクセス日時の変更
Dir $folder | ForEach{
Set-ItemProperty $_.FullName CreationTime $sakusei
Set-ItemProperty $_.FullName LastWriteTime $koushin
Set-ItemProperty $_.FullName LastAccessTime $akusesu
}
#変更結果確認
Dir $folder | Select Name,CreationTime,LastWriteTime,LastAccessTime | Format-List
Write-Host "完了!`r`n"
Read-Host "×ボタンで終了"
・3種類のタイムスタンプ用変数
yyyy/MM/dd HH:mm:ss形式で記述する。
・変更結果が見やすいようにするには?
特定プロパティだけをリスト表示する。
Name,CreationTime,LastWriteTime,LastAccessTime
▼実行するとこんな感じ
良い機会なので、PowerShellのパイプライン処理とオブジェクトのプロパティについても少し触れておきたい。
Dir(Get-ChildItem)で変更対象フォルダにあるファイル群を取得し、パイプ処理をする。
$_はパイプで渡されたオブジェクトが格納される特殊な変数(自動変数)である。
また、$_(自動変数)にドット(.)を付けると、取得したオブジェクトの各プロパティにアクセスできる。
今回は$_.FullNameとなっているので、取得したオブジェクトのファイル名フルパスということになる。
Dirにはどんなプロパティがあるかは下記のコードで知ることができる。
Dir | Get-Member -MemberType Property
PowerShell、イエーイ!