C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: OpenXMLでExcelにパスワードを付ける方法


(過去ログ 126 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■75009 / inTopicNo.1)  OpenXMLでExcelにパスワードを付ける方法
  
□投稿者/ kanai (1回)-(2015/02/17(Tue) 23:43:42)

分類:[.NET 全般] 

開発環境はWindows7, Visual Studio 2010, VB, .Net Framework 3.5です。

Officeオートメーションを使用せずに、Excelファイル(xlsx, Excel 2010の利用を想定)にパスワードを設定する方法を探しています。
NPOI, ClosedXMLを試しましたが、該当する方法が見つからなかったので、OpenXMLを調べています。
WorkbookProtection.WorkbookPasswordを使えば出来そうなのですが、具体的な設定方法が分からず困っております。
DocumentFormat.OpenXml.HexBinaryValueという型のようですが、目的のパスワードの値をどのように加工して設定するのでしょうか。
ご教示いただきたく、よろしくお願いします。

WorkbookProtection.WorkbookPassword Property
https://msdn.microsoft.com/ja-jp/library/documentformat.openxml.spreadsheet.workbookprotection.workbookpassword(v=office.14).aspx

現在試しているコードは以下の通りです。

Imports DocumentFormat.OpenXml
Imports DocumentFormat.OpenXml.Spreadsheet
Imports DocumentFormat.OpenXml.Packaging

Module Module1

   Sub Main()

       Dim fileName As String = "Book1.xlsx"
       Dim password As String = "password"

       Dim document As SpreadsheetDocument = SpreadsheetDocument.Open(fileName, True)
       Dim wbPart As WorkbookPart = document.WorkbookPart

       wbPart.Workbook.WorkbookProtection = New WorkbookProtection()
       wbPart.Workbook.WorkbookProtection.WorkbookPassword = ? 

       document.Close()

   End Sub

End Module

引用返信 編集キー/
■75010 / inTopicNo.2)  Re[1]: OpenXMLでExcelにパスワードを付ける方法
□投稿者/ れい (6回)-(2015/02/18(Wed) 04:08:02)
No75009 (kanai さん) に返信
> 開発環境はWindows7, Visual Studio 2010, VB, .Net Framework 3.5です。
> 
> Officeオートメーションを使用せずに、Excelファイル(xlsx, Excel 2010の利用を想定)にパスワードを設定する方法を探しています。
> NPOI, ClosedXMLを試しましたが、該当する方法が見つからなかったので、OpenXMLを調べています。
> WorkbookProtection.WorkbookPasswordを使えば出来そうなのですが、具体的な設定方法が分からず困っております。
> DocumentFormat.OpenXml.HexBinaryValueという型のようですが、目的のパスワードの値をどのように加工して設定するのでしょうか。

OpenXmlは使ったことがありませんが、
Excelの書き込みパスワードでしたら詳細はundocumentedだと思います。

なので保証はありませんが、私は下記のコードで生成しています。

    Public Function CreateExcelHash(password As String) As String
        Dim h As Integer = password.Length Xor &HCE4B
        For i As Integer = 0 To password.Length - 1
            Dim v As Integer = Asc(password(i)) << i
            h = h Xor (v * 2 And &H7FFF) Or (v >> 16)
        Next
        Return h.ToString("X4")
    End Function

これをつかって次のようなコードで行けるかと。

>        wbPart.Workbook.WorkbookProtection.WorkbookPassword = HexBinaryValue.FromString(CreateExcelHash(password))

引用返信 編集キー/
■75017 / inTopicNo.3)  Re[2]: OpenXMLでExcelにパスワードを付ける方法
□投稿者/ kanai (2回)-(2015/02/18(Wed) 23:27:50)
No75010 (れい さん) に返信

ありがとうございます。
ご教示いただいた関数と、WorkbookProtection.LockStructureを設定することで、パスワードが掛けられた、と思いましたが、実際に有効になったのは「ブックの保護」であり、Excelのパスワードではありませんでした。(ブックの保護は、きちんと掛かっていることが確認できました)

WorkbookProtectionをExcelファイルのパスワードと混同していたようです。
OpenXMLでなくてもよいので、Officeオートメーション以外でExcelファイルにパスワードを設定する方法がござまいしたらご教示いただきたく存じます。

> ■No75009 (kanai さん) に返信
>>開発環境はWindows7, Visual Studio 2010, VB, .Net Framework 3.5です。
>>
>>Officeオートメーションを使用せずに、Excelファイル(xlsx, Excel 2010の利用を想定)にパスワードを設定する方法を探しています。
>>NPOI, ClosedXMLを試しましたが、該当する方法が見つからなかったので、OpenXMLを調べています。
>>WorkbookProtection.WorkbookPasswordを使えば出来そうなのですが、具体的な設定方法が分からず困っております。
>>DocumentFormat.OpenXml.HexBinaryValueという型のようですが、目的のパスワードの値をどのように加工して設定するのでしょうか。
>
> OpenXmlは使ったことがありませんが、
> Excelの書き込みパスワードでしたら詳細はundocumentedだと思います。
>
> なので保証はありませんが、私は下記のコードで生成しています。
>
> Public Function CreateExcelHash(password As String) As String
> Dim h As Integer = password.Length Xor &HCE4B
> For i As Integer = 0 To password.Length - 1
> Dim v As Integer = Asc(password(i)) << i
> h = h Xor (v * 2 And &H7FFF) Or (v >> 16)
> Next
> Return h.ToString("X4")
> End Function
>
> これをつかって次のようなコードで行けるかと。
>
>> wbPart.Workbook.WorkbookProtection.WorkbookPassword = HexBinaryValue.FromString(CreateExcelHash(password))
引用返信 編集キー/
■75019 / inTopicNo.4)  Re[3]: OpenXMLでExcelにパスワードを付ける方法
□投稿者/ れい (7回)-(2015/02/19(Thu) 04:15:35)
Excelファイルのパスワードとはなんですか?
引用返信 編集キー/
■75021 / inTopicNo.5)  Re[4]: OpenXMLでExcelにパスワードを付ける方法
□投稿者/ 優希(ゆき) (56回)-(2015/02/19(Thu) 09:07:33)
No75019 (れい さん) に返信
> Excelファイルのパスワードとはなんですか?

