Word文書ファイルにかけられた編集保護を、パスワード不要で強制解除できるソフトウェアです。
オフラインで全ての処理が完結する仕様なのでプライバシーを確保できます。
ソフトウェアを実行するPCにMicrosoft Officeをインストールする必要はありません。
CC0で著作権を完全に放棄しているのでどなたでもご自由にお使いいただけます。(パブリックドメイン)
(著作権放棄の範囲・注意事項に関しては本README.mdの「ライセンス」の項をご参照ください。)
どんなに長いパスワードをかけていても強制的に編集保護を解除してテキストをコピー・操作できるようにするので、保護パスワードを忘れてしまった方や前任者から引き継ぎ損ねてしまった方はぜひ!
(解除が可能なツールは2022年7月時点でこれ以外にはまだ無さそうです(日本語圏と英語圏しか確認していませんが…!))
- ソフト本体(WordUnprotector.exe)に編集保護のかかったWordファイルをドラッグ&ドロップするだけ! 保護解除されたコピーがファイルと同じ場所に作成される。
- 複数個のWordファイルのドラッグ&ドロップに対応 + フォルダをドラッグ&ドロップするとフォルダ直下のWordファイルが全部保護解除される
- Wordファイル(.docx / .docm)以外のファイルを渡しても自動で無視してくれるので問題なし
本ツールの使い方(画像付き)や活用方法などの情報は私のWebサイトにまとめてありますので、ツールご利用の方は以下のリンク先を主にご参照ください。
(このREADME.mdは開発者向けのドキュメントになりますので、ソフトをご使用になるだけであれば上記ページをご覧ください。)
ツールのダウンロードはGitHubのReleasesページで可能です。(zipファイル)
本ソフトウェアで使用されているWord文書の保護解除ロジックを、ご自身で開発されているソフトウェアやツールに組み込むことができます。
保護解除処理は本ソフトウェアの他の処理(フォームや設定読み込みなど)と独立しているので、保護解除クラス(WordUnprotectLogic.cs)のコードをコピーしご自身のプロジェクトに加えて少し設定するだけで、1メソッドで保護解除できるようになります。
また、iniファイルに設定を読み書きするクラスも独立した設計になっているのでこちらもご利用いただけます。
(自作のソフトウェアに設定値保存機能を追加する際はこのクラス使えばすぐ実装できます!)
次の大項目「Word保護解除ロジックの使い方 (簡潔に)」と「ini読み書きクラスの使い方 (簡潔に)」に初期設定と使い方をまとめたのでご参照ください。
本ソフトウェアはソースコードだけでなく、本README.mdやダウンロードファイルに付属するReadme.txt、ソフト本体(実行ファイル)まで同梱物のほぼ全ての著作権を放棄しているのでソフトの制作/配布のサンプルとしてご利用いただけます。
初めてソフトウェアを制作される方や自分で1から配布準備をするのが面倒な方はテンプレートとしてこちらのソースコード・リポジトリをご利用いただいて構いません。
ソースコードにほんのちょっとだけ機能を追加してオリジナルのソフトとして配布してみるなんてお試し利用も可能なので、お気軽にどうぞ!
(※ただし、お手本と呼べるほどの質は全く担保されておりません。あくまで一つのサンプルとしてご利用ください。)
プロジェクトを構成するクラスの処理内容です。
クラス名 | 処理内容 | 独立性 |
---|---|---|
Program | ソフト本体の処理 起動前にファイルをD&Dされたか否かで、フォーム表示非表示を変更 |
× |
Form1 | ソフトのフォーム画面処理 | × |
AboutBox1 | ソフトのバージョン情報画面の処理 | × |
WordUnprotectLogic | Wordの編集保護解除・解除したファイルの保存 | ○ |
IniFile | 設定用iniファイルの作成・読み取り・書き込み | ○ |
WordUnprotectorクラスとIniFileクラスは他のクラスに依存していないので、単独でクラスを取り出してお手持ちのプロジェクトに加えることが可能です。
ソースコードの詳しい処理内容は、お手数ですがコード本体をご確認ください。
大体メソッド名・プロパティ名・変数名を見ればどんな処理をしているか一目ですぐわかると思います(多分。)
コードにはコメント(特にドキュメンテーションコメント)も多めに入っているので、コードを眺めれば処理はきっと追えるはずです。
(もし分かりにくかったらすみません…! 必要ならご質問ください…!)
推奨環境はこちら。
フレームワーク | .NET 6.0 |
言語バージョン | C# 10.0 |
開発環境 | Visual Studio 2022 |
プロジェクトの テンプレート |
Windows フォーム アプリ ※.NET Frameworkではない |
C# 9.0 以降の構文を使用しているのでフレームワークと言語バージョンは上記のもの以上であるか必ず確認を。
Visual Studio で NuGet パッケージマネージャーから検索して入れるだけ。(面倒な作業は不要)
ツール → NuGet パッケージマネージャー → ソリューソンのNuGetパッケージの管理 → 「Open XML SDK」で検索
出てきた DocumentFormat.OpenXml (作成者: Microsoft) をインストールすれば完了!
お手持ちのプロジェクトで新規クラスを作成して WordUnprotectLogic.cs の内容をコピーするか、ファイルを直接追加する。
※ namespace が WordUnprotector になっているので、そこは各自のプロジェクトの namespace に変更。
まず、保護解除したいWordファイルを含んだフルパスのリストを用意する。
List<string> filePaths = openFileDialog1.FileNames.ToList(); // ファイルダイアログから選択してもらう場合
リスト内にはWordファイル以外のパスやフォルダパスを含んでいてもOK。
次に、WordUnprotectLogicクラスのインスタンスを作成する。このとき引数に、用意したファイルパスリストを渡す。
そして、Unprotect()
メソッドを実行すれば完了!(これだけ!)
var wordUnprotectLogic = new WordUnprotectLogic(filePaths);
wordUnprotectLogic.Unprotect();
渡されたファイルパス中のWordファイルのうち保護がかけられている物が全て保護解除され、同ディレクトリに別途保存される。
保護解除に対応していない97-2003形式のWordファイル(.doc)を含んでいた場合や、ファイルが暗号化されていたなどの理由で保護解除できなかった場合は警告メッセージを出すこともできる。
警告メッセージを出すには Unprotect()
実行後、ShowUnprotectionAlert()
メソッドを使えばOK。
保護解除できないファイルが存在した場合のみ、警告メッセージが表示される。
一方で IsAlertEnabled
プロパティを false
にしておけば、ShowUnprotectionAlert()
メソッドを使っても警告メッセージは表示されなくなる。
wordUnprotectLogic.ShowUnprotectionAlert(); // 警告メッセージが表示される
wordUnprotectLogic.IsAlertEnabled = false;
wordUnprotectLogic.ShowUnprotectionAlert(); // 警告メッセージは表示されない
Unprotect()
実行後、UnprotectedFileList
プロパティに保護解除できたファイルのフルパスが、FailedFileList
プロパティに保護解除に失敗したファイルのフルパスが、OldTypeFileList
プロパティに旧形式で保護解除非対応なWordファイルのフルパスが List<string>
型で格納される。
保護解除できなかったファイルパスを取得してログに記録するなどしたい場合に利用できる。
準備中。
※ドキュメンテーションコメントが各メソッドやプロパティに付けられているので、入力時に詳細は簡単に確認できる。当面の間はそれ参照。
このクラスを使用すればソフトウェアに.iniファイルへの読み書き機能が追加できる。
設定値を保存したいけど.NETで標準的な設定保存方法(user.config の利用)ではソフト本体と同じ場所に設定ファイルを配置できずソフトのポータブル化ができなくてつらい… なんて方におすすめ。
推奨環境はこちら。
フレームワーク | .NET 6.0 |
言語バージョン | C# 10.0 |
開発環境 | Visual Studio 2022 |
プロジェクトの テンプレート |
Windows フォーム アプリ ※.NET Frameworkではない |
C# 9.0 以降の構文を使用しているのでフレームワークと言語バージョンは上記のもの以上であるか必ず確認を。
注意:Windows API を使用しているのでクロスプラットフォーム化に非対応。
お手持ちのプロジェクトで新規クラスを作成して IniFile.cs の内容をコピーするか、ファイルを直接追加する。
※ namespace が WordUnprotector になっているので、そこは各自のプロジェクトの namespace に変更。
まずIniFileクラスのインスタンスを作成し、読み書きの対象となるiniファイルを指定する。
var iniFile = new IniFile("設定.ini");
これで、アプリケーションの実行ファイル(.exe)と同じディレクトリにある「設定.ini」が読み書きの対象となる。
(現時点で既に 設定.ini が存在していても、まだ作成されていなくても同じように「設定.ini」が読み書き対象になる)
まだiniファイルが存在しない場合、実際に「設定.ini」が作成されるのは以下の Write()
メソッドで書き込みが行われたタイミングとなる。
(つまりインスタンス作成だけではiniファイルは新規生成されない。あくまで読み書きの対象となるiniファイルを指定しているだけ。)
IniFileインスタンスで Write()
メソッドを実行すると、指定したキーと値のペアがiniファイルに書き込まれる。
iniFile.Write("UserName","Nekonyan");
iniFile.Write("Age","22");
これにより、以下のようなiniファイルが生成される。(既に 設定.ini があるなら、UserNameキーの値がNekonyanに更新される)
[アプリケーション名]
UserName=Nekonyan
Age=22
※デフォルトではプロジェクトのアプリケーション名がセクション名(大かっこ)になる。
次のようにセクション名を指定して書き込むことも可能。
iniFile.Write("UserName","Nekonyan", "Profile");
iniFile.Write("Color","Red", "Data");
これにより、以下のようなiniファイルが生成される。
[Profile]
UserName=Nekonyan
[Data]
Color=Red
IniFileインスタンスで Read()
メソッドを実行すると、指定したキーに対応する値を読み取れる。
string name1 = iniFile.Read("UserName"); // UserName=Nekonyan なら、"Nekonyan" が得られる
string name2 = iniFile.Read("UserName", "Profile") // セクション名の追加指定も可能
指定したキーのエントリ削除は DeleteKey()
メソッドで、指定したセクションに含まれる全てのエントリ削除は DeleteSection()
メソッドで可能。
iniFile.DeleteKey("UserName");
iniFile.DeleteSection("Profile"); //[Profile]セクション全体 (セクション名・全エントリ) が削除される
指定したキーが存在するかどうか調べるには KeyExists()
メソッドを使う。
bool userNameSettingExists = iniFille.KeyExists("UserName");
IniFileクラスのインスタンス作成時、iniファイル名の指定を省略できる。このとき読み書きの対象になるiniファイルの名前は IniFileDefaultName
プロパティで設定できる。
IniFileDefaultName
プロパティの初期値は "Settings.ini" になっているので、特に何も設定しなければデフォルトで "Settings.ini" が読み書きの対象になる。(本ソフトのコードもそれ)
var iniFile = new IniFile(); // アプリケーションと同ディレクトリの "Settings.ini" が読み書き対象に
"Settings.ini" というファイル名が一般的によく見られる(個人的経験)ので、特にこだわりがなければ引数は省略して問題ない。
iniファイルが存在しない状態で値を書き込む場合はiniファイルが自動生成されるので問題ないが、iniファイル読み取り時には問題になる。
アプリケーションと同じディレクトリに指定名のiniファイルが存在するかどうか返す静的メソッド IniFileExists()
が利用可能。
bool iniExists = IniFile.IniFileExists("設定.ini"); // 設定.ini が存在すればtrue
bool settingsIniExists = IniFile.IniFileExists(); // 引数省略時、IniFileDefaultName プロパティで指定された名前のiniの存在判定になる。
静的メソッドであるため IniFile インスタンス生成前に利用できる。
if (IniFile.IniFileExists("設定.ini"))
{
var iniFile = new IniFile("設定.ini");
var userName = iniFile.Read("UserName");
}
ちなみに上記コードのような形で "設定.ini"
のリテラルをそのままコードに何度も書くのは問題なので、何か定数に入れるかあらかじめ IniFileDefaultName
プロパティで設定しておいて引数を省略することが望ましい。
準備中。
※ドキュメンテーションコメントが各メソッドやプロパティに付けられているので、入力時に詳細は簡単に確認できる。当面の間はそれ参照。
Pajoca(パジョカ) は本ソフトウェア・ソースコード・その他リポジトリ内及び配布用zipに含まれるファイルのうち、ライセンス文(LICENSE.md)を除く全てのファイルに対して著作権および関連する権利をCC0により放棄しています。
つまり、著作権が放棄されたすべてのファイルは自由に変更・再配布可能で商用・非商用問わず一切の許諾・クレジット表示なしに自由にお使いいただけます。
むしろどんどん自由に使って広めてもらって、必要な方にソフトやソースコードが伝われば凄く嬉しいです!
もちろん、ソースコードは本ソフトウェアと全く関係ない自作ソフトや社内ツール、有料で販売する製品やサービスに一部・全部組み込んでいただいて全く問題ありません。
ソフトウェアのバージョン情報画面に私(Pajoca)の作者名が記載されていますが、これも非表示化・変更が可能です。
アイコンも著作権を放棄しているので、本ソフトの派生版を作成した際にアイコンに「+」マークを付け足すなんてことも可能です。
※このソフト・コードを改変したものを配布する際に私と同じように著作権を放棄する必要はありません!(法の範囲内で最大限の自由な利用が可能です)
※ただしCC0にて明記されている通り、本リポジトリにはいかなる保証もせず、ご利用により発生したいかなる損害にも責任を追わないのでその点はご了承ください。
- ドライブ直下に設置されたWordファイルのパスを正しく読み取って保護解除できるかまだ試していないので確認
- その他要望に応じてソフトの改善
- 肝心な強制保護解除の原理(といっても実はWord文書の内部構造であるXMLの特定タグを除去しただけ)についての説明
- OpenXML SDK によるOfficeファイル操作についての解説(日本語・英語ともに情報がかなり少ないので)
- APIドキュメントの追加
もし何か本ソフトウェアに関して修正案や機能追加案がございましたら教えていただけると非常にありがたいです。
ただ、このソフトウェアは著作権を放棄して配布しておりますので、提案により追加させていただいた機能部分も含め全て著作権を放棄した状態で一般公開することになります。
その点はご留意いただきますようよろしくお願いいたします。
これに問題がある場合は代わりに、本リポジトリをフォークして色々と改変したものを自前でお好きなライセンスの下で公開していただいて問題ありません。
ini読み書きクラスのコードはこちらのWebサイトで Danny Beckett さんによりパブリックドメインで公開されていたコードを改変したものです。
便利なクラスを、著作権を放棄して公開してくださったことに改めて感謝申し上げます。
おかげさまで、私も同様に著作権を放棄してこちらのソフトを公開できました。
(上記サイトにもクラスの使い方が掲載されていますが、私の方でコードをそこそこ改変してしまったので仕様が一部異なっています)