ローカルグループポリシーエディター(gpedit.msc)が「エラーを特定できません」と表示されて起動できないときの対処

グループポリシーエディタ(gpedit.msc)を起動しようとしたところ下記のようなエラーが表示されて起動できませんでした。

 グループ ポリシー エラー
 このコンピューターのグループ ポリシー オブジェクトを開くことができませんでした。適切な権限がない可能性があります。
 詳細 - エラーを特定できません

ログオンしているアカウントはAdministratorsグループに所属しており管理減があるため、権限周りではなさそうでした。
調べてみると、グループポリシーの設定ファイルが読み込めないときにこのようなエラーとなるらしく、読み込み失敗するファイルを削除することで起動できるようになるようです。

対処としては、下記2つのファイルを削除すれば起動できました。
%SystemRoot%\System32\GroupPolicy\Machine\Registry.pol
%SystemRoot%\System32\GroupPolicy\User\Registry.pol

ただし、当然ながら設定ファイルを削除するため、すべての設定が削除されてしまいます。
設定情報が残っている場合はそれを元に、ない場合も下記のレジストリなどを参照しながら再設定が必要でした。
HKEY_LOCAL_MACHINE\SOFTWARE\Policies

DISMコマンドを使用してWindows 10イメージを修復する

Windows 10をアップグレードインストールなどしている場合に、ソフトウェアの行儀が悪いなどでOSが正常に動かなくなることがあります。
このような場合にWindowsのシステム修復機能というものがあり、システムファイルチェッカーツール(sfc.exe)を使用してWindowsのエラーを修復することができますが、その時にうまく実行できないときの対処です。


sfc /scannowはWindows 10が保存しているイメージファイルを元に、OSシステムファイルを修復・再インストールします。
sfcがうまく動かないということは、このイメージファイルを修復する必要があります。

まずWindows 10のDVDメディアを持っている場合はそれを読み込ませ、DVDを持っていない場合は下記より.isoファイルをダウンロードします。
・Windows 10 のディスク イメージ (ISO ファイル) のダウンロード

今回の場合はWin10_1607_Japanese_x64.isoというファイルで、これを選択して右クリック「マウント」を選択してください。

次にエクスプローラーでPCを開き、DVDのドライブ名を確認します。今回の場合はD:\ドライブとなります。


そして右下のWindowsマークを右クリックして「コマンドプロンプト(管理者)」を開き次のような文字列を入力してEnterキーを押します。赤字のD:\は先ほど確認したドライブ名なので、自分の環境に合わせて変更する必要があります。
DISM /Online /Cleanup-Image /RestoreHealth /source:WIM:D:\Sources\Install.wim:1 /LimitAccess

しばらく待つとWindows 10イメージファイルの復元操作が完了するので、もう一度「sfc /scannow」を実行すれば完了です。

Windowsのeventcreateコマンドにてソースパラメーターのエラーが出たときの対処

Windowsのコマンドプロンプトにて、イベントを記録するためにeventcreateコマンドを実行したときに、すでにあるイベントソースを指定すると次のようなエラーが表示されることがあります。

ERROR: Source parameter is used to identify custom applications/scripts only (not installed applications).
eventcreate /L Application /T Information /SO "hoge" /ID 1 /D "Information write."
エラー: インストールされているアプリケーションではなく、カスタム アプリケーションまたはスクリプトを識別するためだけに、ソース パラメーターが使用されます。

これは作成されているイベントソースへ、ソースを作成したプログラムからしかアクセスできないため起きるようです。今回の場合はPowerShellにて下記コマンドでソースを作成していました。
New-EventLog -LogName Application -Source hoge

修正するには、レジストリエディタより対象ソースにCustomSourceという名前で1の値を設定すればよいようです。今回はアプリケーションイベントのhogeというソースなので下記になります。
eventcreate_Source_error_2
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\hoge]
"CustomSource"=dword:00000001

