Giter VIP home page Giter VIP logo

word-unprotector's Introduction

WordUnprotector

概要

Word文書ファイルにかけられた編集保護を、パスワード不要で強制解除できるソフトウェアです。

オフラインで全ての処理が完結する仕様なのでプライバシーを確保できます。

ソフトウェアを実行するPCにMicrosoft Officeをインストールする必要はありません。

CC0で著作権を完全に放棄しているのでどなたでもご自由にお使いいただけます。(パブリックドメイン)

(著作権放棄の範囲・注意事項に関しては本README.mdの「ライセンス」の項をご参照ください。)

どんなに長いパスワードをかけていても強制的に編集保護を解除してテキストをコピー・操作できるようにするので、保護パスワードを忘れてしまった方や前任者から引き継ぎ損ねてしまった方はぜひ!

(解除が可能なツールは2022年7月時点でこれ以外にはまだ無さそうです(日本語圏と英語圏しか確認していませんが…!))

使用方法を三行で

  • ソフト本体(WordUnprotector.exe)に編集保護のかかったWordファイルをドラッグ&ドロップするだけ! 保護解除されたコピーがファイルと同じ場所に作成される。
  • 複数個のWordファイルのドラッグ&ドロップに対応 + フォルダをドラッグ&ドロップするとフォルダ直下のWordファイルが全部保護解除される
  • Wordファイル(.docx / .docm)以外のファイルを渡しても自動で無視してくれるので問題なし

詳しい使い方とダウンロード先

本ツールの使い方(画像付き)や活用方法などの情報は私のWebサイトにまとめてありますので、ツールご利用の方は以下のリンク先を主にご参照ください。

リンク:ツールの使い方・機能

(このREADME.mdは開発者向けのドキュメントになりますので、ソフトをご使用になるだけであれば上記ページをご覧ください。)

ツールのダウンロードはGitHubのReleasesページで可能です。(zipファイル)


開発者向け情報 (概要)

保護解除ロジック / ini読み書きクラスの利用

本ソフトウェアで使用されているWord文書の保護解除ロジックを、ご自身で開発されているソフトウェアやツールに組み込むことができます。

保護解除処理は本ソフトウェアの他の処理(フォームや設定読み込みなど)と独立しているので、保護解除クラス(WordUnprotectLogic.cs)のコードをコピーしご自身のプロジェクトに加えて少し設定するだけで、1メソッドで保護解除できるようになります。

また、iniファイルに設定を読み書きするクラスも独立した設計になっているのでこちらもご利用いただけます。

(自作のソフトウェアに設定値保存機能を追加する際はこのクラス使えばすぐ実装できます!)

次の大項目「Word保護解除ロジックの使い方 (簡潔に)」と「ini読み書きクラスの使い方 (簡潔に)」に初期設定と使い方をまとめたのでご参照ください。

ソフト制作サンプルとしての利用

本ソフトウェアはソースコードだけでなく、本README.mdやダウンロードファイルに付属するReadme.txt、ソフト本体(実行ファイル)まで同梱物のほぼ全ての著作権を放棄しているのでソフトの制作/配布のサンプルとしてご利用いただけます。

初めてソフトウェアを制作される方や自分で1から配布準備をするのが面倒な方はテンプレートとしてこちらのソースコード・リポジトリをご利用いただいて構いません。

ソースコードにほんのちょっとだけ機能を追加してオリジナルのソフトとして配布してみるなんてお試し利用も可能なので、お気軽にどうぞ!

(※ただし、お手本と呼べるほどの質は全く担保されておりません。あくまで一つのサンプルとしてご利用ください。)

ソースコードの構成

プロジェクトを構成するクラスの処理内容です。

クラス名 処理内容 独立性
Program ソフト本体の処理
起動前にファイルをD&Dされたか否かで、フォーム表示非表示を変更
×
Form1 ソフトのフォーム画面処理 ×
AboutBox1 ソフトのバージョン情報画面の処理 ×
WordUnprotectLogic Wordの編集保護解除・解除したファイルの保存
IniFile 設定用iniファイルの作成・読み取り・書き込み

WordUnprotectorクラスIniFileクラスは他のクラスに依存していないので、単独でクラスを取り出してお手持ちのプロジェクトに加えることが可能です。

