WSUSに接続しているクライアントPCが、Updateのダウンロードに失敗する場合

WSUSクライアントがWindowsUpdateのダウンロードに失敗する場合には、次の手順でクライアントのキャッシュを初期化すると正常に動作する場合がある。

参考:Windows Update クライアントの情報をクリアにする手順

WSUSを使っていると言うことは、ActiveDirectoryの環境も整っています。ここではクライアントにログインせずに、エンドユーザーに気がつかれないように遠隔操作のみで処理していきます。

次の様なコマンドを実行して、コントロールパネルの「コンピューターの管理」をエラーの発生している端末に繋ぎます。

C:\>runas /user:example.local\[管理者ユーザー] "mmc.exe C:\windows\system32\compmgmt.msc /computer=[コンピューター名]"

これで「コンピューターの管理」が開きますので、ツリーからサービスを選んで「Windows Update」と「Background Intelligent Transfer Service」を停止します。

次のコマンドを実行して、エラーの発生している端末のC:ドライブをマウントします。

C:\>net use A: \\[コンピューター名]\C$ /user:example.local\[管理者ユーザー] [パスワード]

以下のコマンドでSoftwareDistributionフォルダ、及びBITSのジョブを削除します。

ren A:\Windows\SoftwareDistribution SoftwareDistribution.old
del A:\ProgramData\Microsoft\Network\Downloader\qmgr0.dat
del A:\ProgramData\Microsoft\Network\Downloader\qmgr1.dat

「コンピューターの管理」に戻って「Windows Update」と「Background Intelligent Transfer Service」を起動します。

これで先ほど削除した、あるいはリネームしたファイルやフォルダが再び作成されて居ることを確認します。

最後にマウントしたドライブを解放しておきます。

NET USE A: /DELETE

以上で、人知れずWindows Updateのキャッシュ削除完了。2日ほど待ってWSUS上からエラーがなくなっていれば成功です。

OneNoteでエラー コード: 0xE00001AEが発生した場合の対処

OneNoteで「このセクション ファイルは破損しているようです。OneNote で修復できる可能性がありますが、それまでの間、ここでは作業をしないでください。 (エラー コード: 0xE00001AE)」が出た場合の対処法。

1.One Noteのバージョンが最新になっているか確認する
ファイル→アカウントを開きます。

オフィス更新プログラムの更新オプションから「今すぐ更新」を選んで下さい。「Windows Updateを掛けているよ」と言う人でも、セキュリティアップデートは適用されているけど、更新プログラムは適用していない言うことがままあります。

2.壊れたページを削除して、ゴミ箱を空にしてみる
特定のページを開いたときにエラーが表示される場合、そのページが壊れています。諦めてそのページを削除しましょう。ページを右クリックして「削除」を選んだだけだと、ゴミ箱に送られただけで、ページ自体は破棄されません。そのためエラーの表示もなくなりません。
One Noteのゴミ箱は分かりにくい場所にあります。ブックを右クリックして「ノートブックのゴミ箱」を選択して下さい。

「削除されたページ」というシートが表示されるので、そこで再び右クリックして「ゴミ箱を空にする」を選びます。「削除されたページ」意外にも複数の削除済みページが表示される場合には、それらも順に削除します。

Office 2016で再度ライセンス認証画面が酷い

Office 2016で再度ライセンス認証が必要になった場合に表示される画面だが、ここまで酷い化けた画面は滅多に見ない。初見だとおそらく操作できないだろう。

最初の画面、チェックボックスの位置がずれている。本来は「ソフトウェアのライセンス認証をインターネットで行う」と「ソフトウェアライセンス認証を電話で行う」の所にチェックボックスがあるが、エラーメッセージの場所に移動している。上段のエラーメッセージを選ぶとインターネット経由に、下段のエラーメッセージを選ぶと電話認証になる。「戻る」に化けてしまっているが、このボタンで「次へ」すすむ。

通常のパッケージ版ではインターネット経由でのライセンス認証は一度しか出来ない。多くのユーザーは電話認証を選ぶ必要がある。

電話認証に進んだわけだが、これも中々に酷い。位置関係が完全に崩れている。本来なら最初にドロップダウンリストボックスから匡と地域を選択すると、日本国内の電話認証のための電話番号が表示されるのだが、表示されない。仕方が無いのでインターネットでライセンス認証の電話番号(0120-801-734)を調べる。リンク先にOffice2016の記載は無いが、全てのプロダクトで共通の電話番号なので問題ない。

Aという表記の脇に、7桁の数字が9組ならんでいる。これがインストールIDなので自動応答のガイダンスに合わせて入力していく。実は自動応答でのライセンス認証は失敗する(ぉぃ)ので、エラーとなって失敗した後オペレーターが出るのでオペレーターに対応して貰う。