その後、もう一度eventcreateコマンドを実行すると成功しました。
eventcreate_Source_error_3
eventcreate /L Application /T Information /SO "hoge" /ID 1 /D "Information write."
成功: 種類が 'Information' のイベントが、'Application' ログ内に、'hoge' をソースとして作成されました。

イベントログのアプリケーションにPerflibエラーID:1008が記録されるときの対処

システム起動時やパフォーマンスログ取得開始時に次のようなエラーが記録されることがあります。
Application_Perflib_1008_BITS
ログの名前: Application
ソース: Microsoft-Windows-Perflib
イベント ID: 1008
レベル: エラー
説明:
サービス "BITS" (DLL "C:\Windows\System32\bitsperf.dll") の Open プロシージャに失敗しました。このサービスのパフォーマンス データは利用できません。データ セクションの最初の 4 バイト (DWORD) に、エラー コードが含まれています。

これは、パフォーマンスモニタのカウンタ読み込みに失敗しているときに、利用できないパフォーマンスカウンタオブジェクトがある場合にエラーメッセージが発生します。
そのため、影響があるサービスのパフォーマンスモニタのカウンタをインストールまたは再インストールしてあげれば解消します。使わない場合はアンインストールもOKです。

今回の”BITS”の場合は、管理者として実行したコマンドプロンプトで下記を実行すれば直ります。
cd C:\Windows\inf\BITS\0411
lodctr bitsctrs.ini

Application_Perflib_1008_BITS_lodctr

備考:Application Center でパフォーマンス データ カウンタに関する Perflib のイベント ID 1008 エラー メッセージが表示される
https://support.microsoft.com/ja-jp/kb/299059

Windows Server 2012のXenAppやRemoteAppでテーマファイルが適用されない

Windows Server 2008や2012のローカルグループポリシーにて「特定のテーマを読み込む」を設定しても、XenAppの公開アプリケーションやRemoteAppのユーザにテーマが適用されない事象が発生します。
win2012_theme_1
テーマが適用されていないユーザが、サーバにリモートデスクトップ接続(mstsc)にてログオンするとテーマファイルが適用されます。
この事象は、テーマファイルの初期化をexplorer.exeが行っているため発生します。XenAppやRemoteAppはデスクトップ表示を行う必要がなく、explorer.exeが自動起動することはありません。

explorer.exeは新しいユーザがログオンしたタイミングで、ntuser.datを作成・読み込みした後にActive Setupといわれる初期化処理を行います。
Active Setupでのテーマファイル適用は下記コマンドにより実行されています。
"C:\Windows\System32\regsvr32.exe" /s /n /i:/UserInstall C:\Windows\system32\themeui.dll
そのため、ログオンスクリプトにてコマンドを実行してあげればテーマファイルがユーザに適用されます。

コマンドプロンプトを管理者として実行して「gpedit.msc」を起動して、[ユーザーの構成]の[Windowsの設定]にある「スクリプト(ログオン/ログオフ)」の「ログオン」を開きます。
win2012_theme_2
「追加」ボタンを押して、先ほどのコマンドを下記のように入れてあげれば設定完了です。
win2012_theme_3

設定をすぐに反映する場合には、コマンドプロンプトを管理者として実行して「gpupdate /force」を実行してください。

・Things to do when troubleshooting Internet Explorer Terminal Server and Profiles issues.
https://blogs.msdn.microsoft.com/askie/2012/09/13/things-to-do-when-troubleshooting-internet-explorer-terminal-server-and-profiles-issues/

BlatJをWindows Server 2012で使用した時に送信時間が1時間ずれる時の対処

BlatJとは、Windows NT時代からよく使われているバッチファイルから任意のメールアドレスにメールを送ることのできる実行ファイルです。
最近はVBScriptやPowerShellにて送付することが多いと思うので出番は少ないですが、環境リプレース時にバッチファイルの改修が面倒な際にはそのまま使ってしまったりします。

