주어진 exe / dll이 속하는 설치 관리자 패키지를 찾는 방법


11

MSI가 특정 dll 또는 exe를 시스템에 설치 한 것을 알고 싶습니다. Windows가 삭제 된 파일이 설치된 패키지에 속하는 경우 수정 된 파일임을 알고 있습니다. 실제로 파일을 삭제하지 않고 해당 정보를 쿼리 할 수 ​​있습니까? 파일이 속한 패키지를 확인하는 도구 또는 Win32 API가 있습니까?

답변:


7

결국 방법이있을 것 같습니다! 최근에 다음 하위 트리에서 Windows Installer가 설치 한 파일의 레지스트리 항목을 발견했습니다.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData

작은 Python 스크립트를 작성하여 저장된 정보를 사용하여 설치 프로그램에서 파일을 찾습니다.

> python windows-installer-file-search.py opus.dll
File: C:\Program Files (x86)\Mumble\opus.dll
Product: Mumble 1.2.13
Install user: S-1-5-18
Cached installer: C:\Windows\Installer\2f6b072.msi

https://github.com/Zero3/windows-installer-file-search에서 사용할 수 있습니다.


와. 2.5 년 후 당신은이 질문에 답을했습니다. 하위 트리를 살펴보면 Windows를 부팅하는 데 시간이 많이 걸리는 이유를 알았습니다. "응용 프로그램이 손상되었습니다. 디스크를 삽입하십시오"기능이 응용 프로그램을 실행할 때마다 작동하려면 메모리에 색인화되어야합니다.
wigy

6

건초 더미에서 그럴듯한 바늘을 찾아도 괜찮다면, 7-Zip 의이 빠르고 더러운 남용 은 효과가 있습니다.

7z.exe l -an -air!C:\Windows\Installer\*.msi > needlelist.txt

그런 다음 needlelist.txt텍스트 편집기에서 열고 검색 needlename.dll하면 7-Zip이 생성 한 목록에서 해당 .msi 패키지를 찾을 수 있습니다.

(참고 :이 방법은 이름이 .msi 인 파일을 포함하는 .msi 패키지를 알려주기 때문에 '더러운'방법입니다 needlename.dll. 그러나 대부분의 사용 사례에 적합합니다.)


실제로 이것은 7-Zip의 현명한 남용입니다. 설치 프로그램은 항상 MSI를 해당 C : \ Windows \ Installer 폴더에 복사합니까 아니면 우회 일 수있는 규칙입니까? 나는 다른 방법이 없다는 사실을 받아들이고 대답을 받아들이 기 전에 우아한 Win32 API를 기다리고 있습니다.
wigy

AFAIK Windows Installer는 항상 설치된 MSI를 폴더에 캐시합니다 ( superuser.com/questions/473569/… 참조 ). 그 이유는 논리적입니다. 설치 관리자는 제거 프로그램이기도합니다. 따라서 Windows는 사용자가 응용 프로그램을 제거하려고 할 때 제거하려면 알려진 위치에 제거 프로그램의 복사본이 필요합니다. 이 시점에서 원래 MSI가 몇 년 전에 삭제되었으므로 Windows는 설치 중에 사본을 저장합니다.
Zero3

API 관련 : 대부분의 Linux 배포판 등과 같은 Windows와는 달리 Windows (최소한 Windows 8 이전)에는 운영 체제에 적절한 패키지 관리 시스템이 내장되어 있지 않으므로 이와 같은 사항을 쿼리 할 수 ​​있습니다. 설치된 모든 MSI를 실행하여 내부에서 대상 파일을 검색하여 응용 프로그램을 만들 수는 있지만 (실제로 내 대답은 올바르게 구현되었습니다), 이것은 즉시 구현되지 않은 것으로 보입니다. 물론 틀렸을 수도 있습니다.
Zero3

글쎄, 나는 그것을 대답으로 받아들입니다. 우리는 이것에 대한 Win32 API가 없다는 것을 증명할 수는 없지만 MSI는 적절한 공용 API없이 프로세스로드에 어떻게 든 연결되어 있다고 생각했습니다.
wigy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.