PowerShell: Margus Nairis, AD-FindInstalledPrograms.ps1

From ICO wiki
Revision as of 17:24, 7 January 2012 by Mnairis (talk | contribs)
Jump to navigationJump to search
<#
.SYNOPSIS
    Leiab ActiveDirectoryst kõik masinad ja kontrollib kas nende installitud programmide seas on mõni otsitavat stringi sisaldav.

.DESCRIPTION
    Leiab ActiveDirectoryst kõik masinad ja kontrollib kas nende installitud programmide seas on mõni parameetriga määratud stringi sisaldava nimega.
    Algselt püüdsin teha asja WMI objekti kasutades ent siis selgus, et Get-WmiObject -Class 'Win32_Product' -computerName $computer ei näita kõiki installitud programme vaid ainult msi installitud asju.
    Seepärast on kasutatud registritest lugemist.

    Autor: Margus Nairis AK41
    
.NOTES
    Autor : Margus NAiris AK41
    
.LINK

    http://itcollege.ee/~mnairis
    
.EXAMPLE
    
    Kasutades ilma parameetrita otsib AD masinate seast installitud programme ja 'vilistab' kui leiaab mõne neist, mis sisaldab stringi 'torrent'.
    PS> ADComputers_4.ps
    
    Kasutades parameetriga FindString otsib AD masinate seast installitud programme ja 
    'vilistab' kui leiaab mõne neist, mis sisaldab parameetris kasutatud stringi.
    Järgnevad kaks näidet leiavad näiteks Oracle Virtual Boxi masinatest.
    
    PS> .\AD-FindInstalled.ps1 rtu
    PS> .\AD-FindInstalled.ps1 -FindString rtu
    
.PARAMETER FindString

    Peab olema string tüüpi, mitte kohustuslik (vaikimisi on siis 'torrent')
    
#>

param (
[Parameter(Position=0, Mandatory=$false)]
[string] $FindString = "torrent"
)

#### See tingimus muutub mõtetuks, sest parameetris juba määratud vaikimisi väärtus.
#if($FindString -eq $null){
#    $FindString = "torrent"
#}

# impordin ActiveDirectory Mooduli Serveri jaoks.
 Import-Module ActiveDirectory
 
$computers = Get-ADComputer -Filter * 
$kogus = $computers.Length
$otsitav = $FindString
$loendur = 0
$compuArray = @()

Write-Host
Write-Host "Otsin installitud programme ja '" -NoNewline;
Write-Host " vilistan " -NoNewline -ForegroundColor red -BackgroundColor yellow; 
Write-Host "' kui leian otsitavat stringi (" -NoNewline;
Write-Host $otsitav.ToLower() -ForegroundColor Yellow -NoNewline;
Write-Host ") sisaldava programmi."

Write-Host
Write-Host "ActiveDirectorys: " $kogus "masinat." -ForegroundColor Yellow 
Write-Host "Ole kannatlik, kuniks kõik masinad on läbi käidud." -ForegroundColor Yellow

# määran registri haru 
$Branch='LocalMachine' 

# määran registri alamharu
$SubBranch="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"

FOREACH ($pc in $computers) 
{ 
    write-host
    write-host $kogus
    write-host "Masin: " $pc.Name
    
    try{
    $registry=[microsoft.win32.registrykey]::OpenRemoteBaseKey('LocalMachine',$pc.Name) 
    }catch{}
    $registrykey=$registry.OpenSubKey($Subbranch) 
    $SubKeys=$registrykey.GetSubKeyNames() 


    Foreach ($key in $subkeys) 
    { 
        $exactkey=$key 
        $NewSubKey=$SubBranch+"\\"+$exactkey 
        $ReadUninstall=$registry.OpenSubKey($NewSubKey) 
        $Value=$ReadUninstall.GetValue("DisplayName") 
        
        if($Value -ne $null){
             if( !$Value.ToLower().Contains($otsitav.ToLower()) ){
                Write-Host "Installitud: " $Value
                }
             
             if( $Value.ToLower().Contains($otsitav.ToLower()) ){
                  #Write-Host $pc.Name "Sisaldab installitud programmide hulgas otsitava stringiga ($otsitav) programmi!" -foregroundcolor red -backgroundcolor yellow
                  Write-Host "Leitud Sobivus : " -NoNewline; Write-Host $Value -foregroundcolor red -backgroundcolor yellow
                  $loendur ++
                  if( $compuArray -notContains $pc.Name ){
                        $compuArray += $pc.Name
                    }
                }
        }

    } 
    $kogus --
}

Write-Host
Write-Host "Otsimine lõpetatud, leitud $loendur sobivust järgmistes masinates:" -ForegroundColor yellow
foreach($compu in $compuArray){
    Write-Host $compu -ForegroundColor red
}

Write-Host
exit