ProgramingTip

대부분을 협곡 프로그램 감지

bestdevel 2020. 12. 12. 12:13
반응형

대부분을 협곡 프로그램 감지


사용자 컴퓨터에 특정 프로그램이 설치되어 있는지 여부와 경우 버전을 감지하는 프로세스를 개발해야합니다. 문제가없는 것이없는 프로그램을 찾아서 제공 목록이 필요하다고 생각합니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

내 첫 번째 생각은 제거 항목의 것을 확인하는 것이 감지하려는 앱 중 하나에없는 것입니다. 항목을 만들기 위해 응용 프로그램을 사용하는 모든 표준의 표준 위치는 어디입니까?


사용자 별 설정은 HKCU \ Software에, 시스템 별 설정은 HKLM \ Software에 기록해야합니다. 이러한 키 아래에서 구조 [software vendor name]\[application name](예 : HKLM\Software\Microsoft\Internet Explorer가 가장 일반적 일 수 있지만 이는 자연 의 법칙이 아닌 관습 일뿐입니다 .

많은 (대부분?) 응용 프로그램도에 제거 항목을 추가 HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\[app name]하지만 모든 응용 프로그램이 작업을 수행하는 것은 아닙니다.

이것이 가장 중요한 키입니다. 그러나 재고의 내용이없는 것입니다. 응용 프로그램이 한 번 설치 수동으로 삭제 또는 제거 프로그램이 모든 흔적을 제거하지 않을 수 있습니다. 확실하게 선택 파일 시스템을 확인하여 여전히 존재하는지 확인하십시오.

편집하다 :

그룹의 구성원 인 경우 하이브 관리자 HKEY_USERS확인할 수 있습니다. 각 사용자의 HKCU가 실제로 그곳에 상주합니다 (사용자 SID를 알고 모두 만나보고 함).

참고 : @Brian Ensink가 말했듯이 "설치됨"은 약간 모호한 개념입니다. 사용자가 사용하는 것을 의미하는 것입니까? 일부 소프트웨어도 전혀 일치에 기록하지 않습니다 : "휴대용 애플 것"에 대한 검색 미디어 (CD / USB)에서 직접 실행 가능하고 수정 프로그램을 확인하지 않습니다 . 또한, 네트워크 디스크, 사용자가 다운로드 한 모든 항목, 인터넷에서 세계에서 액세스 할 수있는 Windows 공유를 검사해야 할 수도 있습니다 (예, 많은 \\live.sysinternals.com\tools것들이 사용하는 방법). 이 방향에서는 정책에 의해 금지되지 않는 한 사용자가 수있는 실제 제한이 없습니다.


64 비트 시스템에서 x64 키는 다음과 같습니다.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

대부분의 프로그램이 여기에 작성됩니다. 열쇠를보세요 :DisplayName DisplayVersion

마지막이 항상 설정되는 것은 아닙니다!

64 비트 시스템에서 x86 키 (일반적으로 더 많은 항목 포함)는 다음과 가변합니다.

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall

MSI API를 사용하여 Windows Installer에 의해 모든 항목을 열거 할 수 있습니다 컴퓨터에서 사용할 수있는 모든 소프트웨어가 모든 것이 사용할 수 있습니다. 필요한 것에 대해 더 많이 알지 "설치됨"이라는 개념이 약간의 모호에 대해 생각합니다. 배포하는 방법에는 여러 가지가 있습니다.


응용 프로그램에는 필요하지 않습니다. 실제로 많은 응용 프로그램이 전혀 필요 없습니다. U3 USB 스틱이 좋은 예입니다. 이들의 프로그램은 파일 시스템에서 실행됩니다.

대부분의 대부분의 응용 프로그램은 제거 할 수 있습니다. 이것은 실제로 사용자 별 및 시스템 별 키 쌍입니다 (HKCU / HKLM-Piskvor는 HKLM 하나만 참조했습니다). 그러나 (항상) 설치 디렉토리를 제공합니다.

HKCU에있는 HKEY_CURRENT_USER경우 "현재 사용자"를 의미한다는 것을 인식해야 합니다. 다른 사용자는 자신의 HKCU 항목과 소프트웨어를 가지고 있습니다. 당신은 그것을 사용할 수 없습니다. 모든 HKEY_USERS 하이브를 읽는 것은 로밍 프로필이있는 기업 네트워크에서 재앙입니다. 원격 [미국 | 중국 | 유럽] 사무실에서 1000 개의 계정을 가져오고 싶지 않습니다.

응용 프로그램이 설치되어 있고 어디에 있는지 알 수 있고 "버전"이 없을 수 있습니다. 가장 좋은 소스는 실행 파일의 "버전"리소스입니다. 모든 버전에서 버전 리소스를 추출해야하며, 충돌이 발생하는 경우 합당한 결정을 내려야합니다.

그래서-행운을 빕니다. 실패하는 방법에는 여러 가지가 있습니다.


PowerShell 펼쳐 놓고 많은 것을보고 소규모 프로그램 세부 정보를 찾을 수 있습니다. 아래 펼쳐지는 모든 프로그램의 전체 목록이 포함 된 파일을 생성합니다. ".ps"확장자로 저장하고 파일을 두 번 클릭하십시오.

#
# Generates a full list of installed programs.
#

# Temporary auxiliar file.
$tmpFile = "tmp.txt"

# File that will hold the programs list.
$fileName = "programas-instalados.txt"

# Columns separator.
$separator = ","

# Delete previous files.
Remove-Item $tmpFile
Remove-Item $fileName

# Creates the temporary file.
Create-Item $tmpFile

# Searchs register for programs - part 1
$loc = Get-ChildItem HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall
$names = $loc |foreach-object {Get-ItemProperty $_.PsPath}
foreach ($name in $names)
{
    IF(-Not [string]::IsNullOrEmpty($name.DisplayName)) {      
        $line = $name.DisplayName+$separator+$name.DisplayVersion+$separator+$name.InstallDate
        Write-Host $line
        Add-Content $tmpFile "$line`n"        
    }
}

# Searchs register for programs - part 2
$loc = Get-ChildItem HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
$names = $loc |foreach-object {Get-ItemProperty $_.PsPath}
foreach ($name in $names)
{
    IF(-Not [string]::IsNullOrEmpty($name.DisplayName)) {      
        $line = $name.DisplayName+$separator+$name.DisplayVersion+$separator+$name.InstallDate
        Write-Host $line
        Add-Content $tmpFile "$line`n"
    }
}

# Sorts the result, removes duplicate lines and
# generates the final file.
gc $tmpFile | sort | get-unique > $filename

HKEY_CURRENT_USER \ Software \ Microsoft \ Installer \ Installer \ 제품을 확인해야 할 수도 있습니다.


설치된 프로그램에 특정한 것을 찾는 것이 더 잘 작동하는 것처럼 보이지만 HKCU \ Software 및 HKLM \ Software가 찾아야합니다.


Win32_Product는 모든 것을 표시하지 않고 MSI 설치 프로그램을 통해 설치된 소프트웨어 만 표시합니다 (내가 알 수있는 한).

거기에 표시되지 않는 다른 설치 프로그램을 통해 설치되는 많은 소프트웨어 패키지가 있습니다. 다른 방법이 필요합니다.


HKEY_CURRENT_USER \ Software \ Microsoft \ Windows NT \ CurrentVersion \ AppCompatFlags \ Compatibility Assistant \ Persisted

참고 URL : https://stackoverflow.com/questions/429738/detecting-installed-programs-via-registry

반응형