« 2009年9月 | トップページ | 2009年11月 »

2009年10月31日 (土)

PowerShell 2.0があれば、バッチファイルからそのコンソールウィンドウを非表示/最小化/最大化/元に戻す。

コンソールウィンドウを非表示にします。

PowerShell -WindowStyle Hidden -Command Exit

コンソールウィンドウを最小化します。

PowerShell -WindowStyle Minimized -Command Exit

コンソールウィンドウを最大化します。

PowerShell -WindowStyle Maximized -Command Exit

コンソールウィンドウを元に戻します。

PowerShell -WindowStyle Normal -Command Exit

バッチファイルだけでなく、PowerShellスクリプトでも同じです。

2009年10月30日 (金)

PowerShell 2.0 PS1ファイルの関連付け

PowerShell 2.0の初期状態では、拡張子が仮設のファイルタイプへ向いているので、本来のファイルタイプへ向け直します。

[HKEY_CLASSES_ROOT\.PS1]
@="PS1_auto_file"

[HKEY_CLASSES_ROOT\.PS1]
@="Microsoft.PowerShellScript.1"

更に、ファイルタイプのデフォルト動詞が、メモ帳に向いているので、PowerShellに向け直します。

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell]
@="Open"

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell]
@="0"

更に、関連付けのコマンドラインが引数を忘れているようなので、%*を追加します。

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\0\Command]
@="\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" \"-file\" \"%1\""

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\0\Command]
@="\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" \"-file\" \"%1\" %*"

更に、ファイルをPS1ファイルにドロップするには、WSHのドロップハンドラを使用します。

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\ShellEx\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"

ただし、WSHのドロップハンドラはOpen動詞に作用するので、動詞の名前を入れ替えます。

0 → Open
Open → Edit
Edit → ISE

同時に、ファイルタイプのデフォルト動詞を戻します。

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell]
@="0"

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell]
@="Open"

2009年10月15日 (木)

GetCacheEntryInfoW()を使ってURLからキャッシュのパスを調べる。

GetCacheEntryInfoW()を使ってURLからキャッシュのパスを調べるVBAのサンプルです。

Option Explicit

Private Type FILETIME
  dwLowDateTime As Long
  dwHighDateTime As Long
End Type
Private Type INTERNET_CACHE_ENTRY_INFO
  dwStructSize As Long
  lpszSourceUrlName As Long
  lpszLocalFileName As Long
  CacheEntryType As Long
  dwUseCount As Long
  dwHitRate As Long
  dwSizeLow As Long
  dwSizeHigh As Long
  LastModifiedTime As FILETIME
  ExpireTIme As FILETIME
  LastAccessTime As FILETIME
  LastSyncTime As FILETIME
  lpHeaderInfo As Long
  dwHeaderInfoSize As Long
  lpszFileExtension As Long
  dwReserved As Long
  Buffer(0 To 1023) As Byte
End Type

Private Declare Function GetUrlCacheEntryInfo Lib "wininet.dll" Alias "GetUrlCacheEntryInfoW" (ByVal sUrlName As Long, lpCacheEntryInfo As Any, lpdwCacheEntryInfoBufferSize As Long) As Long

Public Function GetCacheFileName(ByVal lpszUrl As String) As String
Dim dwEntrySize As Long
Dim lpCacheEntry As INTERNET_CACHE_ENTRY_INFO
dwEntrySize = Len(lpCacheEntry)
If GetUrlCacheEntryInfo(StrPtr(lpszUrl), lpCacheEntry, dwEntrySize) Then
  GetCacheFileName = MidBW(lpCacheEntry.Buffer, lpCacheEntry.lpszLocalFileName - VarPtr(lpCacheEntry) - 80)
End If
End Function

Function MidBW(Bytes() As Byte, lb As Long) As String
If lb < 0 Then Exit Function
Dim s As String
s = Bytes
s = MidB(s, lb + 1)
MidBW = Left(s, InStr(s, vbNullChar) - 1)
End Function

Sub aaa()
Debug.Print GetCacheFileName(URL)
End Sub

2009年10月 7日 (水)

IE7/IE8のWinINet関数のANSI版(~A)では、シフトJISではなく、UTF-8を使う。

GetCacheEntryInfoA
RetrieveUrlCacheEntryFileA
DeleteUrlCacheEntryA
などのWinINet関数のANSI版(~A)でURLを指定するときは、シフトJISではなく、UTF-8を使います。
シフトJISだと見つかりません。

