ODBC network skaner

Króciutki temacik, w jaki sposób można zeskanować partię maszyn pod kątem dostępności konkretnego źródła danych ODBC ? W moim przypadku musiałem znaleźć maszynę dostępną w Active Directory, która umożliwiłaby na obsługę bazy Access’a.

Aby móc tego dokonać należałoby  najpierw uzyskać listę dostępnych maszyn w AD.

$AD = ([ADSI]"LDAP://RootDSE").defaultNamingContext
$searcher=[adsisearcher]"(&(objectCategory=computer))"
$searcher.SearchRoot="LDAP://$AD"
$Computers = $searcher.FindAll()

Mając już informację gdzie będziemy szukać możemy przystąpić do zdalnego skanowania maszyn w sieci.

$ODBCList = @()
ForEach($Computer in $Computers) { #search engine.. }

Wstępnie musimy pobrać nazwę maszyny I sprawdzić czy jest ona aktualnie dostępna w sieci.

$ComputerName = $Computer.Properties.Item("cn")
If(Test-connection $ComputerName -Quiet) { #search engine.. }

Jeśli tak to przystępujemy do podłączenia się do rejestru zdalnego w odpowiednim kluczu węzła HKLM.

$Key = "SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers"
$Type = [Microsoft.Win32.RegistryHive]::LocalMachine

I pobieramy zawartość klucza.

$regKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($Type, $ComputerName)
$regKey = $regKey.OpenSubKey($Key)

Ostatecznie pobieramy wartości poszczególnych źródeł danych z każdej maszyny i dodajemy je do listy.

Foreach($val in $regKey.GetValueNames())
{
 $log = New-Object PSObject -Property @{
  ComputerName = $ComputerName
  ODBC = $val  
 } 
 $ODBCList += $log
}

Na zakończenie pozostaje nam tylko przefiltrowanie pozyskanej listy pod kątem źródła danych Access’a.

$ODBCList | Where-Object { $_.ODBC -match "Microsoft Access Driver" }
ODBC                                                        ComputerName
----                                                        ------------
Microsoft Access Driver (*.mdb)                             {TEST1}
Microsoft Access Driver (*.mdb)                             {TEST2}
Microsoft Access Driver (*.mdb)                             {TEST4}
Microsoft Access Driver (*.mdb, *.accdb)                    {TEST6}

Cały skrypt wygląda następująco:

$AD = ([ADSI]"LDAP://RootDSE").defaultNamingContext
$searcher=[adsisearcher]"(&(objectCategory=computer))"
$searcher.SearchRoot="LDAP://$AD"
$Computers = $searcher.FindAll()

$ODBCList = @()
$ComputerNumber = 0
$ComputerMaxNumber = ($Computers | Measure-Object).count
ForEach($Computer in $Computers)
{
 $ComputerName = $Computer.Properties.Item("cn")
 Write-Progress -Activity "Scaning... " -Status "[$ComputerNumber/$ComputerMaxNumber] $ComputerName" -PercentComplete ([int]($ComputerNumber/$ComputerMaxNumber * 100))

 If(Test-connection $ComputerName -Quiet)
 {
  $Key = "SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers"
  $Type = [Microsoft.Win32.RegistryHive]::LocalMachine
  
  Try
  {
   $regKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($Type, $ComputerName)
   $regKey = $regKey.OpenSubKey($Key)
   
   Foreach($val in $regKey.GetValueNames())
   {
    $log = New-Object PSObject -Property @{
     ComputerName = $ComputerName
     ODBC = $val  
    } #End New-Object PSObject
    
    $ODBCList += $log
   } #End ForEach $val in $regKey.GetValueNames()
  } #End Try
  Catch
  {
   Write-Warning "Can't access to remote regostry on $ComputerName."
  } #End Catch
  
 } #End If Test-connection $ComputerName -Quiet
 Else
 {
  Write-Warning "Can't access to $ComputerName. Probably is offline."
 } #End Else Test-connection $ComputerName -Quiet
 
 $ComputerNumber++
} #End ForEach $Computer in $Computers

$ODBCList | Where-Object { $_.ODBC -match "Microsoft Access Driver" }
Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s