BlatJはWindows Server 2008やWindows Server 2012でも動作可能ですが、メールを送ると下記のように送信時間が1時間ほどずれてしまいます。
BlatJ_0
もともとWindows NTで動作するものですので、Windowsの夏時間(サマータイム)検出がうまくいかずにこのような事象が出るようです。

対処としては、夏時間を使用しないように設定変更してあげれば可能です。

まず日本時間では夏時間は設定できないため、コントロールパネルの「日付と時刻」より「タイムゾーンの変更」を開きます。
BlatJ_1

タイムゾーンで、例えば「(UTC-08:00)太平洋標準時(米国およびカナダ)」を選択して、「自動的に夏時間の調整をする」のチェックを外して「OK」を押し設定を反映させます。
BlatJ_2 BlatJ_3
もう一度「タイムゾーンの変更」を開き、元の「(UTC+09:00)大阪、札幌、東京」へ設定を戻してあげれば完了です。
BlatJ_4

これでBlatJからメールを送信しても時間がずれなくなります。

ちなみに、タイムゾーンの一覧情報は下記のレジストリに格納されています。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
現在設定されているタイムゾーンは下記に保存されています。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation

コマンドで「ネットワークドライブの割り当て」ダイアログを表示する

NetworkDrive_add_01
CIFS共有をドライブにマウントする際、通常はコンピューターのツールより「ネットワークドライブの割り当て」を行いますが、この操作を別の処理から呼び出すことができないか調べてみました。

まずプログラムからは、Windows APIの「WNetConnectionDialog」関数を使用すると表示できるようです。
https://msdn.microsoft.com/ja-jp/library/Cc447010.aspx
C#なら下記のようにmpr.dllを読み込んで実行すれば表示できます。
[DllImport("mpr.dll", CharSet = CharSet.Ansi)]private static extern int WNetConnectionDialog(IntPtr HWND, int dwType);
WNetConnectionDialog(this.Handle, RESOURCETYPE_DISK);

単純なプログラムやバッチファイル・VBscriptなどからは、下記コマンドを実行することで表示できます。
Windows 7のコマンドプロンプトにて確認済みです。
RUNDLL32 SHELL32.DLL,SHHelpShortcuts_RunDLL Connect

実行すると、次のように「ネットワークドライブの割り当て」が表示されました。
NetworkDrive_add_02

C#.NETのHttpClientにてCookieを使った通信を行いたい

アプリケーションでWeb上の操作を疑似的に行いたい時などで、クッキー情報を取り出して値を確認したい時などがあります。
そういった場合は、HttpClientHandlerのUseCookiesを有効にしてあげれば、あとは.Netがよきに計らってくれるらしい。
基本的にはtoriimiyukkiの日記さんに書かれていることですが、個人的な用途としてメモ書きです。


// クッキーを使いたいためUseCookies = trueに設定
using (var handler = new HttpClientHandler() { UseCookies = true })
using (var client = new HttpClient(handler) { BaseAddress = new Uri("https://yamahide.biz/") })
{
// ヘッダーの設定
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:35.0) Gecko/20100101 Firefox/35.0");
client.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
client.DefaultRequestHeaders.Add("Accept-Language", "ja,en-us;q=0.7,en;q=0.3");
client.DefaultRequestHeaders.Add("Referer", "https://yamahide.biz/login/");

// GETでリクエスト
var result = client.GetAsync("https://yamahide.biz/login/").Result;

// POSTの内容を作成
var content = new FormUrlEncodedContent(
new Dictionary
{
{ "UserID", "user01"},
{ "PASSWORD", "Passw0rd"},
});
// POSTでリクエスト
result = client.PostAsync("https://yamahide.biz/login/", content).Result;

// クッキーの値を抜き出す
CookieCollection cookies = handler.CookieContainer.GetCookies(new Uri("https://yamahide.biz/login/"));
string ASPNETSessionId = "";
foreach (System.Net.Cookie cook in cookies)
if (cook.Name == "ASP.NET_SessionId")
{
ASPNETSessionId = cook.Value;
}
}