開く際のパスワードだと思われ

http://kokodane.com/tec2_7.htm
引用返信 編集キー/
■75027 / inTopicNo.6)  Re[5]: OpenXMLでExcelにパスワードを付ける方法
□投稿者/ kanai (3回)-(2015/02/20(Fri) 00:34:58)
Excelファイルを開くときの読み取りパスワードです。
引用返信 編集キー/
■75028 / inTopicNo.7)  Re[6]: OpenXMLでExcelにパスワードを付ける方法
□投稿者/ shu (692回)-(2015/02/20(Fri) 08:30:26)
No75027 (kanai さん) に返信
> Excelファイルを開くときの読み取りパスワードです。

扱おうとしている内容は
多分、名前を付けて保存でファイルの種類を『OpenDocument スプレッドシート』を
選んだのと同じだと思うのですが、この場合、Excel上ではパスワード指定が出来ません。
なので無理な可能性が高そうです。
引用返信 編集キー/
■75030 / inTopicNo.8)  Re[7]: OpenXMLでExcelにパスワードを付ける方法
□投稿者/ ぽぴ王子 (19回)-(2015/02/20(Fri) 09:37:07)
ぽぴ王子 さんの Web サイト
No75028 (shu さん) に返信
> 扱おうとしている内容は
> 多分、名前を付けて保存でファイルの種類を『OpenDocument スプレッドシート』を
> 選んだのと同じだと思うのですが、この場合、Excel上ではパスワード指定が出来ません。
> なので無理な可能性が高そうです。

回答でなくて申し訳ないのですが、この場合は『OpenDocument スプレッドシート』ではない
ような気がします。
最初の質問に

> Officeオートメーションを使用せずに、Excelファイル(xlsx, Excel 2010の利用を想定)にパスワードを設定する方法を探しています。
> NPOI, ClosedXMLを試しましたが、該当する方法が見つからなかったので、OpenXMLを調べています。

と書かれていますので、OpenDocument スプレッドシートは想定されていないように思える
のですが、間違ってますでしょうか。


と、これではではあんまりなので。
自分も少し調べてみましたが、なんともわかりにくいです。

MSDN掲示板のVisual Studio 共通フォーラムでこういった質問を見つけました。
https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/9c379dc3-c54d-433b-a42c-a44cf22099f4/open-xml-sdk-office?forum=vsgeneralja

gekkaさんの回答から、MS-OFFCRYPTO Examplesの存在を知ったので、その中のコードを
解析すればあるいは…と思いましたが、ちょっと私にはわからなかったです。
お役に立てず申し訳ありません。
引用返信 編集キー/
■75131 / inTopicNo.9)  Re[8]: OpenXMLでExcelにパスワードを付ける方法
□投稿者/ kanai (4回)-(2015/03/02(Mon) 23:56:14)
ぽぴ王子さん、ありがとうございます。
教えていただいたMS-OFFCRYPTO Examplesのコードを参考にして、無事にパスワードを設定することができました。

私が行った方法は以下の通りです。

MS-OFFCRYPTO Examplesのコードを実行すると、以下の2つのファイルが順に生成されます。
1) 指定されたブックのパスワードを解除したzipファイル(originalDecryptedPackage.zip)
2) そのブックに再び同じパスワードを付けて暗号化したファイル(newEncryptedDocument.xlsx)

1)と2)の間で、新しいパスワードを設定することができないかとコードを調べたところ、
EncryptionSessionメンバであるKeyManagerにSetPasswordというメソッドがあり、これを呼び出せば良さそうでした。
そこで、EncryptionSessionにSetPassword(password)というメソッドを追加して、その中でthis.keyManager.SetPassword(password)を実行します。
本体(Program.cs)のMainでは、DecryptPackageとEnvryptPackageを呼び出すコードの間にsession.SetPassword(newPassword)を挿入します。
これで、古いパスワードを解除して、新しいパスワードを付け直すプログラムになりました。

ただし私が実現したいのは、パスワードの付いていないExcelファイルにパスワードを付けることでした。
パスワードの付いていないExcelファイルを入力として、このプログラムで処理できないか試してみましたが、結局うまく行きませんでした。
必要なEncryptionSessionオブジェクトを生成できない模様です。

そこで、少々強引ですが、ダミーのパスワード付きExcelファイルをあらかじめ用意し、上の手順でパスワードを解除した後、
そのファイルを本物のExcelファイル(パスワードを付けたいファイル)と差し替える方法を考えました。

具体的には、上記のoriginalDecryptedPackage.zipが生成されたタイミング(DecryptPackageの呼び出し後)に、
このファイルをパスワードを設定したいExcelファイルで上書きコピーします。
こうすることで、目的のExcelファイルにパスワードを付けることができました。

なお、MS-OFFCRYPTO Examplesは.Net Framework 4.0で記述されていたので、私の環境(3.5)では一部のコードを書き換える必要がありました。
またSymmetricAlgorithm.Create("AES")というコードが.Net 3.5だとnullになってしまう不具合(?)があり、ここも改造が必要でした。

ともあれ、おかげさまで目的を達することができました。
ご協力いただき、ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -