2011-10-20 21 views
0

お客様のサイトでコンピュータを更新するために使用するInno Setupインストーラがあります。一般に2台のコンピュータがありますが、3台以上のコンピュータがあります。すべてがネットワーク化されており、まったく1つはヘッドレスです。Inno Setupでリモートマシンのレジストリにアクセスする方法

ヘッドエンド(これはヘッドレスの反対側の場合)のワークステーションでインストーラを実行するのは比較的簡単です。したがって、これらのコンピュータに関連付けられたすべてのタスクが実行されます。ヘッドレスワークステーションで実行する必要があるタスクもあります。一般に、これらは複数回実行できる迅速で簡単なタスク(小さなファイルのコピーとサービスの再開)です。

しかし、たぶん、再起動が必要なタスクなど、一度だけ実行するのが最も時間のかかる作業に遭遇することがあります。この特定のケースでは、壊れたバージョンのUltraVNCがインストールされているかどうかを判断する必要があります。私が知っている最善の方法は、ヘッドレスワークステーションのレジストリに問い合わせることです。残念ながら、RegQueryStringValueは、リモートマシン上のレジストリを照会するオプションを提供していません。

これを行うにはどうすればよいですか?

答えて

1

この問題は、二つのことによって複雑になる:

  1. UltraVNCのは、64ビット版のWindowsでレジストリの64ビットビューに自身をインストールし、私たちは両方のビューを照会する必要がある、と
  2. RemoteRegistry ISN Windows Vista以降ではデフォルトで実行されます。これは私が思い付いたものです

:次に

function RegConnectRegistry(machineName: String; hKeyRoot:Integer; var phKey: Integer): integer; 
    external '[email protected]'; 
function RegOpenKeyEx(hKeyRoot:Integer; subkey:string; reserved, access:integer; var phKey: Integer): integer; 
    external '[email protected]'; 
function RegQueryValueEx(hKey:Integer; value: String; reserved: integer; var pType: integer; data: string; var pDataLen:integer): integer; 
    external '[email protected]'; 
function RegCloseKey(hKey:Integer): integer; 
    external '[email protected]'; 

は、関数を呼び出すことは比較的簡単です。ほとんどのエラー処理は簡潔にするために省略されています。また、REG_SZ以外の値を読み取ろうとする試みも行われません。

<target>は、名前またはIPアドレスのいずれかのターゲットです。 <key><value>は、照会するリモートキーと値です。

procedure CheckRemoteVNC(); 
var 
    HKRM, key: Integer; 
    data: string; 
    dwType, dataLen, retVal: Integer; 
begin 
    data := '123456789'; { Padding. Digits so I can easily count how long it is. } 
    dataLen := 20 
    { Make sure the Remote Registry service is running } 
    Exec('sc', ExpandConstant('\\<target> start RemoteRegistry'), '', SW_HIDE, ewWaitUntilTerminated, retVal) 
    RegConnectRegistry('<target>', HKEY_LOCAL_MACHINE, HKRM) 
    if RegOpenKeyEx(HKRM, '<key>', 0, 1 {KEY_QUERY_VALUE}, key) = 2 {Bad registry entry} then 
    { Try the 64-bit view. } 
    retVal := RegOpenKeyEx(HKRM, '<key>', 0, 257 {0x101 == KEY_WOW64_64KEY | KEY_QUERY_VALUE}, key) 
    RegQueryValueEx(Key, '<value>', 0, dwType, data, dataLen) 
    data := Copy(data, 0, dataLen-1) 

    { Deal with the data appropriately. } 

    if key <> 0 then RegCloseKey(key) 
    if HKRM <> 0 then RegCloseKey(HKRM) 
end; 

詳細はMicrosoft's documentation on these functionsを参照してください。

0

おそらく最も簡単な方法は、レジストリAPIを直接使用してリモートサーバーを照会し、Innoに結果コードを返す小さなアプレットを作成することです。
もう1つの方法は、psexecなどを使用して、リモートサーバー自体で作業を行うアプリケーションを実行することです。

+0

Windowsに組み込まれているヘルパーアプリケーション以外の外部ヘルパーアプリケーションは、企業ポリシーのために苦痛です。私はPascalでそれを直接行うのではなく、 アプリをリモートで実行することが解決されました。 Psexecはうまく見えますが、それはWindowsに付属していない外部アプリです。つまり、痛みを感じます。 – DaleStan

+0

ヘルパーアプリは、インストーラ自体に埋め込まれ、必要なときに展開されます。 – Deanna

+0

はい、これも問題ではありません。どんなに世俗的であっても、社内ヘルパーアプリをビルドサーバーに追加する必要があります。 戸外のヘルパーの場合は、それを使用して最後にアップデートをリリースした後、少なくとも同じバージョンを見つけることができなければなりません。 – DaleStan

関連する問題