registry からプログラムを探して uninstall する方法 (Windows)

Windows で [Programs and Features] (プログラムと機能) から uninstall した際に、途中で失敗 (fail) し、エントリーだけが registry に残ってしまう場合があります。

このような場合に、手動で uninstaller を再実行 (retry) する方法をメモします。

  1. Registry Editor (regedit.exe) を起動し、下記の Key を展開します
    HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Uninstall
  2. Key の中の DisplayName (REG_SZ) を確認して、対象の product を探します
  3. 下記の通り実行します
    MsiExec.exe /x {the above key} /lvx <log file name>.log

    例えば、下記のような感じです。
    MsiExec.exe /x {1D8E6291-B0D5-35EC-8441-6616F567A0F7} /lvx VC_Uninstall.log

 

Advertisements

Windows でファイルを掴んでいるプロセスを特定する

こんにちは。以下、自分の備忘 (メモ) のために記載しておきます。

Windows で特定のファイルを使用している (握ったままの) プロセスを特定する手順についてメモします。

1. コマンド プロンプトを管理者権限で起動し、以下を実行します。

openfiles /local on

2. マシン (Windows) を再起動します。

3. コマンド プロンプトを管理者権限で起動し、以下を実行してプロセスを特定します。
必要に応じ、特定されたプロセスの削除や、サービスの停止などの、対処をおこないます。

openfiles | findstr /i <file or folder name>

4. コマンド プロンプト (管理者権限で起動) で以下を実行します。

openfiles /local off

5. マシン (Windows) を再起動します。

 

Web ページ全体をイメージとして取得する

こんにちは。個人の備忘 (メモ) として記載します。

サイズの小さな Web ページの場合には Windows の Print Screen などを使って画面のイメージ (スナップショット) を取得できますが、ここでは、縦に長い Web ページの全体をイメージとして取得する方法についてメモします。

  1. Internet Explorer で Web ページを表示して [印刷] を選択します。
  2. 下図のような印刷用のダイアログが表示されますが、この際、Windows 7 以上などの場合には XPS Writer が選択できると思いますので、これを選択します。
  3. 上記を選択すると、保存先のフォルダーやファイル名を指定するダイアログ (ファイル ダイアログ) が表示されます。
    ここで、[ファイルの種類] として .xps を選択して XPS ファイルを保存します。
  4. あとはプログラムなどを書いて XPS を変換できますが、お手軽なものとしては、オンライン (Web 上) の XPS の Image Converter などもあると思いますので、こうしたツールを使ってイメージに変換することができます。

 

空きディスク容量 不足の際の不要ファイル (フォルダ) の特定方法

こんにちは。以下、私自身の備忘 (メモ) のために記載します。

Windows でディスク容量が不足し、ドライブのクリーンアップをおこなっても思うように容量が減らない場合、自力で どのファイル (またはフォルダー) が原因か特定する必要があります。
こうした場合に役立つコマンドを以下に記載します。

 

ディスクを食っているファイルのトップ 10 を取得 (Windows コマンド)

ディスクを消費しているファイルのトップ 10 を取得する Windows コマンドのサンプルです。

ls -recurse | sort -des length | select -first 10 name, fullname, length

 

ディスクを食っているサブディレクトリをサイズの順にソート (Windows PowerShell)

上記のコマンドでは、例えば、フォルダーが犯人のケース (1 つ 1 つのファイルは小さいが、フォルダー全体が肥大化している場合) には対応できません。
下記では、特定のフォルダー直下のサブフォルダーのサイズ (含まれるすべてのサブフォルダーとファイルのサイズ合計) をソートすることで、上から順番に原因となるフォルダーやファイルを特定していくことができます。(下記では Windows PowerShell を使用しています。)

function dusage{ 
  param([String]$tgtDir = (pwd).Path) 
  
  filter dusage_filter{ 
    $sum = (dir -literalpath $_.FullName -recurse -force -erroraction silentlycontinue | 
      measure-object Length -sum).Sum 
    $result = New-Object Object |  
      Add-Member NoteProperty Folder $_.FullName -PassThru |  
      Add-Member NoteProperty Size $sum -PassThru 
    return $result 
  } 
  
  dir $tgtDir -force -erroraction silentlycontinue | 
    ? {$_.PSIsContainer} | dusage_filter 
}

dusage -tgtDir "c:work" | sort -des size

 

参考 : よく容量を食っているもの

よくディスク容量を浪費しているものとして ゴミ箱のファイル、Web ブラウザーのキャッシュ、OS のテンポラリー一時ファイルなどがありますが、これらはドライブのクリーンアップ ツールで消去できます。
以下は、こうしたもの以外でディスクを食っているファイルやフォルダーの例を記載します。

Outlook データファイル (%userdata%AppDataLocalMicrosoftOutlookoutlook.ost)

Outlook ではメールが溜まると、もちろんディスクを圧迫していきますが、Outlook 2010 などではメールを削除しても一度膨らんだデータファイルは減りません。
サイズを減らすには、削除済みフォルダーの中も含めいったん不要なメールを完全に削除してから、Outlook の設定でデータファイルの [圧縮する] を実行します。

また、Outlook データファイルを空いているドライブなどに移動する際には、以下の通り実行します。(以下は Outlook 2007 の場合です。)

  • 握っているファイルを離すため、いったん Outlook を閉じます。
  • [コントロール パネル] を開き、[メール] をクリックし、[電子メール アカウント] ボタンを押します。
  • 使用中のアカウントをダブルクリックして、表示される画面で [Exchange キャッシュ モードを使う] のチェックを外して [次へ] ボタン、[完了] ボタンを押します。
  • 再度、アカウントをダブルクリックしてウィンドウを開き、今度は [詳細設定] ボタンを押します。
  • 表示される画面で [詳細設定] タブを選択します。
  • [オフライン フォルダ ファイルの設定] ボタンを押します。
  • [オフラインを無効にする] ボタンを押します。(確認ダイアログが表示されるので、[はい] を押します。)
  • 再度、[オフライン フォルダ ファイルの設定] ボタンを押します。
  • [参照] ボタンを押して、新たに保存したい場所 (E:Outlookoutlook.ost など) を設定してダイアログボックスを閉じます。(新たにファイルを作成するか確認するダイアログ ボックスが表示されるので、[はい] ボタンを押します。)
  • [Exchange キャッシュ モードを使う] のチェックをオンにして、[OK] ボタンを押してウィンドウを閉じます。(以降、[次へ] ボタン、[完了] ボタンを押して、ウィザードを完了させます。)
  • Outlook を起動すると、同期を開始します。

Outlook オンライン アドレス帳 (%userdata%AppDataLocalMicrosoftOutlookudetails.oab)

大企業などの場合、Outlook によりダウンロードされたアドレス帳も膨大なデータをローカルに保持する結果となります。
肥大化してしまったアドレス帳ファイルは、以下の方法で空いているドライブなどに移動できます。(Outlook 2007 の場合)

  • ファイルを握らないように、Outlook を閉じます
  • regedit (レジストリ エディター) を起動して、下記を表示します
    HKEY_CURRENT_USERSOFTWAREMicrosoftWindows NTCurrentVersionWindows Messaging SubsystemProfiles<Profile_name>13dbb0c8aa05101a9bb000aa002fc45a
  • レジストリ エディターの [編集] – [新規] で文字列値を追加し、値の名前を「001e660e」とします
  • 上記で追加した 001e660e を右クリックして [修正] を選択し、保存先 (変更先) の新しいフォルダの名前 (例 E:Outlook など) を入力します
  • レジストリ エディター (regedit) を終了する
  • Outlook を再び起動します
  • Outlook の [ツール] – [送受信] – [アドレス帳のダウンロード] を選択します
    (Outlook 2010 の場合は、[送受信] タブの [送受信グループ] – [アドレス帳のダウンロード] を選択)
  • 表示されるダイアログ ボックスで、[完全な詳細情報] を選択し、[OK] ボタンを押します
  • 古いファイルを削除します