ソフトウェア本体のソースコード説明

ソースコードの詳しい処理内容は、お手数ですがコード本体をご確認ください。

大体メソッド名・プロパティ名・変数名を見ればどんな処理をしているか一目ですぐわかると思います(多分。)

コードにはコメント(特にドキュメンテーションコメント)も多めに入っているので、コードを眺めれば処理はきっと追えるはずです。

(もし分かりにくかったらすみません…! 必要ならご質問ください…!)


Word保護解除ロジックの使い方 (簡潔に)

利用可能な環境

推奨環境はこちら。

フレームワーク .NET 6.0
言語バージョン C# 10.0
開発環境 Visual Studio 2022
プロジェクトの
テンプレート
Windows フォーム アプリ
※.NET Frameworkではない

C# 9.0 以降の構文を使用しているのでフレームワークと言語バージョンは上記のもの以上であるか必ず確認を。

事前準備

OpenXML SDK のインストール

Visual Studio で NuGet パッケージマネージャーから検索して入れるだけ。(面倒な作業は不要)

ツール → NuGet パッケージマネージャー → ソリューソンのNuGetパッケージの管理 → 「Open XML SDK」で検索

出てきた DocumentFormat.OpenXml (作成者: Microsoft) をインストールすれば完了!

WordUnprotectLogic.cs をコピー

お手持ちのプロジェクトで新規クラスを作成して 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> 型で格納される。

保護解除できなかったファイルパスを取得してログに記録するなどしたい場合に利用できる。

APIドキュメント

準備中。

※ドキュメンテーションコメントが各メソッドやプロパティに付けられているので、入力時に詳細は簡単に確認できる。当面の間はそれ参照。


ini読み書きクラスの使い方 (簡潔に)

このクラスを使用すればソフトウェアに.iniファイルへの読み書き機能が追加できる。

設定値を保存したいけど.NETで標準的な設定保存方法(user.config の利用)ではソフト本体と同じ場所に設定ファイルを配置できずソフトのポータブル化ができなくてつらい… なんて方におすすめ。

利用可能な環境

推奨環境はこちら。

フレームワーク .NET 6.0
言語バージョン C# 10.0
開発環境 Visual Studio 2022
プロジェクトの
テンプレート
Windows フォーム アプリ
※.NET Frameworkではない

C# 9.0 以降の構文を使用しているのでフレームワークと言語バージョンは上記のもの以上であるか必ず確認を。

注意:Windows API を使用しているのでクロスプラットフォーム化に非対応。

事前準備

IniFile.cs をコピー

お手持ちのプロジェクトで新規クラスを作成して IniFile.cs の内容をコピーするか、ファイルを直接追加する。

※ namespace が WordUnprotector になっているので、そこは各自のプロジェクトの namespace に変更。

使い方

読み書き対象のiniファイルを指定

まずIniFileクラスのインスタンスを作成し、読み書きの対象となるiniファイルを指定する。

var iniFile = new IniFile("設定.ini");

これで、アプリケーションの実行ファイル(.exe)と同じディレクトリにある「設定.ini」が読み書きの対象となる。

(現時点で既に 設定.ini が存在していても、まだ作成されていなくても同じように「設定.ini」が読み書き対象になる)

まだiniファイルが存在しない場合、実際に「設定.ini」が作成されるのは以下の Write() メソッドで書き込みが行われたタイミングとなる。