また、
FindFirstUrlEntryA
GetCacheEntryInfoA
RetrieveUrlCacheEntryFileA
などで得られるINTERNET_CACHE_ENTRY_INFO.lpszSourceUrlNameもシフトJISではなく、UTF-8です。
ところが、一方、INTERNET_CACHE_ENTRY_INFO.lpszLocalFileNameはシフトJISです。なんとも。。。

面倒なので、Unicode版(~W)を使ったほうがよさそう。

IE6で、どうだったかは不明。

2009年10月 6日 (火)

Vistaで、IEのキャッシュフォルダ(Temporary Internet Files)の実フォルダを開く。

IEのキャッシュフォルダ(shell:cache)は仮想フォルダで、なぜか実在するキャッシュファイルの一部しか見えません。
ならば。キャッシュフォルダの実フォルダを開こうとしても、shell:cache\Content.IE5の複数のサブフォルダに分かれています。
なので、エクスプローラでshell:cache\Content.IE5を開いても、サブフォルダが見えるだけです。
※フォルダオプション、「表示」で「すべてのファイルとフォルダを表示する」になってること。
そこで、「高度な検索」で、
「場所」「検索先の選択」に、shell:cache\Content.IE5 を入れて、
「インデックスのないファイル、...」をチェックし、
「名前」を空のままエンターします。
この検索条件を保存すると、検索フォルダができます。
ただし、これで見えるのは、「保護モード:無効」のコンテンツだけです。

Vistaでは、「保護モード:有効」のコンテンツは、shell:cache\Low\Content.IE5 にあります。
なので、同様に、shell:cache\Low\Content.IE5の検索フォルダを作ります。
あるいは、「検索先の選択」に、shell:cache\Content.IE5 と shell:cache\Low\Content.IE5 の両方を入れた検索フォルダを作ります。

※ IE8で、「保護モード:無効」の実フォルダが、shell:cache\Content.IE5 から "%temp%\Temporary Internet Files\Content.IE5" へ変わったようです。

2009年10月 5日 (月)

Vistaでは、IEのキャッシュフォルダ(Temporary Internet Files)で「保護モード:有効」のコンテンツが見えない。

巷では、保護モードを外せ、とか、信頼済みサイトに登録しろ、とかセキュリティを骨抜きにする俗説が流布されてますが、騙されてはなりません。

explorer.exeを「整合性レベル:低」で起動すれば、ちゃんと見えます。

LowCMD.exe /c start explorer.exe /separate,shell:cache

このショートカットを作るには、最小化で、

cmd.exe /c LowCMD.exe /c start explorer.exe /separate,shell:cache

2009年10月 4日 (日)

Vistaでは、WinINet関数で「保護モード:有効」のコンテンツが見えない。

FindFirstUrlEntry
GetCacheEntryInfo
RetrieveUrlCacheEntryFile
DeleteUrlCacheEntry
などのWinINet関数では、 「保護モード:有効」のコンテンツが見えません。

WinINet関数を使って、IEのキャッシュを一覧、削除、参照しているアプリは注意しましょう。

アプリを「整合性レベル:低」で起動すれば見えます。

LowCMD.exe /c hoge.exe

LowCMD.exe /c start hoge.exe

2009年10月 3日 (土)

ShellExecute()で「整合性レベル:低」のアプリを起動すると「開いているファイル - セキュリティの警告」ダイアログが出る。

これを迂回するには、ShellExecute()でなく、CreateProcess()で起動すればよい。

例えば、

cmd.exe /c LowCMD.exe

2009年10月 2日 (金)

Run Applications at a Low Integrity Level

アプリを「整合性レベル:低」で起動するにはどうするか?

まず、「整合性レベル:低」で動く LowCMD.exe を作ります。

copy c:\windows\system32\cmd.exe LowCMD.exe

icacls LowCMD.exe /setintegritylevel Low

この LowCMD.exe からアプリを起動すると、そのアプリプロセスも「整合性レベル:低」になります。

LowCMD.exe /c hoge.exe

LowCMD.exe /c start hoge.exe

参考
Designing Applications to Run at a Low Integrity Level
http://msdn.microsoft.com/en-us/library/bb625960.aspx

« 2009年9月 | トップページ | 2009年11月 »