ラベル レジストリー の投稿を表示しています。 すべての投稿を表示
ラベル レジストリー の投稿を表示しています。 すべての投稿を表示

2014年4月22日火曜日

◆レジストリへのアクセス

レジストリへのアクセスは専用のプロバイダーが用意されていて、通常のファイルシステムのようにアクセスできる。
 特に難しいわけではないのでこれまでも適当に使ってきたが、それほど頻繁に使うわけでもないので、結局毎回試行錯誤しながら使うことになる。

そこで、いまさらの感はあるが使い方を自分用にメモしておく。

基本的には「Get-Item」と「Get-ItemProperty」を使ってアクセスする。(と思う)

以下のレジストリにアクセスしてみる。

image

「Get-Item」で「TortoiseSVN」キーにアクセスするとこんな感じになる。

PS>Get-Item hkcu:software\TortoiseSVN


    Hive: HKEY_CURRENT_USER\software


SKC  VC Name                           Property
---  -- ----                           --------
  7  12 TortoiseSVN                    {SoundUtils KeyPath, TortoiseSVN,

「SKC」というのは「SubKeyCount」の略で、以下の部分の個数を表す。
image

「VC」は「ValueCount」の略で、以下の部分の個数を表す。
image

「プロパティ」は以下を指すようだ。
image

 

「Get-Item」を「Get-ChildItem」に変えると以下のようにサブキー毎に同様の情報が表示される。

PS>Get-ChildItem hkcu:software\TortoiseSVN


    Hive: HKEY_CURRENT_USER\software\TortoiseSVN


SKC  VC Name                           Property
---  -- ----                           --------
  0  17 DiffTools                      {.dll, .exe, .doc, .docm...}
  1   1 History                        {lastCheckoutPath}
  0   4 LastUsedUUIDsForGrouping       {0, 1, 2, 3}
  0   1 LogCache                       {Version}
  0   6 MergeTools                     {.doc, .docm, .docx, .ods...}
  0   6 StatusColumns                  {CommitDlgVersion, CommitDlg,
  1   0 TortoiseProc                   {}

プロパティの一覧は以下のように取得

PS>(Get-item hkcu:software\TortoiseSVN).property
SoundUtils KeyPath
TortoiseSVN
TortoiseMerge
TortoiseIDiff
DiffProps
CurrentVersion
CheckNewerWeek
RepoBrowserColumnWidth
ErrorOccurred
NewVersionLink
NewVersionText
NewVersion

これでも同じっぽい

PS>(Get-item hkcu:software\TortoiseSVN).getvaluenames()

ただし、どちらも取得できるのは文字列の情報。

以下の一行の情報をオブジェクトで取得できるのかと思ったのだが、どうにも見当たらない。
image

とりあえずダイレクトにバリューを取得するには、

PS>(Get-item hkcu:software\TortoiseSVN).GetValue("CheckNewerWeek")
16

ここで、「Get-ItemProperty」を試してみると、こちらは以下のオブジェクトを返してくる。(1つのオブジェクト)
「Get-Item」と違ってサブキーの情報は取得できない。
名前の通り、自身のプロパティに特化した情報といった感じ。
image

左側の「名前」(プロパティ)をその名の通りプロパティとして持っているオブジェクトなので、ダイレクトにバリューを取得するには、

PS>(Get-ItemProperty hkcu:software\TortoiseSVN).CheckNewerWeek
16

となる。

これを踏まえて「Get-Item」を使って一覧表示するには、プロパティ(ValueName)を纏めて取得し、その一つずつに対して「GetValue()」でバリュー、「GetValueKind()」で種類を取得する。
image

image

種類が不要であれば「Get-ItemProperty」だけで事足りる。(が、こちらは余計なプロパティも含まれる)

PS>Get-ItemProperty hkcu:software\TortoiseSVN


PSPath                 : Microsoft.PowerShell.Core\Reg
PSParentPath           : Microsoft.PowerShell.Core\Reg
PSChildName            : TortoiseSVN
PSDrive                : HKCU
PSProvider             : Microsoft.PowerShell.Core\Reg
SoundUtils KeyPath     : keypath
TortoiseSVN            : TortoiseSVN
TortoiseMerge          : TortoiseMerge
TortoiseIDiff          : TortoiseIDiff
DiffProps              :
CurrentVersion         : 1.8.4.24972
CheckNewerWeek         : 16
RepoBrowserColumnWidth : 00000000000000000000000000000
ErrorOccurred          : 0
NewVersionLink         :
http://tortoisesvn.net
NewVersionText         : A new version of TortoiseSVN
NewVersion             : 1.8.6.25419

2014年2月20日木曜日

◆ダウンロードフォルダーのパスを取得する

以下の記事を読んでいて気づいたこと。
Unblocking Download Files - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources

ダウンロードフォルダーのパスを「$Home\Downloads」で取ってきているが、私の環境では取得できなかった。

私は基本的にプロファイルにぶら下がったフォルダーはすべてDドライブに移動しているので「D:\Downloads」になっている。

全うな取得方法を探してみたのだが、スペシャルフォルダーとかには「Downloads」は見当たらない。

止む無く、レジストリーを見渡したらIEのキーにDownloadsがあったのでとりあえずそれを使う事とした。

PS>$ieRegKey = "hkcu:\Software\Microsoft\Internet Explorer\Main"
PS>(get-itemproperty $ieRegKey)."Default Download Directory"
D:\Downloads

もう少し全うな方法があるのかしらん・・・

2012年8月30日木曜日

◆プロダクトキーを表示する2

会社の調査でなぜかOSとOfficeのプロダクトキーを報告せよとのお達し。
年季の入ったPCを使っている我々としては既に忘却の彼方・・・。

以前書いたPowerShell: ◆プロダクトキーを表示するが役に立つときが来たかと思ったのだが、OSはとりあえず良いとしてOfficeが厳しい。
リンクを張っていたサイトはリンクが切れていた(><)

調べてみるとここら辺How to get MS Office product key - Powershell.com – Powershell Scripts, Tips and Resourcesが引っ掛かるのだが、どうにもこうにもインストールしていると思しき候補のキーとどれも一致しない。
いくつかのPCでも同様だったのでダメっぽい(何か環境が合わないのだろう)

OfficeのバージョンやOSのバージョンで微妙に違う感じもある。

プロダクトキーという性格上の問題なのか、あまり明確な情報が見当たらない。
仕方がないのでフリーソフトを探しているとProduKey - Recover lost product key (CD-Key) of Windows/MS-Office/SQL Serverがメジャーっぽい。

自宅で試したところOK。

さて会社でっと思ったらプロキシーのMcAfee君がダウンロードさせてくれない。
image

どうもその性質上ブロックしてしまうウィルスソフトがいくつかあるようだ。

さすがに自宅から持ち込むわけにはいかないので、ここで挫折。

誰かPowerShellのサンプルを書いてくれないかしら・・・。
(単にレジストリーの場所の問題のような気もするが・・・)

2012年6月15日金曜日

◆レジストリ (規定)のPropertyType(種類)を変更する

SharePointの作業をしていて、手順書に以下のような作業が載っていた。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office Server\14.0\Search\Setup\ContentIndexCommon\Filters\Extension\.pdf
値が ”{E8978DA6-047F-4E3D-9C78-CDBE46041603}”である必要があります。違う値が入っている場合は、この決められた値に変更します。

まずは、該当の場所に「.pdf」キーを作成する。
すると以下の様なデフォルト値が作成される。
image

この値に”{E8978DA6-047F-4E3D-9C78-CDBE46041603}”を指定してあげれば良さそうだが、他の拡張子の設定値を見るとどれも「種類」が「REG_SZ」ではなく「REG_MULTI_SZ」になっている。
そこで、なんとかこれを「REG_MULTI_SZ」にしようと思ったのだが、どうにもこうにもやり方が見つからない。(もしかするとGUIではできないのかも)

仕方がないのでPowerShellで更新することに。

(既定)の更新の仕方や、種類の指定の仕方を調べて以下のような感じになった。

New-Itemproperty "HKLM:\SOFTWARE\Microsoft\Office Server\14.0\Search\Setup\ContentIndexCommon\Filters\Extension\.pdf" "(default)" -propertytype MultiString -value {E8978DA6-047F-4E3D-9C78-CDBE46041603}

(既定)はそのまま(default)で良いようだ。
また、「種類」はGUIでは以下の様になっているが、
image

PropertyTypeとしては以下から対応する値を指定する。
image

2012年5月7日月曜日

◆プロダクトキーを表示する

ネットを見ていたらインストール済みWindowsのプロダクトキーを表示するサンプルが紹介されていた。

私自身は必要になったことは無いのだが、調べてみるとこいつを表示するフリーソフトなんかもあったりするのでそれなりに需要はあるのかもしれない。

そんなわけで一応メモしておく。

Getting Windows Product Key - Power Tips - Powershell.com Powershell Scripts, Tips and Resources

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020

function Get-ProductKey {   
   
$map="BCDFGHJKMPQRTVWXY2346789"
    $key = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
    $value = (get-itemproperty $key).digitalproductid[0x34..0x42]
 
   
$ProductKey = ""
 
   
for ($i = 24; $i -ge 0; $i--
) { 
     
$r = 0
 
     
for ($j = 14; $j -ge 0; $j--
) { 
       
$r = ($r * 256) -bxor $value[$j]
 
       
$value[$j] = [math]::Floor([double]($r/24
)) 
       
$r = $r % 24
 
      } 
     
$ProductKey = $map[$r] + $ProductKey
 
     
if (($i % 5) -eq 0 -and $i -ne 0
) { 
       
$ProductKey = "-" + $ProductKey
 
      } 
    } 
   
$ProductKey
} 
Get-ProductKey

また、同様のサンプルで「Office」のプロダクトキーなんかも表示できるようだ。
Finding Office and Windows Keys with Powershell

2011年12月20日火曜日

◆アプリケーションをアンインストールする

win32_productでオブジェクトが取得できれば、Uninstallメソッドを呼ぶだけなので話は簡単だ。

アンインストールサンプル
  1. $p = gwmi win32_product -filter "name = 'SyntaxHighlighter'"
  2. $p.Uninstall()

しかし、インストーラの形式によってはwin32_productでは取得できないアプリケーションも存在する。

その場合は仕方が無いのでレジストリーから情報を取得することになる。
PowerShell: ◆インストールされているソフトウエアの一覧を取得(64ビットOS対応版)

このレジストリーを見てみると、「UninstallString」というのがあって、いかにもこれを実行するとアンインストール出来そうな雰囲気が漂っている。
image

レジストリーを使ったサンプル
  1. $appName = "SyntaxHighlighter"
  2. $path = "\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
  3. $wow = "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
  4. $patharray = ("HKLM:" + $path),("HKCU:" + $path)
  5. if(Test-Path $wow){$patharray += $wow}
  6.  
  7. $AppObj = Get-ChildItem -Path $patharray |
  8.    %{Get-ItemProperty $_.PsPath} |
  9.    ?{$_.DisplayName -eq $appName}
  10. if ($AppObj.UninstallString)
  11. {
  12.     Invoke-Expression $AppObj.UninstallString
  13. }else{
  14.     Write-Warning "($appName) is not exist"
  15. }

しかし、残念ながらこれは上手く動作してくれない。
「UninstallString」はそのままでは使えないらしい。
「MsiExec」のヘルプを見ながら試した所、こんな感じのようだ。

  1. MsiExec.exe /X'{00045CD3-323F-419D-A7BF-D3E8838E580D}'

なおかつ、常にMsiExecを使うというわけでもない(インストーラによる)ので、どのアプリケーションでもOKというスクリプトは断念した。(すべてのインストーラパターンを調べれば出来るのかもしれないが今のところ必要性を感じていないので)

2011年4月21日木曜日

◆Excelの実行パスを取得する(Get-ItemProperty)

「ファイル名を指定して実行」にてExcelと打つとExcelが起動する。
同様にNotepadと打つとメモ帳が起動する。

コマンドプロンプトからNotepadと打つとメモ帳が起動する。
同様にExcelと打つとExcelが起動!しない。

というのは以前から知っていたのだが必要に迫られなかったので特に理由は調べていなかった。
「ファイル名を指定して実行」はPath環境変数以外にも何かを参照しているのだろう、そして何かと言えばレジストリだろうとは思っていたが。

今回、必要に迫られてレジストリキーを調べてみた。
以下のキーに値(名前)Pathの値データとして持っているようだ。
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe"

なのでそいつをGet-ItemPropertyで取ってくれば良い。

$xlsPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe"

Get-ItemProperty $xlsPath -Name Path | select path

(Get-ItemProperty $xlsPath -Name Path).Path

Pathパラメータを指定すると値が文字列で取れるのかと思ったが、返ってくるのはPsObjectなので結果のPathプロパティを参照する必要がある。

2011年2月18日金曜日

◆インストールされているソフトウエアの一覧を取得(64ビットOS対応版)

以前作ったPowerShell: ◆インストールされているソフトウエアの一覧を取得は64ビットOSではうまく動作しなことが判った。(64ビットアプリしか表示されない)

64ビットOS上で動く32ビットアプリケーション(Wow64)は別のレジストリーで管理されているようだ。
そこで64ビットOSに対応するよう改修してみた。

001
002
003
004
005
006
007
008
009
010

$path = "\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
$wow = "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
$patharray = ("HKLM:" + $path),("HKCU:" + $path)
if(Test-Path $wow){$patharray += $wow}

Get-ChildItem -Path $patharray |
    %{Get-ItemProperty $_.PsPath} |
    ?{$_.systemcomponent -ne 1 -and $_.parentkeyname -eq $null} |
    sort displayname |
    select DisplayName,Publisher

2010年6月12日土曜日

◆インストールされているソフトウエアの一覧を取得

以下のレジストリーに情報がある。
HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

20100612172230
サブキーをすべて取得して、それぞれの値(名前)がDisplayNameとPublisherをのものをSelectすれば「アプリケーションの追加と削除」に表示されるものと同じものが取得できるっぽい。
Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall  |
  %{Get-ItemProperty $_.PsPath}  |
  sort displayname  |
  select DisplayName,Publisher


<結果>
20100612173029
<アプリケーションの追加と削除>
20100612173133
比べてみると、いくつか余計なものが含まれている。
アプリケーションの追加と削除では「更新プログラム」は別途表示されているのと、システムコンポーネントが除外されているようだ。
レジストリーを眺めてそれっぽいプロパティ(systemcomponentとparentkeyname)でフィルターしてみる。

Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall |
    %{Get-ItemProperty $_.PsPath} |
    ?{$_.systemcomponent -ne 1 -and $_.parentkeyname -eq $null} |
    sort displayname |
    select DisplayName,Publisher

だいたいよさそうだが、一部(Google Chrome)のアプリケーションはHKLMではなくHKCUに情報がある。
そこで両方のキーから取ってくるように修正。

$path = "\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
$path1 = "HKLM:" + $path
$path2 = "HKCU:" + $path
Get-ChildItem -Path ($path1,$path2) |
    %{Get-ItemProperty $_.PsPath} |
    ?{$_.systemcomponent -ne 1 -and $_.parentkeyname -eq $null} |
    sort displayname |
    select DisplayName,Publisher

これで、一応「アプリケーションの追加と削除」に表示されるものと一致した。

あくまでも私の環境で一致しただけなのですべての環境でOKかは分からないが当たらずとも遠からずだろう。

--

追記
http://mtgpowershell.blogspot.jp/2011/02/64os.html