オペレーターから確認IDを教えて貰って入力していく。テキストボックスが8個並んでいる、ラベルの表記がずれているが、一番左がA、順にB~Hとなるので順番に入力していく。入力が済んだら「戻る」を押して「次へ」進もう。特に入力に誤りが無ければ、これでライセンス認証が終了する。

ダウンロードする時にファイル名の空白が+に置き換わる

ブラウザからファイルをダウンロードさせるために次のようなコードで処理すると、ファイル名に半角空白が含まれている場合に半角空白が+に置き換わってしまいます。

string sourceFile = @"D:\sample.dat";
string fileTitle = HttpUtility.UrlEncode("ダウンロード ファイル名.dat");
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileTitle);
Response.Flush();
Response.WriteFile(sourceFile);
Response.End();

原因はASP.NETのUrlEncodeの処理と、ブラウザ側のURLエンコードの処理が異なる事にあります。.NETのUrlEncodeは半角空白を+にエンコードしますが、逆にInternet Explroerは+を半角空白にデコードしません。

次のような行を追加して、UrlEncodeした文字列に含まれている+を%20に置き換えてしまえば解決します。

fileTitle = fileTitle.Replace("+", "%20");

混乱の原因はRFC1738→RFC1808→RFC2396→RFC3986と度々変更されたURLの仕様と、World Wide Web Consortium(W3C)のHTML4移行の仕様にあるFORMで入力したデータをエンコーディングに関する仕様の不整合にあるようです。

HTML4移行の仕様ではFORMに入力した空白を+に置き換える事が定義されてます。ASP.NETのUrlEncodeはFORMで使用するデータのエンコードを前提として実装しているため空白を+に置き換えているのに対して、Internet ExplorerはRFC2396まではURLで使用を認められてきた+をそのまま通す仕様になっている・・・と言う事のようです。UrlEncodeの仕様はどのレベルRFCに準拠するのか、FORMでの変換ルールに従うか否かといった、開発者の考え方によって様々な実装が生まれているのが現状です。

よってUrlEncodeを使う場合には、相手側の実装がどうなっているかを都度テストして合わせていく必要があります。なんとも混沌としていて残念な限りです。

参考URL:https://www.glamenv-septzen.net/view/1170#idb783f7

Windows Live MailからOutlook 2013へのエクスポート中にLive Mailが不正終了してしまう

Windows Live MailからOutlook 2013以降へのデータ移行

Windows Live Essentials 2012のLive MailからOutlook 2013等にエクスポートしたときに、途中で止まってしまう原因が漸く分かった。メールを開いたときに「メッセージが見つかりません。」と表示されるメールが原因のようだ。

Live Mailを長く使っていると「メッセージが見つかりません。」といったエラーを見たことがあると思う。Live Mailのデータファイルは、アプリケーションがフリーズしたり、パソコンの電源を突然切ったり等、正常な手順で終了できなかった場合に高い頻度で壊れる。ウィルス対策ソフトウェアがメールに含まれるウィルスを見つけてファイルを消した場合などにも壊れる。壊れた結果、左側の一覧には残っているけど、メール本体のデータが見つからなくなって、こんな表示になる。
エクスポートしようとしているフォルダに、このように壊れたメールが含まれていると、エクスポート中にLive Mailが終了してしまう。

「C:\Users\Windows\User名\AppData\Microsoft\Windows Live Mail\メールアカウント名」以下に保存されています。ここに各フォルダ毎に分かれてメールが保存されているので、例えば受信箱中のエラーデータを削除したいのであれば、「Inbox」をコピーして「Inbox2」というフォルダを作成します。その後にWindows Live Mailを起動すると、Inbox2と言うフォルダが新たに認識されて正常なデータのみが取り込まれ、「メッセージが見つかりません。」とエラーの出ていたメールは無視されます。その後、元々あった受信トレイ内のメールを削除し、Inbox2内のメールを受信トレイにコピーしてあげれば、メールボックスはきれいな状態に戻ります。

このようにしてメールボックスをきれいにした後に、Outlook 2013等にエクスポートすれば、エラーで中断すること無く移行できます。

Visual Studio 2015での.NET Core開発

.NET CoreはLinux環境で開発を・・・と思ったのだけど、結局使い慣れたWindowsに戻ってきました。.NET Core(Windows)の開発環境構築手順などを残しておきます。

1. .NET Core SDKのインストール
.NET DownloadsからWindows版の.NET Core 1.1 SDK – Installerをダウンロードしてインストールする。

2..NET Core tools preview for Visual Studioのインストール
.NET Core installation guideに従って.NET Core tools preview for Visual Studioをインストールします。これで新規プロジェクト作成時に.NET Coreプラットフォームを選択する事ができるようになります。

3. 新規にコンソールアプリケーションを作成して実行します。