検索インデックス (%programdata%MicrosoftSearchDataApplicationsWindowsWindows.edb)

Windows の検索インデックスもディスク浪費の原因となります。
インデックスの場所を他の空いているドライブなどに変更したい場合は、コントロール パネルから、[インデックスのオプション] を選択して、[詳細設定] でインデックスの場所を変更できます。

Windows のバージョン管理

Windows Vista、Windows 7 などで C ドライブのバージョン管理が有効になっている場合、ディスク圧迫の原因となります。
バージョン管理が不要な場合は、C ドライブのプロパティ画面を使って履歴を無効化できます。

 

Windows の VHD ブートの構成方法

こんにちは。

自分のための備忘 (メモ) として、Windows における VHD ブート (OS のマルチブート) の構成手順をメモしておきます。

 

現在のブート パーティションの確認

現在のブート パーティションを確認するには、OS 上からコマンド プロンプトを起動して以下の通り実行します。

bcdedit /enum

 

Windows のインストール DVD から VHD ブートを構成する

Windows のインストール DVD から VHD ブート用の .vhd (または .vhdx) ファイルを作成して VHD ブートを構成する手順です。

1. Windows を DVD からインストール開始します

2. インストールの途中でコマンド プロンプトを表示します

  • [コンピューターを修復する] を選択して、表示されるダイアログボックスでラジオボタンを選択
  • 表示されるダイアログボックスで [コマンドプロンプト] を選択

3. コマンド プロンプトで以下を実行して仮想ディスクを作成します。

diskpart
create vdisk file=C:VHDtest.vhd maximum=40000 type=expandable

上記の例では、40 GB の可変長の vhd (40 GB 固定ではなく、内容量が 15 GB の場合は 15GB のサイズを割り当て、起動時に 40 GB に拡張) を C:VHD^test.vhd として作成しています。
固定長の場合は、expandable ではなく fixed とします。

なお、C ドライブなどが仮想的に割り当てられている場合があるのでドライブ文字に注意してください。例えば、OS 起動時に C ドライブであっても、このコマンド プロンプト上では D ドライブとして認識されている可能性があります。その場合には D ドライブとして設定します。

4. コマンド プロンプトで以下を実行して、上記のディスクにアタッチします。

select vdisk file=C:VHDtest.vhd
attach vdisk
exit

5. インストーラを終了せず、DVD のドライブに移って、インストールを継続します。例えば、コマンド プロンプトで下記の通り実行します。(下記では、インストール DVD のドライブを E ドライブと仮定します。)

e:
setup.exe

6. 以降、インストーラーの手順に沿って新規インストールします。この際、上記の vhd ディスクがパーティションとして認識されるため選択します。

7. インストールが完了したら、新しいブートパーティションができています。

 

バックアップ (コピー) した VHD や、Hyper-V で作成した VHD (ディスク) を VHD ブートで使用する

この方法は、ゲスト OS に一度でもスナップショットを作成した場合には不可ですので注意してください。
また当然ですが、仮想ハードディスクの最大サイズが物理ディスクを超えている場合も不可です。(起動時に Expand されるため)

1. ゲスト OS を起動し、以下のレジストリーの値を 0 に設定します。

HKEY_LOCAL_MACHINESystemCurrentControlSetServicesMsahciStart

2. 上記のゲスト OS の vhd をコピーします。今回、C:VHDtest.vhd にコピーしたと仮定します。

3. コマンド プロンプトを表示して、以下のコマンドを実行し、現在の OS のエントリをコピーします。

bcdedit /copy {current} /d "Windows Test"

