web-dev-qa-db-ja.com

MS Access2007からMSSQLサーバーへのODBC接続)のパスワードを保存します

古いAccess2007プロジェクトをMSSQL Server 2008Expressに移行する責任があります。最初の段階は、Accessのフォームとレポートをクライアントに保持しながら、すべてのデータをMSAccessデータベースからSQLサーバーに移動することです。

そのため、データが移動され、SQLサーバーユーザー(その特定のデータベースにのみアクセスするため)が作成され、テーブルはODBC接続を介してAccessデータベースにリンクされます。ただし、1つの厄介な問題があります。どういうわけか解決する:Accessデータベースを開くときに、Accessは定期的にユーザーパスワードを要求します。

サーバーPCとクライアントPCの両方のユーザーは、ローカルマシンにログオンします。つまり、ユーザーは独立したドメインサーバーで検証されません。

これを解決する方法はいくつかあると思います。

  • 1)ユーザーがWindowsログインによって自動的に承認されてログオンできるように、統合セキュリティモデルを構成します(つまり、「信頼できる接続」を使用します)。サーバーPCがクライアントPCからユーザーを認識しないため、これをどのように行うことができるかわかりません。今これを行おうとすると、ユーザーが信頼できないドメインから接続しているというエラーが表示されます。
  • 2)SQLサーバーのユーザーパスワードをクライアント側に保存します。しかし、これが可能かどうかはわかりません。一部の構成ファイルにパスワードを保持するか、アプリケーション構成で難読化して保存すると、セキュリティが低下すると見なされる必要があることは承知していますが、これは特定の設定では許容されます。
  • 3)SQLサーバーテーブルをAccessにリンクする他の方法はありますか?
6
Passiday

最善の解決策は、明らかにWindowsセキュリティを使用することです。

それが適切でない場合は、プログラムが閉じられるまでAccessが開いているすべての接続を記憶するという事実を利用して、可能な代替トリックを次に示します。

  1. いずれかのテーブルの接続文字列をコピーします
  2. パススルークエリ「ptqConnect」を作成し、_SELECT 1_などの高速SQLステートメントを入力します。
  3. の接続文字列をPTQConnectプロパティに貼り付け、必ず_PWD=something;_を追加してください。
  4. アプリの起動手順で、必ずそのPTQを呼び出してください。 DCount("*", "ptqConnect")のようなもので十分です。

それでおしまい。 Accessは、開いた接続を閉じるまで記憶しているため、データベースを閉じても、リンクされたテーブルの接続文字列にパスワードが保存されていなくても、他のテーブルは大騒ぎせずに開くようになります。
PWDを含む接続文字列を公開したくない場合は、VBAから接続を開始し、MDEを配信するか、コードをパスワードで保護するだけでコードを非表示にすることもできます。

この動作の説明を見つけることができます ここ

15
Patrick Honorez

組織のセキュリティポリシーでパスワードの保存が禁止されていることをユーザーに通知します。したがって、データベースを開くたびにパスワードを入力する必要があります。このポリシーは、許可されていないユーザーが許可されたユーザーのマシンからデータベースを開くことを拒否することを説明します。パスワードが何らかの方法で保存されている場合、悪意のある人は無人のマシンに座ってデータベースを開く可能性があります。

信頼できる接続は使用できないため、これが最も安全な方法です。はい、ユーザーはデータベースを開くたびにパスワードを入力する必要がありますが、それがデータを安全に保つために必要なことです。

Edit:オプション#2は受け入れられるので、ODBCリンクテーブルの接続文字列にuidとpwdを格納するだけで済みます。

これは connectionstrings.com からコピーされた例です

Driver={SQL Server Native Client 10.0};
Server=myServerAddress;
Database=myDataBase;
Uid=myUsername;Pwd=myPassword;

ブラウザ表示用に1行の文字列を分割しました。また、各リンクが指しているテーブルを特定する必要があります。現在のリンク接続文字列を調べて、それがどのように行われるかを確認します。

Uidとpwdはプレーンテキストであり、接続プロパティを表示できるすべての人に表示されます。しかし、私はそれらがあなたにとって懸念であるという兆候を見ませんでした。

2
HansUp

Access2010でSQLAzureにリンクするときにこの問題が発生しましたが、非常に簡単でした。テーブルをリンクする場合、パスワードを保存するためのチェックボックスオプションが各テーブルにあります。

テーブルを再リンクしてこのオプションをチェックすると、問題が分類されます。これは安全ではない可能性があるという警告が表示されますが、すべてのデータベースに機密データが含まれているわけではありません。

1
Andrew Mogford

Accessを使用して職場のSQLサーバーにリモート接続するときにこの問題が発生しました。私はAccess2013を持っていますが、2010年からのODBC接続)のような基本的なものに変更は加えられていないと思います。信頼できる接続ではないため、そうする必要があります。データベースに接続するたびにサーバーにログインします。これは基本的なセキュリティです。信頼できないネットワークから問題なく接続するだけのアプリが必要な理由は考えられません。そのため、アプリを開くときにログインする必要があります。データベース。

しかし、私を夢中にさせたのは、tableを開こうとするたびに、パスワードを求められたのは1回だけではなく、2回でした。作成時にランダムに生成された13文字のパスワードを使用する必要があります。ですから、言うまでもなく、それは完全に受け入れられませんでした。

Accessは接続情報をsysテーブルMSysOBjectsに保持しますが、少なくともそこにはパスワードを保存しません。デスクトップと同期されたクラウドサーバーに保存されているAccessDBを使用しているので、仕事用のデスクトップにリモートでアクセスするのではなく、ローカルコピーを開くことができます。この方法の方がはるかに高速です。

ただし、Accessのdbをローカルファイルとして使用するということは、DSN接続名を注意深く監視していることを意味します。それらがすべてのコンピューターで完全に同一である限り、それはうまく機能します。したがって、ODBC32 Windowsツールで職場でDSNを作成したときにDSNに「ProductsDBIII」という名前を付けた場合、自宅で作成するときに同じ名前を使用する必要があります。実際の接続文字列は異なりますが、Accessはそれを気にしません。ただし、ここに秘訣があります。たとえば、仕事で1日過ごした後、自宅から最初にDBを作成するときは、Accessのリンクテーブルマネージャーで接続を更新する必要があります。必要なテーブル/ビューを確認するか、「すべて確認」してください。アクセスは接続を確立し(おそらくログインを要求します)、少なくとも信頼できるアクセスから切り替える場合は、MSysObjectsテーブルの「接続」文字列フィールドが異なるため、すぐに更新します。

出来上がり、私がテーブルを開くたびに、シングルまたはダブルのチャレンジはもうありません。リモートDBから初めてテーブルを開いたときに最初に接続するときに一度尋ねられますが、それだけです。

これが誰かを助けることを願っています。

ジム

0
user3091705

パススルーQAueryを使用してODBC接続を設定します。

データベースオプションでスタートアップフォームとして引用されているフォームは、autoexecの前に起動します。そのため、そのフォームはリンクされたテーブルを引用できない/引用すべきではありません。 autoexecでフォームを設定します。

それ以外の場合は、ODBC接続のpwdの入力を求められます

典型的な問題のシナリオは、リンクされたデータベースのテーブルで配電盤フォームを使用することです

0
Ian Fry