If you want to import a larger bunch of SNMP-devices in to OpsMgr you will probably go thru the disovery wizard way to many times.
Instead of walking thru that wizard every time I asked the network team to write a CSV-file with all the devices and then used this function to import them.
Function Add-SnmpDevice {
PARAM (
[Parameter(Mandatory=$true )][string] $FromIpAddress,
[Parameter(Mandatory=$true )][string] $MonitoringProxy,
[string] $ManagementServer,
[string] $ToIpAddress = "",
[string] $SnmpCommunityString = "public",
[int32] $SnmpVersion = 2
)
# Single ip ?
If ($ToIpAddress.Length -eq 0) {
$ToIpAddress = $FromIpAddress
}
# Check SNMP version
if ($SnmpVersion -ne 1 -and $SnmpVersion -ne 2) {
Throw "Only SNMP version 1 and 2 supported"
}
Write-Host "Setting up discovery for SNMP-devices..."
Write-Host " From: $($FromIpAddress)"
Write-Host " To: $($ToIpAddress)"
Write-Host " Community: $($SnmpCommunityString)"
Write-Host " SNMP ver: $($SnmpVersion)"
$networkDeviceClass = Get-MonitoringClass -name "System.NetworkDevice"
$DeviceDiscoveryConfig = New-DeviceDiscoveryConfiguration -MonitoringClass $networkDeviceClass -FromIpAddress $FromIpAddress -ToIpAddress $ToIpAddress
# Set Community String
$encoding = New-Object System.Text.UnicodeEncoding
$encodedCommunityString = $encoding.GetBytes($SnmpCommunityString)
$DeviceDiscoveryConfig.ReadOnlyCommunity = [System.Convert]::ToBase64String($encodedCommunityString)
# Set SNMP version
$DeviceDiscoveryConfig.SnmpVersion = $SnmpVersion
# Get management server
If ($ManagementServer.Length -eq 0) {
$mgmtServer = Get-RootManagementServer
} else {
$mgmtServer = Get-ManagementServer | Where-Object {$_.Name -eq $ManagementServer}
}
If ($mgmtServer -eq $null) {
Throw "Cant find management server named $($ManagementServer)"
} else {
Write-Host "Found management server: $($mgmtServer.name)"
}
# Find proxy agent
Write-Host "Lookup of proxy agent named $($MonitoringProxy) ..."
$ProxyAgent = Get-Agent | Where-Object {$_.Name -eq $MonitoringProxy}
If ($ProxyAgent -eq $null) {
Write-Host "No agent named $($MonitoringProxy) found, checking managementservers"
$ProxyAgent = Get-ManagementServer | Where-Object {$_.Name -eq $MonitoringProxy}
$ProxyIsMgmtServer = $true
} else {
$ProxyIsMgmtServer = $false
}
If ($ProxyAgent -eq $null) {
Throw "Can't find agent or managementserver named $($MonitoringProxy)"
} else {
Write-Host "Found $($ProxyAgent.Name)"
}
Write-Host "Starting discovery..."
$DiscResults = Start-Discovery -ManagementServer: $mgmtServer -DeviceDiscoveryConfiguration: $DeviceDiscoveryConfig
If ($DiscResults.CustomMonitoringObjects.Count -eq 0) {
Write-Host "Cant discover any objects"
Return 0
} else {
$ObjectCount = 0
Write-Host "Found objects"
$discresults | select-object -expandproperty CustomMonitoringObjects | Select-Object Name | Format-Table -HideTableHeaders
$DiscResults | ForEach-Object {
Write-Host "Adding object to proxy..."
if ($ProxyIsMgmtServer -eq $true) {
$ProxyAgent.InsertRemotelyManagedDevices($_.CustomMonitoringObjects) | Format-Table SnmpDevice, ProxyAgentPrincipalName, ManagementGroup -HideTableHeaders
} else {
Add-RemotelyManagedDevice -proxyagent $ProxyAgent -device $_.CustomMonitoringObjects
}
$ObjectCount++
}
Return $ObjectCount
}
}
And two examples on how you can use it to add some devices:
# Add a devices in the range 192.168.100.240-.254 with the community "SomeSecret"
# Use mgmtserver.snowland.demo to do the discovery and add the devices with snmpmonitor.snowland.demo as monitoring proxy
Add-SnmpDevice -FromIpAddress "192.168.100.240" -ToIpAddress "192.168.100.254" -SnmpCommunityString "SomeSecret" -ManagementServer "mgmtserver.snowland.demo" -MonitoringProxy "snmpmonitor.snowland.demo"
# Add a single SNMPv1 device with the "public" community, use the RMS to do discovery
Add-SnmpDevice -FromIpAddress "192.168.100.10" -MonitoringProxy "snmpmonitor.snowland.demo" -SnmpVersion 1
So we ended up with something like this:
Import-Csv ".\snmplist.csv" -Delimiter ";" | ForEach-Object {
Add-SnmpDevice -FromIpAddress $_.IpFrom -ToIpAddress $_.IpTo -SnmpCommunityString $_.Community -ManagementServer $_.MgmtServer -MonitoringProxy $_.Proxy
}