といった感じで開発環境を作るだけならとっても簡単。ただし困りものなのが.NET Coreで使用できるライブラリの取捨選択・・・。
例えばHTTPクライアントを実装したい場合System.Net.WebClientは.NET Coreに対応しない。System.Net.Http.HttpClientは.NET Coreに対応するが個別にNuGetからダウンロードが必要。System.Data.SqlClientはNuGetからダウンロードすれば使えるけど、SqlDataAdapter クラスは存在しないのでDataSetを使うことは出来ない。AzureStorageの依存情報を見ると.NET Coreの記述が無いので使えないのかと思いきや、NuGetでダウンロードする前におまじないを書けば使えたりします。万事この調子なので慣れるまでは大分苦労しそうです。

Acrobat Readerのインストールに繰り返し失敗する

Adobe Readerの更新インストールなどを行っていると、再インストールに失敗することがあります。公式ページにはエラーになった場合は一度Adobe Readerをアンインストールするように記載されています。ですがアンインストールを行っても、再インストールに繰り返し失敗する場合があります。

そんな時には「Acrobat Reader Cleaner Tool」の出番です。インストールしていたAdobe readerのバージョンにあったCleaner Toolをダウンロードして管理者ユーザーで実行するとアンインストール時に残ってしまったゴミデータを削除してくれます。

その後、あらためてAdobe Readerの再インストールを試みてください。

参考:Acrobat Reader(Adobe Reader) および Acrobat 用の Cleaner Tool について(Windows)

.NET Coreを使ってみる(Ubuntu)

.NET CoreをUbuntuに導入して、現在Windows上で動作させているバッチ処理をLinuxに移すことを考えています。

.NET Coreのインストール方法はMicrosoftの.NET Core(https://www.microsoft.com/net/core#ubuntu)のページがわかりやすいです。

sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ xenial main" > /etc/apt/sources.list.d/dotnetdev.list'
sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893
sudo apt-get update
sudo apt-get install dotnet-dev-1.0.0-preview2-003131

以上でインストールは完了。
Ubuntu 14.xの場合には設定するリポジトリが次のように変わるので注意して下さい。

sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ trusty main" > /etc/apt/sources.list.d/dotnetdev.list'

Hellowordプロジェクトを作成して動作を確認します。
以下のコマンドで適当にディレクトリを作成して、新規プロジェクトを作成します。新規プロジェクトにはHellowordと表示する処理が既に記述されています。

mkdir hwapp
cd hwapp
dotnet new

後は以下のコマンドを実行すると、コンソールに”HelloWorld”と表示されます。

dotnet restore
dotnet run

続いて開発環境を用意します。Windows上で開発するか、Linux上で開発するか迷うところですが、デプロイ時のトラブルを避けるためにもターゲット環境上で開発することにします。
まずはVisual Studio Codeをインストールしていきます。Download Visual Studio Code(https://code.visualstudio.com/Download)からUbuntu用にdebファイルをダウンロードして以下のコマンドを実行します。

sudo dpkg -I code_1.5.3-1474533365_amd64.deb

Visual Studio Codeをインストールしたら、Visual Studio Codeを起動してメニューの「表示→拡張機能」から「C# for Visual Studio Code」をインストールしておきます。最後に「有効」ボタンを押すまで機能しないので、押し忘れないように。

.NET Coreのプロジェクトをビルドしたときに「1. The project has not been restored or restore failed – run `dotnet restore`~」等のエラーが表示される

.NET Coreのプロジェクトをビルドした時に下記のエラーが表示される場合があります。

error : Can not find runtime target for framework '.NETCoreApp,Version=v1.0' compatible with one of the target runtimes: 'win10-x64, win81-x64, win8-x64, win7-x64'. Possible causes:
error : 1. The project has not been restored or restore failed - run `dotnet restore`
error : 2. The project does not list one of 'win10-x64, win81-x64, win8-x64, win7-x64' in the 'runtimes' section.
error : 3. You may be trying to publish a library, which is not supported. Use `dotnet pack` to distribute libraries.

OS等の実行環境に依存するパッケージを追加している場合に表示されます。この場合にはproject.jsonに下記の様に「runtimes~」を追記し実行環境を明記します。

{
  "version": "1.0.0-*",
  "buildOptions": {
    "emitEntryPoint": true
  },

  "dependencies": {
    "Microsoft.NETCore.App": {
      "type": "platform",
      "version": "1.0.1"
    }
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": "dnxcore50"
    }
  },

  "runtimes": {
    "win10-x64": {}
  }
}

参考:Project.json Reference

.Net CoreでWindowsAzure.Storageを使用する

WindowsAzure.Storageが参照しているODataLibが.NET Coreに対応していないため、そのままNuGetパッケージをインストールするとエラーになります。WindowsAzure.Storageを.NET Coreで使用するには、project.jsonの下記の部分を変更し「portable-net451+win8」を追加します。

  "frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dnxcore50",
        "portable-net451+win8"
      ]
    }
  }

その後、あらためてWindowsAzure.StorageをNuGetからインストールすると正常に導入できます。

参考:Microsoft Azure Storage SDK for .NET (8.0.1)