EFS暗号化されたファイルを解除する
会社でEFSで暗号化したファイル群を元に戻すために作ったプログラムを整形したバージョン。ファイルの暗号化を戻した場合、タイムスタンプが書き換わってうれしくないので(仕様的には書き変わらないとまずいのでしょうが)、タイムスタンプを保持しておいて、戻すという技を使っています。
実際はエラーチェックとか入っていたり、構造がちょっと違いますが。エラーが出たら許してください
。参照にSystem.Security.dllを追加してください。
readonly(読み取り専用)をはずしているのはVSSなどにチェックインしたファイル対策。ReadOnly属性をはずしておかないと例外が発生します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using System.Security; //指定されたフォルダ配下のファイルの暗号化ファイルを解除する
void DecryptFolderFiles(string nameFolder) { DirectoryInfo di = new DirectoryInfo(nameFolder); FileInfo[] AllFiles = di.GetFiles("*.*", SearchOption.AllDirectories); bool ReadOnlyFlag; foreach (FileInfo oneFile in AllFiles) { if ((oneFile.Attributes & FileAttributes.Encrypted) == FileAttributes.Encrypted) { Console.WriteLine(oneFile.FullName + " の暗号化を解除します"); DateTime lastAccessTime = File.GetLastWriteTime(oneFile.FullName); if ((oneFile.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) { ReadOnlyFlag = true; oneFile.Attributes ^= FileAttributes.ReadOnly; } else { ReadOnlyFlag = false; } oneFile.Decrypt(); File.SetLastWriteTime(oneFile.FullName, lastAccessTime); if (ReadOnlyFlag == true) { oneFile.Attributes |= FileAttributes.ReadOnly; } } } } |
が、このソースでは不十分で、ファイルの解除しかやりません。フォルダに対しても解除しなければならないのですが、(このソースからは削っていますが)FileInfoにフォルダ名を入れても華麗に無視してくれます。Win32 APIつかうしかないのかなぁ...。Decrypt()メソッドはFileInfoにしかはいっていないようで、この辺が.NET Frameworkちょっと不満。
今回は面倒だったので、Explorerから解除しました
。C#で書いた理由はWindows 2000 Professionalで実行する必要があったので、PowerShellがつかえなかったのです。