(つまりインスタンス作成だけではiniファイルは新規生成されない。あくまで読み書きの対象となる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

iniファイルの値の読み込み

IniFileインスタンスで Read() メソッドを実行すると、指定したキーに対応する値を読み取れる。

string name1 = iniFile.Read("UserName"); // UserName=Nekonyan なら、"Nekonyan" が得られる
string name2 = iniFile.Read("UserName", "Profile") // セクション名の追加指定も可能

iniファイルのエントリ消去

指定したキーのエントリ削除は DeleteKey() メソッドで、指定したセクションに含まれる全てのエントリ削除は DeleteSection() メソッドで可能。

iniFile.DeleteKey("UserName");
iniFile.DeleteSection("Profile"); //[Profile]セクション全体 (セクション名・全エントリ) が削除される

キーの存在チェック

指定したキーが存在するかどうか調べるには KeyExists() メソッドを使う。

bool userNameSettingExists = iniFille.KeyExists("UserName");

iniファイル名を省略した場合

IniFileクラスのインスタンス作成時、iniファイル名の指定を省略できる。このとき読み書きの対象になるiniファイルの名前は IniFileDefaultName プロパティで設定できる。

IniFileDefaultName プロパティの初期値は "Settings.ini" になっているので、特に何も設定しなければデフォルトで "Settings.ini" が読み書きの対象になる。(本ソフトのコードもそれ)

var iniFile = new IniFile(); // アプリケーションと同ディレクトリの "Settings.ini" が読み書き対象に

"Settings.ini" というファイル名が一般的によく見られる(個人的経験)ので、特にこだわりがなければ引数は省略して問題ない。

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 プロパティで設定しておいて引数を省略することが望ましい。

APIドキュメント

準備中。

※ドキュメンテーションコメントが各メソッドやプロパティに付けられているので、入力時に詳細は簡単に確認できる。当面の間はそれ参照。


ライセンス

Pajoca(パジョカ) は本ソフトウェア・ソースコード・その他リポジトリ内及び配布用zipに含まれるファイルのうち、ライセンス文(LICENSE.md)を除く全てのファイルに対して著作権および関連する権利をCC0により放棄しています。

つまり、著作権が放棄されたすべてのファイルは自由に変更・再配布可能で商用・非商用問わず一切の許諾・クレジット表示なしに自由にお使いいただけます。

むしろどんどん自由に使って広めてもらって、必要な方にソフトやソースコードが伝われば凄く嬉しいです!

もちろん、ソースコードは本ソフトウェアと全く関係ない自作ソフトや社内ツール、有料で販売する製品やサービスに一部・全部組み込んでいただいて全く問題ありません。

ソフトウェアのバージョン情報画面に私(Pajoca)の作者名が記載されていますが、これも非表示化・変更が可能です。

アイコンも著作権を放棄しているので、本ソフトの派生版を作成した際にアイコンに「+」マークを付け足すなんてことも可能です。

※このソフト・コードを改変したものを配布する際に私と同じように著作権を放棄する必要はありません!(法の範囲内で最大限の自由な利用が可能です)

※ただしCC0にて明記されている通り、本リポジトリにはいかなる保証もせず、ご利用により発生したいかなる損害にも責任を追わないのでその点はご了承ください。


今後の機能追加・修正予定

ソースコード変更

  • ドライブ直下に設置されたWordファイルのパスを正しく読み取って保護解除できるかまだ試していないので確認
  • その他要望に応じてソフトの改善

情報の追加

  • 肝心な強制保護解除の原理(といっても実はWord文書の内部構造であるXMLの特定タグを除去しただけ)についての説明
  • OpenXML SDK によるOfficeファイル操作についての解説(日本語・英語ともに情報がかなり少ないので)
  • APIドキュメントの追加

最後に (その他注意事項)

修正や機能追加について

もし何か本ソフトウェアに関して修正案や機能追加案がございましたら教えていただけると非常にありがたいです。

ただ、このソフトウェアは著作権を放棄して配布しておりますので、提案により追加させていただいた機能部分も含め全て著作権を放棄した状態で一般公開することになります。

その点はご留意いただきますようよろしくお願いいたします。

これに問題がある場合は代わりに、本リポジトリをフォークして色々と改変したものを自前でお好きなライセンスの下で公開していただいて問題ありません。

謝辞

ini読み書きクラスのコードはこちらのWebサイトで Danny Beckett さんによりパブリックドメインで公開されていたコードを改変したものです。

便利なクラスを、著作権を放棄して公開してくださったことに改めて感謝申し上げます。

おかげさまで、私も同様に著作権を放棄してこちらのソフトを公開できました。

(上記サイトにもクラスの使い方が掲載されていますが、私の方でコードをそこそこ改変してしまったので仕様が一部異なっています)

word-unprotector's People

Contributors

pajoca avatar

Stargazers

 avatar なすどんぐり avatar Koutyan.S avatar winningJP avatar koromoko10 avatar nakayama900 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.