この際、「エントリは {yyyyyyyy-yyyy-yyyyy-yyyyy-yyyyyyyyyyyyy} に正常にコピーされました」と出力される GUID をコピーしておいてください。

4. 以下のコマンドを実行して、.vhd をブート デバイスとして構成します。なお、下記で、GUID として、上記でコピーした内容を設定してください。

bcdedit /set {yyyyyyyy-yyyy-yyyyy-yyyyy-yyyyyyyyyyyyy} device vhd=[C:]VHDtest.vhd
bcdedit /set {yyyyyyyy-yyyy-yyyyy-yyyyy-yyyyyyyyyyyyy} osdevice vhd=[C:]VHDtest.vhd
bcdedit /set {yyyyyyyy-yyyy-yyyyy-yyyyy-yyyyyyyyyyyyy} detecthal yes

 

ASP.NET による HTTP Request のキャプチャー

こんにちは。

ASP.NET を使って、HTTP の Request をキャプチャー (Capture) するコードです。
例えば、Microsoft Azure にホストして Remote Debug することで、どんな要求が渡されているか確認できます。(まあ、ログを取れば良いのですが、たまに必要になるんです。この投稿は公開せず、自分へのメモのために掲載しておきます。)

まず、クラスを追加して、以下の IHttpModule クラスを実装します。

. . .
using System.Text;
. . .

public class MyTrackModule : IHttpModule
{
  public void Init(HttpApplication context)
  {
    context.BeginRequest += context_BeginRequest;
    context.EndRequest += context_EndRequest;
  }

  void context_BeginRequest(object sender, EventArgs e)
  {
    HttpApplication application = (HttpApplication)sender;
    HttpContext context = application.Context;
    string method = context.Request.HttpMethod;
    string url = context.Request.Url.AbsoluteUri;
    string querystring = context.Request.QueryString.ToString();
    StringBuilder headerBuilder = new StringBuilder(); 
    foreach (string key in application.Request.Headers.Keys)
    {
      headerBuilder.Append(key);
      headerBuilder.Append(": ");
      headerBuilder.Append(application.Request.Headers[key]);
      headerBuilder.Append("n");
    }
    string headers = headerBuilder.ToString();
    byte[] bytes = application.Request.BinaryRead(application.Request.ContentLength);
    string body = Encoding.ASCII.GetString(bytes);
    application.Request.InputStream.Position = 0;

    // print (log) : method, url, querystring, headers, body
    . . .

  }

  void context_EndRequest(object sender, EventArgs e)
  {
    // No code
  }

  public void Dispose()
  {
    // No code
  }
}
. . .

あとは、Web.config に下記の通り設定して、この Custom Module を使用するように設定して終了です。

ASP.NET MVC などの場合には、Views フォルダーにも Web.config があるので注意してください。(Views の Web.config も書き換えておきます。)

<?xml version="1.0"?>
<configuration>
  . . .

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="MyTrackModule"
        type="WebApplication1.MyTrackModule" />
    </modules>
    . . .
  </system.webServer>
</configuration>

定番の Windows コマンド備忘録

こんにちは。(やはり、ブログに書いておくことにしました . . .)

ご存じの通り Server Core は、Windows Server 2008 R2 で .NET 開発者にとっても無関係なものではなくなりました。いままでは “Developer” エバンジェリストの私としては遠くから見ていた Server Core でしたが、そんなわけで、この環境で開発者の皆様向けに配置 / 開発 / デバッグ などのノウハウをいつかお届けすべく格闘しています。

自分はコマンド大好き人間で結構使ってきた “つもり” でしたが、甘かったです。「コマンド縛り」 というのがこんなにやっかいなものであることに痛感です。例えば「怖いから、まずは Windows Update を当ててからにしよう !」と思った瞬間に、「で、Windows Update を強制的に当てるにはどうしたら良いの ???」、「当たったかどうかどこで確認するの ???」といった具合。
「リモートから管理ツールとかでつないで UI で管理すれば ?」と言われるかもしれませんが、一度その味をしめるとまた同じ時に悔しい思いをするので意地になって調べることにしました。

