Archive

Archive for the ‘ADDM’ Category

Updated ADDM query using Powershell.

November 7th, 2011 No comments

This has been updated to allow qu9ick access to ADDM views for people who live in their Powershell Shells.

So a quick – “get-addm myserver – launch” opens the URL – I have not found a way to post the credsa to the logon page yet – as I do not want to depends on simulated keypresses.

</pre>
 
Function get-Addm ($addmserver="MyAddmServer.mydomain.local", $hostname, [string]$query="SEARCH Host WHERE name MATCHES '(?i)$hostname'", $username, $password, $proxy="myproxy:8080", [switch]$resetpwd, [switch]$launch)
 {
 # Use system reflection to convert string to URL.
 [System.Reflection.Assembly]::LoadWithPartialName("System.Web") | out-null
 $query = [System.Web.HttpUtility]::UrlEncode($query)
 
 # Check for password / gather password info
 If ($resetpwd)
  {del $env:userprofile\$username.txt}
 If (!$username)
  {
  write-host "No Username specified - using $env:username" -fore Green
  $username = $env:username
  }
 if (test-path $env:userprofile\$username.txt)
  {
  write-host "Stored creds found for $username" -fore Green
  }
  else
  {
  write-host "No Password saved for $username - please specify a valid pwd" -fore Green
  read-host -assecurestring | convertfrom-securestring | out-file $env:userprofile\$username.txt
  }
  $password = get-content $env:userprofile\$username.txt | convertto-securestring
  $credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist $username,$password

 # Decrypt stored creds
 $pw =  $credentials.GetNetworkCredential().password
 
 # Create Web request
 $proxy = new-object System.Net.WebProxy $proxy
 # $proxy.credentials = $proxycred.GetNetworkCredential()
 
 $WebClient = New-Object System.Net.WebClient
 $webclient.proxy = $proxy
 $url = "<a href="https://$addmserver/ui/api/CsvApi?query=$query&username=$username&password=$pw">https://$addmserver/ui/api/CsvApi?query=$query&username=$username&password=$pw</a>"
 $Webclient.DownloadFile($url, "$env:temp\tmp.csv")
  #Import captured CSV
 $csv = import-csv "$env:temp\tmp.csv"
 If ($launch){ie "<a href="https://$addmserver/ui/NodeSearch?query=SEARCH%20Host%20WHERE%20name%20MATCHES%20%27%28%3Fi%29$Hostname%27">https://$addmserver/ui/NodeSearch?query=SEARCH%20Host%20WHERE%20name%20MATCHES%20%27%28%3Fi%29$Hostname%27</a>"}
  return $csv
 }
 
 
<pre>

Categories: ADDM Tags:

Querying BMC ADDM / Atrium from Powershell.

August 30th, 2011 No comments

We have a new discovery appliance at a client site – BMC atrium.

I was having a look at it and unfortunately it does not have a normal SQL backend . . so it is not as easy to collect information as I would like (well . . .it is if you do a little legwork)

Looking through the docs, I found they do have an API – and actually . . the API was incredibly simple to use – just need some web access.

Well. my weapon of choice is always PowerShell . . so all I need is a simple web query no?

there are a few tricks though.

I do not want to have to keep providing my password
I would not like any clear text passwords knocking about
I want to be able to pass Queries that contain special characters
I’d like a simply object returned that can easily be manipulated using normal PowerShell syntax.

Here’s what I came up with.

Note – you’ll need to specify a server and a proxy (or include these in your function by editing the values in the first line of the function

Remember – it would be best practice to create a read-only account and use these creds for queries.


Function get-Addm ([string]$query,$servername"myserver.lab.local", $username, $password, $proxy="myproxy.lab.local", [switch]$resetpwd)
	{
	# Use system reflection to convert string to URL.
	[System.Reflection.Assembly]::LoadWithPartialName("System.Web") | out-null
	$query = [System.Web.HttpUtility]::UrlEncode($query)
	
	# Check for password / gather password info
	If ($resetpwd)
		{del $env:userprofile\$username.txt}
	If (!$username)
		{
		write-host "No Username specified - using $env:username" -fore Green
		$username = $env:username
		}
	if (test-path $env:userprofile\$username.txt)
		{
		write-host "Stored creds found for $username" -fore Green
		}
		else
		{
		write-host "No Password saved for $username - please specify a valid pwd" -fore Green
		read-host -assecurestring | convertfrom-securestring | out-file $env:userprofile\$username.txt
		}
		$password = get-content $env:userprofile\$username.txt | convertto-securestring
		$credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist $username,$password

	# Decrypt stored creds 
	$pw =  $credentials.GetNetworkCredential().password
	
	# Create Web request
	$proxy = new-object System.Net.WebProxy $proxy
	# $proxy.credentials = $proxycred.GetNetworkCredential()
	
	$WebClient = New-Object System.Net.WebClient
	$webclient.proxy = $proxy 
	$url = "https://$servername/ui/api/CsvApi?query=$query&username=$username&password=$pw"
	$Webclient.DownloadFile($url, "$env:temp\tmp.csv")
		#Import captured CSV
	$csv = import-csv "$env:temp\tmp.csv"
	return $csv
	}

So now I can simply generate a custom query in the GUI – then recycle this query for future searches, using Powershell – and get an opbject returned which I can edit as per normal Powershell queries.

so – for example, I’d like all windows servers and the DNS servers currently configured for these:

get-addm -query "SEARCH Host WHERE (os HAS SUBSTRING 'windows') SHOW name, os, vendor, virtual, partition, #InferredElement:Inference:Associate:DiscoveryAccess.endpoint, #DeviceWithInterface:DeviceInterface:InterfaceOfDevice:NetworkInterface.dns_servers AS 'DNS Servers'" -username "read_only" -servername "myappliance"

Categories: ADDM, Powershell Tags: