2011-10-20 5 views
0

고객 사이트에서 컴퓨터를 업데이트하는 데 사용하는 Inno 설치 프로그램이 있습니다. 일반적으로 두 대의 컴퓨터가 있지만 때로는 세 대 이상이 있습니다. 모두 네트워크로 연결되어 있으며 정확히 하나는 헤드리스입니다.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에 결과 코드를 반환하는 것입니다.
또 다른 옵션은 psexec 등을 사용하여 원격 서버 자체에서 작업을 수행하는 앱을 실행하는 것입니다.

+0

Windows에 내장 된 것 외의 외부 도우미 응용 프로그램은 회사 정책으로 인해 고통입니다. 나는 오히려 파스칼에서 그것을 직접 할 것입니다. 앱을 원격으로 실행하는 문제가 해결되었습니다. Psexec은 멋지지만 Windows와 함께 제공되지 않는 외부 앱이므로 통증이 있습니다. – DaleStan

+0

도우미 응용 프로그램은 설치 프로그램 자체에 포함되어 필요할 때 추출 할 수 있습니다. – Deanna

+0

네,하지만 이것도 문제가 아닙니다. 아무리 평범한 가라면 사내 도우미 앱을 빌드 서버에 추가해야합니다. 집 밖의 도우미를 위해, 우리는 그것을 사용하는 업데이트를 마지막으로 릴리스 한 후 적어도 1 년 동안 똑같은 버전을 찾을 수 있어야합니다. – DaleStan