奥主 が記載した「Windows Server Core と IIS」や、安納ブログServer Core のチームブログ なども参考にメモしてみた、Server Core の設定で出くわした、もしくは出くわしそうなコマンド (メモ) を私なりに以下にまとめておきます。 

  • マシンをシャットダウン : shutdown /s
  • マシンを再起動 : shutdown /r
  • ログオフ : logoff
  • コンピュータ名の変更 (ワークグループの場合) : netdom renamecomputer <current computername> /NewName:<new computer name>
  • コンピュータ名の変更 (ドメイン参加の場合) : netdom renamecomputer <current computername> /NewName:<new computer name> /UserD:<domain><username> /PasswordD:*
  • マシンをドメインに参加させる : netdom join <current computername> /domain:<domain> /userd:<domain><username> /password:*
  • ドメインから抜ける : netdom remove
  • 役割の追加 : Start /w ocsetup <RolePackage>

    <RolePackage> については下記を参照
    http://blogs.technet.com/server_core/archive/2006/06/02/431995.aspx

  • 機能の追加 : Start /w ocsetup <OptionalFeaturePackage>

    <OptionalFeaturePackage> については下記を参照
    http://blogs.technet.com/server_core/archive/2006/06/02/431995.aspx
    http://blogs.technet.com/server_core/archive/2008/11/25/net-2-0-and-server-core-in-windows-server-2008-r2.aspx
    http://blogs.technet.com/server_core/archive/2008/12/19/net-3-0-and-3-5-in-windows-server-2008-r2-server-core.aspx

  • 役割と機能の一覧 : oclist
  • アカウント (ユーザー) の一覧 : net user
  • アカウント (ユーザー) の情報 (所属グループ、など) : net user <accountname>
  • アカウント (ユーザー) の追加 : net user <accountname> <password> /add
  • アカウント (ユーザー) のパスワード変更 : net user <accountname> <new_password>
  • アカウント (ユーザー) の名前の設定 : net user <accountname> /fullname:<fullname>
  • アカウント (ユーザー) のパスワードを無期限にする (2012/01/10 修正、下記コメント参照) :
    net user <accountname> /expires:never wmic useraccount where “Name='<accountname>'” set PasswordExpires=FALSE
    (ただし、domain account (Active Directory) の場合には不可。Group Policy 設定で、既定のドメイン ポリシーの [Maximum password age] を 0 に設定するなどしてください)
  • アカウント (ユーザー) の削除 : net user <accountname> /delete
  • アカウント (ユーザー) をグループに追加する : net localgroup <groupname> /add <domain><username>
    (domain group への追加方法については下記参照)
  • Active Directory でドメイン グループを追加する。例えば、example.com ドメインの Users に、「Test Group」のグループ (グローバルのセキュリティ グループ) を作成する場合は下記の通り :
    dsadd group cn=”Test Group”,cn=Users,dc=example,dc=com -scope g
  • Active Directory のドメイン グループにユーザーを追加する。例えば、example.com ドメインの Domain Admins グループにドメイン ユーザー testuser を追加する場合は下記の通り :
    dsmod group “cn=Domain Admins,cn=Users,dc=example,dc=com” -addmbr cn=testuser,cn=Users,dc=example,dc=com
  • ネットワークの設定の確認/変更 :
    netsh interface ipv4 (IPv6 の場合は「ipv6」) で使用できるコマンドをご確認ください (すみません、ここでは、説明省略します)
  • ファイアウォールを無効にする : netsh firewall set opmode disable
  • リモートデスクトップ接続を有効にする :
    cscript %windir%system32SCRegEdit.wsf /ar 0
    cscript %windir%system32SCRegEdit.wsf /cs 0
  • スクリーンセーバーをオフにする :
    下記の安納のブログを参照してください。
    http://blogs.technet.com/junichia/archive/2007/08/10/windows-server-2008-server-core.aspx
  • 画面サイズを変更する :
    下記の安納のブログを参照してください。
    http://blogs.technet.com/junichia/archive/2008/07/04/change-resolution-of-Server-Core-on-Hyper_2D00_V.aspx

     

  • 地域と言語のオプションを確認/設定 : control intl.cpl
  • システムのプロパティを確認/設定 : control sysdm.cpl
  • システム情報の表示 : systeminfo
  • 電源オプションの確認 :
    powercfg /list
    powercfg /query <上記で表示される GUID>
    (一覧の見方 : AC は電源に接続, DC はバッテリー駆動. 表示は 16 進数)
  • 電源オプションの設定変更 (Vista 以降のスリープのタイムアウト設定含む) :
    「電源接続」の値の場合 : powercfg /setacvalueindex <Scheme GUID> <Sub GUID> <Setting GUID> <10 進の value>
    「バッテリー駆動」の値の場合 : powercfg /setdcvalueindex <Scheme GUID> <Sub GUID> <Setting GUID> <10 進の value>
  • 日付と時刻の確認 / 設定 : control timedate.cpl
  • インストールされているアプリケーションの一覧 : wmic product get name /value
  • アプリケーション (.msi) のインストール : msiexec /i <MsiName>
  • インストールされているアプリケーションのアンインストール : wmic product where name=”<ApplicationName>” call uninstall
  • Windows Update の自動更新 (午前 3 時) の有効化 :
    cscript c:windowssystem32scregedit.wsf /au 4
    net stop wuauserv
    net start wuauserv
    (詳細は http://blogs.technet.com/server_core/archive/2007/01/26/windows-update-and-more-wmic-samples.aspx を参照)
  • Windows Update の強制確認/インストール : wuauclt /detectnow
    (詳細は http://blogs.technet.com/server_core/archive/2007/01/26/windows-update-and-more-wmic-samples.aspx を参照)
  • Windows Update の実行結果の確認 : notepad c:windowswindowsupdate.log
  • 更新 / ホットフィックスの適用 : wusa <MsuName> /quiet
  • インストールされているサービスの一覧 : sc query state= all (イコールのあとに空白があるので注意 !)
  • サービスの開始 : net start <servicename>
  • サービスの停止 : net stop <servicename>
  • サービスのスタートアップ (起動) 方法を設定 (下記、イコールのあとに空白があるので注意 !) :
    sc config <servicename> start= auto    rem– 自動の場合
    sc config <servicename> start= demand    rem– 手動の場合
    sc config <servicename> start= disabled    rem– 無効化の場合
  • インストールされているドライバの一覧 : sc query type= driver (イコールのあとに空白があるので注意 !)
  • イベントログの確認 : wevtutil qe /f:text <system/application/etc>
    (詳細は、http://blogs.technet.com/server_core/archive/2006/09/25/458931.aspx を参照)
  • OS のアクティベーションをする : cscript slmgr.vbs -ato
  • OS のアクティベーションを確認する : cscript slmgr.vbs -did
  • 共有の開始 :
    net share <共有名>=<フォルダのフルパス> /grant:everyone,full
    (ここでは、共有の権限として Everyone にフルコントロールの権限を設定)
  • 共有の停止 : net share <共有名> /delete
  • ネットワークドライブの割り当て : net use <ドライブ> <共有フォルダ>
  • ネットワークドライブの切断 : net use <ドライブ> /delete
  • 特定のディレクトリ下のファイルをファイル名で検索 : dir /s “<ディレクトリー>” /b | findstr /c:”<検索文字列>” /i
  • 特定のディレクトリ下のファイルに含まれる文字列で検索 : findstr /c:”<検索文字列>” /i /s “<ディレクトリー>*”
    (ただし、大文字・小文字を区別する場合、/i は不要)