この問題は、二つのことによって複雑になる:
- UltraVNCのは、64ビット版のWindowsでレジストリの64ビットビューに自身をインストールし、私たちは両方のビューを照会する必要がある、と
- 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を参照してください。
Windowsに組み込まれているヘルパーアプリケーション以外の外部ヘルパーアプリケーションは、企業ポリシーのために苦痛です。私はPascalでそれを直接行うのではなく、 アプリをリモートで実行することが解決されました。 Psexecはうまく見えますが、それはWindowsに付属していない外部アプリです。つまり、痛みを感じます。 – DaleStan
ヘルパーアプリは、インストーラ自体に埋め込まれ、必要なときに展開されます。 – Deanna
はい、これも問題ではありません。どんなに世俗的であっても、社内ヘルパーアプリをビルドサーバーに追加する必要があります。 戸外のヘルパーの場合は、それを使用して最後にアップデートをリリースした後、少なくとも同じバージョンを見つけることができなければなりません。 – DaleStan