この問題は2つのことで複雑になっています。
- UltraVNCは、64ビットWindowsのレジストリの64ビットビューに自分自身をインストールするため、両方のビューをクエリする必要があります。
- 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のドキュメントを参照してください。