2010-08-17 2 views
3

Microsoft는 최근 Excel 버전과 현재의 omacro 보안 수준을 읽을 수 있도록 오랫동안 (그리고 공식적으로 권장하는) 코드를 손상 시켰습니다. 작업하는 데 사용 무엇 Excel 버전 및 매크로 보안 수준을 얻는 방법

:
// Get the program associated with workbooks, e.g. "C:\Program Files\...\Excel.exe" 
SHELLAPI.FindExecutable('OurWorkbook.xls', ...) 

// Get the version of the .exe (from it's Properties...) 
WINDOWS.GetFileVersionInfo() 

// Use the version number to access the registry to determine the security level 
// '...\software\microsoft\Office\' + VersionNumber + '.0\Excel\Security' 

(나는 항상 보안 수준은 안전하지 않은 레지스트리 항목 년 동안 것을 즐겼다 ...) Office 2010의

, .XLS 파일은 지금 ""Microsoft Application Virtualization DDE Launcher "또는 sftdde.exe와 관련이 있습니다. 이 exe 버전 번호는 분명히 Excel 버전이 아닙니다.

내 질문 : 실제로 Excel을 시작하고 버전과 (OLE 된 CreateOle ('이 Excel.Application')를 사용하여) 보안 수준을 쿼리보다 깨끗하고 빠른,이

기타, Excel 2003부터 모든 버전에서 작동 할 수있는보다 안정적인 방법?

답변

4

사용

function GetExcelPath: string; 
begin 
    result := ''; 
    with TRegistry.Create do 
    try 
     RootKey := HKEY_LOCAL_MACHINE; 
     if OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe', false) then 
     result := ReadString('Path') + 'excel.exe'; 
    finally 
     Free; 
    end; 
end; 

는에 Excel.exe 파일의 전체 파일 이름을 얻을 수 있습니다. 평소처럼 GetFileVersionInfo을 사용하십시오.

내가 아는 한이 접근법은 항상 효과가 있습니다. OLE 된 CreateOle ('이 Excel.Application을'))를 사용하여

+0

감사합니다. Andreas. 그게 내가 필요한 것입니다. 닫힌 괄호가 잘못 배치되어 있습니다. 읽어야합니다 : 결과 : = ReadString ('Path') + 'excel.exe'; – RobertFrank

+0

@ Tom1952 : 매우 사실입니다. 수정 됨. –

+0

이 답변은 그 이상이라면 더 이상 정확하지 않습니다. 레지스트리 경로가 존재하지 않습니다. – GolezTrol

1

이 기능을 사용하는 같은 레지스트리 위치를 사용하여 Excel 버전을 설치 얻을 수있는

. 기본적으로이 함수 레지스트리 코드의 대부분을 복제해야합니다. Microsoft Process Monitor과 같은 도구를 사용하여 해당 함수 호출을 감시 할 수 있습니다. Windows가 설치된 Excel을 찾는 방법을 정확하게 확인한 다음 정확히 동일한 방식으로 수행합니다.

HKEY_CLASSES_ROOT\에서 레지스트리를 열고 "Excel.Application"으로 시작하는 모든 분기를 열거해야합니다. 이 내 워크 스테이션에서 예를 들어

난 단지 엑셀 2013이 설치되어 있고, 그 HKEY_CLASSES_ROOT \ Excel.Application.15

에 해당하지만 내 다른 워크 스테이션에 나는 다른 XLSX 구현을 테스트, 엑셀 2003과 엑셀 2010이 설치되어 이 두 가지에서 두 개의 레지스트리 키가 있습니다.

는 HKEY_CLASSES_ROOT \ Excel.Application.12 HKEY_CLASSES_ROOT \ Excel.Application.14

그래서, 당신은 그 이름, 점, 및 번호와 함께 모든 지점을 열거해야합니다.

참고 : HKEY_CLASSES_ROOT \ Excel.Application \ CurVer 키는 "기본"Excel이라는 이름을 가지지 만 여러 Excel이 설치된 경우 "기본값"은 모호합니다. 만약 당신이 신경 쓰지 않는다면 그 디폴트 값을 취할 수도 있고, 최대 엑셀 버전이나 최소값 등을 원할 경우 자신이 원하는 것을 선택할 수도 있습니다.

그런 다음 모든 특정 Excel 분기에 대해 기본 키의 CLSID 하위 분기를 읽어야합니다. 마찬가지로 HKEY_CLASSES_ROOT\Excel.Application.15\CLSID은 nil-named 키가 {00024500-0000-0000-C000-000000000046}과 같음 - 해당 인덱스를 문자열 변수로 가져옵니다.

그런 다음 두 번째 검색을 수행 - 그 지점이있는 경우

을 (인출 된 인덱스를 사용) HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\LocalServer 같은 이름의 브랜치로 이동 - C:\PROGRA~1\MICROS~1\Office15\EXCEL.EXE /automation

같은 것을 얻을 수있는 무기 호 명 "기본 키"값을 가져 오기

마지막 결과는 명령 행입니다. 파일 이름 (이 예제에서는 인용되지 않지만 인용 부호로 표시 될 수 있음)으로 시작하고 선택적 명령 행이옵니다. 명령 줄이 필요하지 않으므로 따옴표 붙은 초기 동위 기호를 추출해야합니다.

그런 exe 파일이 있는지 확인해야합니다. 그렇지 않으면 - 그렇지 않으면 시작 - 다른 Excel 버전에 대한 레지스트리를 확인하십시오.