はじめまして。
VisualBasic2010 で Access2003内で作成しているレポートのプレビューを
したいのですが、Accessファイルにはパスワードがかかっています。
Accessさえ起動できれば、マクロで自動で指定したレポートプレビュー
が表示されるような仕組みは作っています。
何かよい方法はないでしょうか?
やむを得ない場合はパスワードを解除することも考えていますが、セキュリティが心配なので、最終手段と考えています。
実行環境に Access はインストールされているのですよね?
Access をオートメーション操作しているのであれば、mdb を開く時に
OpenCurrentDatabase メソッドを利用しているかと思いますが、その
第3引数にて、パスワードを指定することができます。
あるいは、Process.Start 等で msaccess.exe を起動しているのであれば、
/pwd パラメータにてパスワードを指定できます。
http://office.microsoft.com/ja-jp/access-help/HA010166605.aspx
まずは、ご教授ありがとうございました。
パスワードが aaaa の場合、
教えていただいたページでを参考に、Windows(XP)のファイル名を指定して
実行より、msaccess.exe /ro "D:\Sdata.mdb" /pwd aaaa で実行してみたのですが、accessが起動し、ログオン で名前とパスワードを求められてしまいました。そこでパスワードを aaaaと入力しても開かず、またWindowsのログインパスワードを入れても起動しませんでした。
また、これをProcess.StartでVB.NET で実行する場合、
Process.Start("msaccess.exe", "D:\Sdata.mdb") にパスワード aaaa は構文的にどう入れ込むのでしょうか?
> まずは、ご教授ありがとうございました。
http://www.tt.rim.or.jp/~rudyard/torii009.html
> msaccess.exe /ro "D:\Sdata.mdb" /pwd aaaa で実行してみたのですが
/pwd に指定するのは、JET のユーザーレベルセキュリティのパスワードでしたね。
mdb 自体にかけられたパスワードの方を指定する場合は、
> OpenCurrentDatabase メソッドを利用しているかと思いますが、その
> 第3引数にて、パスワードを指定することができます。
を用いてみてください。
たとえば、
Dim acc As Object = CreateObject("Access.Application")
acc.Visible = True
acc.OpenCurrentDatabase("C:\temp\test.mdb", , "aaaa")
MsgBox("レポートを表示します")
Dim doCmd As Object = acc.DoCmd
Const acViewPreview As Integer = 2
doCmd.OpenReport("レポート1", acViewPreview)
System.Runtime.InteropServices.Marshal.ReleaseComObject(doCmd)
MsgBox("終了します")
acc.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(acc)
のような感じです。
ただし OpenCurrentDatabase は、パスワードの間違いを検出できません。
(間違っていた場合、パスワード入力画面が表示されます)
パスワード指定の成否も検出したい場合は、DAO の OpenDatabase メソッドを併用します。
こちらの場合、間違わったパスワードの場合に例外が発生するため、それを
Catch することで、パスワードの入力ミスを検出できます。
Dim acc As Object = CreateObject("Access.Application")
acc.Visible = True
Dim de As Object = acc.DBEngine
Dim db As Object = de.OpenDatabase("C:\temp\test.mdb", False, False, ";PWD=aaaa")
acc.OpencurrentDatabase("C:\temp\test.mdb")
db.Close()
System.Runtime.InteropServices.Marshal.ReleaseComObject(db)
System.Runtime.InteropServices.Marshal.ReleaseComObject(de)
MsgBox("レポートを表示します")
Dim doCmd As Object = acc.DoCmd
Const acViewPreview As Integer = 2
doCmd.OpenReport("レポート1", acViewPreview)
System.Runtime.InteropServices.Marshal.ReleaseComObject(doCmd)
MsgBox("終了します")
acc.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(acc)
もちろんパスワードが正しい場合は、OpencurrentDatabase だけで十分です。
魔界の仮面弁士さんの前回発言の、パスワードの間違いを検出できないやり方では、acc.OpenCurrentDatabase("C:\temp\test.mdb", , "aaaa")
の部分で、指定されたパラメーターの数が期待された数と一致しませんでした。とエラーになりました。
後者のパスワード指定の成否も検出したい場合のやり方でやってみると、うまくいきました。
感謝します。ありがとうございました。
> 指定されたパラメーターの数が期待された数と一致しませんでした
Access 97 や Access 2000 を使っているわけでは無いのですよね?
Access 2003 であればパスワード引数を扱えるはずなのですけれど…妙ですね。
【Access 2000 以下のバージョン】
Sub OpenCurrentDatabase(filepath, Exclusive)
【Access 2002 以上のバージョン】
Sub OpenCurrentDatabase(filepath, Exclusive, bstrPassword)
Sub OpenCurrentDatabaseOld(filepath, Exclusive) … 非表示属性
Accessは2000で開発をしていますが、配布先のパソコンには
2003もあるので両方で対応できたらと思っています。
ツイート | ![]() |