【KB4041681】外部データベース ドライバー(1)で予期しないエラーが発生しました。

# はじめに
2017/10/12の朝会にてClassic ASPとExcelファイルを使用した社内アプリケーションが「500 - 内部サーバーエラーです。」となって見れないとの報告がありました。
サーバーで実行すると詳細なエラーとして「Microsoft JET database error 0x80004005 外部データベース ドライバー(1)で予期しないエラーが発生しました。」と出ています。

該当箇所は、「Provider=Microsoft.Jet.OLEDB.4.0;」を使用してExcelファイルを読み込んでいるところです。

アプリケーションを提供しているお客さまのところでも「外部データベース ドライバー(1)で予期しないエラーが発生しました。」のエラーが発生したとのことで、Windows Update後のシステムの復元を行ったところ、正常動作したとの報告をいただきました。


【追記 2017/10/16】
今回は社内版Microsoft UpdateサーバーであるWSUS（Windows Server Update Services）によるアップデートであったため、企業でPCを使用している方に影響があったが、個人の方には影響がでなかった。
KB4041681が注目されたのは、企業のPCが未だWindows 7が多く使われているということである。
あと、この問題の不具合修正パッチが出た場合、当然違うKB番号となります。

【追記 2017/10/19】
WPA2脆弱性対策でセキュリティマンスリー品質ロールアップ(セキュリティアップデートと、非セキュリティアップデートが抱き合わせされたパッチ)の[KB4041681](https://support.microsoft.com/en-in/help/4041681/windows-7-update-kb4041681)ではなく、セキュリティアップデートのみの[KB4041678](https://support.microsoft.com/en-us/help/4041678/windows-7-update-kb4041678)を適応すればという話題がありますが、残念ながらセキュリティアップデートで問題が発生しているため、同じことになります。

【追記 2017/10/20】
英語ですが"SQL BI / Data Access Technologies"のMSDNブログ（2017/10/18）に情報が書かれています。2-3週間またはそれより早くアップデートを提供して利用可能にする。
[“Unexpected error from external database driver (1). (Microsoft JET Database Engine)” after applying October security updates.](https://blogs.msdn.microsoft.com/dataaccesstechnologies/2017/10/18/unexpected-error-from-external-database-driver-1-microsoft-jet-database-engine-after-applying-october-security-updates/)

何気に「Microsoft Access データベース エンジン 2016 再頒布可能コンポーネント」が出てますね。RTM版だからか日本での情報は何も無いですけど。
[Microsoft Access Database Engine 2016 Redistributable](https://www.microsoft.com/en-us/download/details.aspx?id=54920)

【追記 2017/10/27】
>修正プログラムの提供予定時期は、2017年11月中旬頃の見込みであることを確認していますが、変更となる可能性もあります。

出展:[【弥生会計（やよいの青色申告）】Windows Update後にExcelへの書き出しを行うと「ADOエラー」が発生するお客さまへ](http://www.yayoi-kk.co.jp/yss/info/20171016.html)

【追記 2017/11/06】
Microsoftは11月2日(現地時間)にWindows 10系用の修正パッチを公開しました。
Microsoft Excelの.xlsファイルを開く際、Microsoft JET Database Engineを使用するアプリケーションが失敗する問題が修正パッチ。

* [KB4052231](https://support.microsoft.com/ja-jp/help/4052231/windows-10-update-kb4052231) (OS Build 14393.1797)
* [KB4052232](https://support.microsoft.com/en-us/help/4052232/windows-10-update-kb4052232) (OS Build 10586.1177)

修正パッチはWindowsUpdateには配信されないため、Microsoft Update Catalogで対象のKB番号を検索して手動でダウンロードをしてください。
https://www.catalog.update.microsoft.com/home.aspx

Windows7系用とWindows8.1系用も同様に修正パッチを公開したのですがが直ぐに取り消しされました。
[【アプデ】 Microsoft、AccessとExcelのバグ修正パッチを公開 [Update 2: 不具合により取り下げられる]](http://blog.livedoor.jp/nichepcgamer/archives/1068586492.html)

【追記 2017/11/15】
修正パッチが出ましたね、長かった。一度、修正パッチを公開して取り消した経緯があるので今度は大丈夫ではないかと思います。

2017 年 11 月のセキュリティ更新プログラム (月例)
https://blogs.technet.microsoft.com/jpsecurity/2017/11/15/201711-security-bulletin/

>10 月の Windows のセキュリティ更新プログラムの適用後に発生していたMicrosoft JET データベース エンジンに基づくアプリケーションが Microsoft Excel .xls ファイルを作成するときまたは開くときに失敗する問題。

[【現象改善のお知らせ】Windows Update後に「弥生会計」からExcelへの書き出しを行うと「ADOエラー」が発生するお客さまへ](http://www.yayoi-kk.co.jp/yss/info/20171016.html)

この問題は、修正パッチが出て落ち着いた。

|OS|該当するプログラム|
|:--|:--|
|Windows 7 SP1 および Windows Server 2008 R2|KB4048957|
|Windows 8.1 および Windows Server 2012 R2|KB4048958|
|Windows 10 およびWindows Server 2016 |KB4048953　または　KB4048954　または　KB4048955|

# 原因
Windows Update後のシステムの復元で正常動作したとのことで、2017/10/12のWindows Updateのセキュリティパッチが怪しいです。
【追記 2017/10/14】JETデータベースエンジンのセキュリティ対策
[CVE-2017-8717 | Microsoft JET データベース エンジンのリモートでコードが実行される脆弱性](https://portal.msrc.microsoft.com/ja-JP/security-guidance/advisory/CVE-2017-8717) 

* Windows 10 Version 1703 - KB4041676
* Windows 10 Version 1607 and Windows Server 2016 - KB4041691
* Windows 10 Version 1511 - KB4041689
* Windows 10 Version 1507 - KB4042895
* Windows 8.1 and Windows Server 2012 - KB4041693
* Windows 7 and Windows Server 2008 R2 - KB4041681


帰宅後に記事を書くために改めて検索すると、幾つかのサイトで不具合報告が見られるようになりました。

* [10月のWindows Update「KB4041676」「KB4041681」等適用で正常起動しない不具合が発生中！](https://sodicom.jp/blog/2017/10/12/ittechnology/5977/)
* [2017年10月のWindows Updateメモ (不具合情報あり)](https://freesoft.tvbok.com/cat97/2017/wu_memo_2017_10.html)
* [Windows Updateで「KB4041681」適用するとVBAの挙動がおかしくなる事象が発生](http://nanikorehosii.hatenablog.com/entry/2017/10/12/162544)
* [WindowsUpdateでAccessとExcelとの連携に不具合が発生　対処方法](http://hirocommit.blogspot.jp/2017/10/windowsupdateaccessexcel.html)
* [KB4041681 - TANGO! 速報ツイートまとめ！](http://tangoj.com/2017/10/12/46/KB4041681/)

【追記 2017/10/19】

* [【アプデ】 WindowsUpdate 2017年10月度 注意事項と各KBメモと直リンク [Update 6]](http://blog.livedoor.jp/nichepcgamer/archives/1067243460.html)
* [【アプデ】 2017年10月度のWUでバグったAccessとExcelの連携を簡単に手動修正する方法](http://blog.livedoor.jp/nichepcgamer/archives/1068328329.html)

# 対応
## パッチ削除
現状では、「KB4041681」、「KB4041676」等(OSにより番号が違う)をアンインストールしPC再起動する。

【手順】 画像有り：[KB4041681アンインストール手順](http://www.acm-navi.net/trouble-shooting/1082/)
コントロールパネル -> プログラムと機能-> 左のタブから「インストールされた更新プログラム」を選択-> 対象KB番号をアンインストール -> PC再起動

時間が経つとWindows Updateに対象KB番号が再度表示され、シャットダウン時にインストールされてしまいますので、再表示されないように下記の設定をするといいです。

1.「スタート」->「すべてのプログラム」->「Windows Update」を実行する。
2.「更新プログラムの確認」を実行する。※環境によっては10分以上かかります。
3.「〇個の重要な更新プログラムが利用可能です」をクリックする。
4. 対象KB番号を右クリックし、「更新プログラムの非表示」をクリックする。

【対象KB番号】

* Windows 10 Version 1703 - KB4041676
* Windows 10 Version 1607 and Windows Server 2016 - KB4041691
* Windows 10 Version 1511 - KB4041689
* Windows 10 Version 1507 - KB4042895
* Windows 8.1 and Windows Server 2012 - KB4041693
* Windows 7 and Windows Server 2008 R2 - KB4041681

ちなみに今回のエラー以外でもこのパッチはいろいろと問題が発生しているようです、Microsoftではこの問題を把握しており、今後のリリースで更新プログラムを提供する予定のようです。

【対象KB番号 追記 2017/11/06】
[外部データベース ドライバー(1)で予期しないエラーが発生しました - たけらぼ](https://take-lab.com/2017/10/27/post-251/)
ここに挙がっていなかったもので以下も対象となる。

* KB4041678 (Windows 7 SP1 and Windows Server 2008 R2 SP1)
* KB4041687 (Windows 8.1 and Windows Server 2012 R2)
* KB4041689 (Windows 10 Version 1709, 1703, 1607, 1511 and Windows Server 2016)
* KB4041693 (Windows 8.1 and Windows Server 2012 R2)

また、2017/10/18配信のWindows Updateでさらに違うKBで復活しているのでこれも対処する必要あり。

* KB4041685 (Windows 8.1 and Windows Server 2012 R2)
* KB4041686 (Windows 7 SP1 and Windows Server 2008 R2 SP1)
* KB4041688 (Windows 10 Version 1709, 1703, 1607 and Windows Server 2016)

## プロバイダ変更
プログラムを修正できる場合は、「Provider=Microsoft.Jet.OLEDB.4.0;」を使用しているところを、「Provider=Microsoft.ACE.OLEDB.12.0;」に変更する。
社内アプリケーションではこれで対応しました。
※OLEDB.4.0で問題が発生しなかったのがOLEDB.12.0で発生するようになる可能性があります。

AccessがインストールされていないPCに「Microsoft.ACE.OLEDB.12.0」を使用する場合、「Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント」のインストールが必要です。
https://www.microsoft.com/ja-JP/download/details.aspx?id=13255

このMicrosoft Access データベース エンジン 2010 再頒布可能コンポーネントですが、64bit PCに32bit版Officeがインストールされている場合、厄介です。下記サイトの方法で無理矢理入れると、ExcelなどのOfficeアプリケーションを開く度に、Windowsインストーラーが起動し構成の進行状況の画面が起動するようになってしまいます。
[【SQLServer】（自己責任で）32bitOffice環境で64bitMicrosoft.ACE.OLEDB.12.0プロバイダを導入する方法。](http://plus-sys.jugem.jp/?eid=446%5D)

【追記 2017/10/19】
この問題の手動での修正方法(プロバイダ変更)はマイクロソフトの公式ページで案内が出ましたが、今後のパッチでいずれ修正予定とのことです。
https://support.microsoft.com/en-in/help/4041681/windows-7-update-kb4041681
https://support.microsoft.com/en-us/help/4041678/windows-7-update-kb4041678

## Accessプログラム変更
エクセルのエクスポート処理で「実行時エラー 3275」が発生する。
[実行時エラー3275 - MOUGモーグ](http://www.moug.net/faq/viewtopic.php?t=76305)
「DoCmd.TransferSpreadsheet」を「DoCmd.OutputTo」に変更する。

# 最後に
「Microsoft.Jet.OLEDB.4.0」って結構使われているので、もっと話題になってそうだったけど、案外そうでもなかったです。単に見つからなかっただけかも知れないけど・・・。
こういった場合、リアルタイム検索をすればいいみたい。
https://search.yahoo.co.jp/realtime

# 追記
ADOを使って「Microsoft.Jet.OLEDB.4.0」でExcelファイルを読み込めるのはExcel2003までの拡張子「xls」であり、Excel2007以降の拡張子「xlsx」のExcelファイルは、「Microsoft.ACE.OLEDB.12.0」にしないと読み込めません。

「Microsoft.Jet.OLEDB.4.0」がOS標準で備わっているのに対し、「Microsoft.ACE.OLEDB.12.0」は「Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント」のインストールが必要とあって一手間かかってしまいます。

2017年10月10日(日本時間)に「Office 2007」の延長サポートが終了したのに、未だに旧保存形式の拡張子「xls」が使われているところに今回の問題がはらんでいる。

Excel2007以降のMicrosoft Office Open XML 形式のブックに移行していきましょう！

# 参照
* [64bit版Windowsでの「Microsoft.Jet.OLEDB.4.0」について](https://qiita.com/yaju/items/86314412741deb806366)
* [ACE OleDb で Excel のブック作成](http://surferonwww.info/BlogEngine/post/2012/01/26/Creating-Excel-workbook-by-using-ACE-OleDb-provider.aspx)