0

顧客サイトのコンピューターを更新するために使用するInnoSetupインストーラーがあります。通常、2台のコンピューターがありますが、3台以上の場合もあります。すべてがネットワーク化されており、1つだけがヘッドレスです。

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

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

これをどのように行うのですか?

4

2 に答える 2

1

この問題は2つのことで複雑になっています。

  1. UltraVNCは、64ビットWindowsのレジストリの64ビットビューに自分自身をインストールするため、両方のビューをクエリする必要があります。
  2. RemoteRegistryは、WindowsVista以降ではデフォルトで実行されていません。

これは私が思いついたものです:

function RegConnectRegistry(machineName: String; hKeyRoot:Integer; var phKey: Integer): integer;
  external 'RegConnectRegistryA@Advapi32.dll';
function RegOpenKeyEx(hKeyRoot:Integer; subkey:string; reserved, access:integer; var phKey: Integer): integer;
  external 'RegOpenKeyExA@Advapi32.dll';
function RegQueryValueEx(hKey:Integer; value: String; reserved: integer; var pType: integer; data: string; var pDataLen:integer): integer;
  external 'RegQueryValueExA@Advapi32.dll';
function RegCloseKey(hKey:Integer): integer;
  external 'RegCloseKey@Advapi32.dll';

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

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

procedure CheckRemoteVNC();
var
  HKRM, key: Integer;
  data: string;
  dwType, dataLen, retVal: Integer;
begin
  data := '12345678901234567890'; { 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のドキュメントを参照してください。

于 2011-10-20T12:50:01.123 に答える
0

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

于 2011-10-20T10:12:40.650 に答える