#Functions #get-ldap: Return results of ldap query as system.directoryservices.directoryentry objects #get-ldapattr: Return attributes from ldap query #get-servicever: Get version of file running services #get-sql: Run sql query #get-sqltoht: Run sql query and return results in a hash table #get-sqlver: Get version of sql server #get-reg: Query a remote registry #get-wmireg: Query a remote registry using wmi and return the subkeys #get-freespace: Get free drive space #stop-serviceremote: Stop a service on a remote server #start-serviceremote: Start a service on a remote server #get-serviceremote: Get the service as an object from a remote servers #get-processremote: Get a process as an object from a remote servers #get-binary: Convert an integer into binary. #get-cidr: Get the cidr representation for a subnet. #get-LargeGroupMembers: Return the members of groups with more than 1500 members. #is-Alive: Ping a server #Copy-Groups: Copy group memberships between users. #get-ismember: Check group membership for a user recurseively. #get-diffcsvfield: Compare csv's for differences #get-difftext: Compare text files for differences #send-mail: Send an e-mail using smtp. Please replace "mysmtprelay.mydomain.com" with the fqdn of an smtp relay server in your organization. #get-hex: Convert text to hex by getting the ascii value of each letter. #get-asc: convert hex to text by displaying the letter associated with the ascii value of each digit. function get-servicever { param ([string]$hostname=".", [string]$servicename) $win32service=get-wmiobject -class win32_service -computername $hostname -filter "name=`'$servicename`'" if ($win32service.pathname.length -lt 1) { return "No service found with the name $servicename on computer $hostname." } $pathname=$win32service.pathname.split(" ")[0] $pathname=("\\$hostname\$pathname").replace(":","$") if (test-path $pathname) { $svcversion=[System.Diagnostics.FileVersionInfo]::GetVersionInfo($pathname) #i.e.: #get-servicever myserver mssqlserver|select-object filename,fielversion,productversion|export-csv sqlver.csv -notypeinformation $svcversion,$win32service } else { "Can't find file: $pathname" } } Function get-ldap { param ([string]$filter, [string]$base='dc=mydomain,dc=com') if ($filter.length -lt 1) { "Usage: get-ldap '' [base]" "i.e.: get-ldap 'samaccountname=myuser' 'dc=mydomain,dc=com'" break } [system.string]$temp=$base.toLower if (!($temp.StartsWith("ldap"))) {$base='LDAP://'+$base} $BaseEntry = New-Object System.DirectoryServices.DirectoryEntry $base $ldap = new-object System.DirectoryServices.DirectorySearcher $ldap.referralchasing = 'All' $ldap.pagesize=99 $ldap.filter=$filter $ldap.SearchRoot=$BaseEntry #$ldap.PropertiesToLoad.Add($attrs) $results = $ldap.findall() #write-host "count="$results.count # write-host $results foreach ($result in $results) { #$result #$result.path.tostring() $ResulT.GetDirectoryEntry() #$mytest=new-object directoryservices.directoryentry $result.path.tostring() #$mytest #$props=$result.properties #foreach ($prop in $props.PropertyNames) { # $props.$prop #} } } Function get-ldapattr { #returns 1 attribute as opposed to directory entry object param ([string]$filter,[string]$attr,[string]$base='dc=mydomain,dc=com') #if (($base -eq $null) -or ($filter -eq $null)) { if ($filter.length -lt 1) { "Usage: get-ldap '' '' [base]" "i.e.: get-ldap 'samaccountname=myuser' 'description' 'dc=mydomain,dc=com'" break } [system.string]$temp=$base.toLower if (!($temp.StartsWith("ldap"))) {$base='LDAP://'+$base} $BaseEntry = New-Object System.DirectoryServices.DirectoryEntry $base $ldap = new-object System.DirectoryServices.DirectorySearcher $ldap.referralchasing = 'All' $ldap.pagesize=99 $ldap.filter=$filter $ldap.SearchRoot=$BaseEntry $rc=$ldap.PropertiesToLoad.Add($attr) $results = $ldap.findall() # write-host "count="$results.count # write-host $results foreach ($result in $results) { #$result #$result.path.tostring() #$ResulT.GetDirectoryEntry() #$mytest=new-object directoryservices.directoryentry $result.path.tostring() #$mytest #$props=$result.properties #foreach ($prop in $props.PropertyNames) { # $props.$prop #} return $result.properties[$attr] } } Function get-sql { param ([string]$SQLServer,[string]$SQLQuery) if ($SQLQuery.length -lt 1) { "Usage: get-sql [\db] " break } $db="master" if ($SQLServer.contains("\")) { $db=$SQLServer.split("\")[1] $SQLServer=$SQLServer.split("\")[0] } $sqlConn = new-object System.Data.SqlClient.SqlConnection $sqlConn.ConnectionString = "Server="+$SQLServer+";Database="+$db+";Integrated Security='SSPI'" $cmdObj = new-object System.Data.SqlClient.SqlCommand $cmdObj.Connection = $sqlConn $cmdObj.CommandText = $SQLQuery $sqlConn.Open() $rs= $cmdObj.ExecuteReader() while ($rs.Read()) { for ($i=0;$i -lt ($rs.FieldCount) ;$i++) { # $fld = new-object System.Management.AUtomation.MshNoteProperty # $rs.GetName($i), $rs[$i] # $result.MshObject.Members.Add($fld); #$rs.getname($i)+": "+$rs[$i] $rs[$i] } # $result } $rs.close > $nul $rs.dispose > $nul $sqlConn.Close() } Function get-sqltoht { #returns hash table param ([string]$SQLServer,[string]$SQLQuery) if ($SQLQuery.length -lt 1) { "Usage: get-sql [\db] " break } $result=@{} $db="master" if ($SQLServer.contains("\")) { $db=$SQLServer.split("\")[1] $SQLServer=$SQLServer.split("\")[0] } $sqlConn = new-object System.Data.SqlClient.SqlConnection $sqlConn.ConnectionString = "Server="+$SQLServer+";Database="+$db+";Integrated Security='SSPI'" $cmdObj = new-object System.Data.SqlClient.SqlCommand $cmdObj.Connection = $sqlConn $cmdObj.CommandText = $SQLQuery $sqlConn.Open() $rs= $cmdObj.ExecuteReader() while ($rs.Read()) { for ($i=0;$i -lt ($rs.FieldCount) ;$i++) { if (!($result.containskey($rs[$i]))) {$result.add($rs[$i],$rs.GetName($i))} } } $rs.close > $nul $rs.dispose > $nul $sqlConn.Close() return $result } Function get-sqlver { param ([string]$SQLServer) $sqlConn = new-object System.Data.SqlClient.SqlConnection $sqlConn.ConnectionString = "Server="+$SQLServer+";Database=master;Integrated Security='SSPI'" $cmdObj = new-object System.Data.SqlClient.SqlCommand $cmdObj.Connection = $sqlConn $cmdObj.CommandText = "select @@version" $sqlConn.Open() $rs= $cmdObj.ExecuteReader() while ($rs.Read()) { $result = new-object System.Management.Automation.MshObject $SQLServer+":" for ($i=0;$i -lt ($rs.FieldCount) ;$i++) { # $fld = new-object System.Management.AUtomation.MshNoteProperty # $rs.GetName($i), $rs[$i] # $result.MshObject.Members.Add($fld); $rs[$i] } # $result } $rs.close > $nul $rs.dispose > $nul $sqlConn.Close() } Function get-reg { param ([string]$keyname,[string]$server) if (!($keyname)) { "Usage:" "get-reg 'keyname' 'server'" "i.e. get-reg 'hklm\software\microsoft\windows nt\currentversion' 'myserver'" break } if ($keyname.startswith("\\")) { $server=$keyname.split("\")[2] $keyname=$keyname.replace("\\"+$server+"\","") } $regbase=$keyname.split("\")[0] $keyname=$keyname.replace($regbase,"") $keyname=$keyname.trimstart("\",1) switch ($regbase) { {"hklm" -or "HKEY_LOCAL_MACHINE"} {$base='LocalMachine';break} {"hkcu" -or "HKEY_CURRENT_USER"} {$base='CurrentUser';break} {"hku" -or "HKEY_USERS"} {$base='Users';break} {"hkcr" -or "hkc" -or "HKEY_CLASSES_ROOT"} {$base='ClassesRoot';break} {"hkcc" -or "HKEY_CURRENT_CONFIG"} {$base='CurrentConfig';break} {"hkdd" -or "HKEY_DYN_DATA"} {$base='DynData';break} {"hkpd" -or "HKEY_PERFORMANCE_DATA"} {$base='PerformanceData';break} default {$base='LocalMachine'} } $Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($base, $Server) $key = $Reg.OpenSubKey($keyname, $True) $key #$Key.GetSubKeyNames() #$key.GetValueNames() #$key.getvalue("valuename") } Function get-wmireg { param ([string]$keyname,[string]$Server=".") if (!($keyname)) { "Usage:" "get-wmireg [servername]" "for example get-wmireg 'software\microsoft\windows nt\currentversion' 'myserver'" break } #RC1 - Never worked #$reg = Get-WmiObject -List -Namespace root\default -ComputerName . | Where-Object {$_.Name -eq "StdRegProv"} #$args=2147483650,"software",$values,$types #$rc=$reg.invokemethod("EnumValues",$a) #RC2 $reg=Get-WmiObject -List -Namespace root\default -ComputerName $Server | Where-Object {$_.Name -eq "StdRegProv"} $reg.enumkey(2147483650,$keyname) } Function get-freespace { param ([string]$server=".") $drives=get-wmiobject win32_logicaldisk -filter "drivetype=3" -computername $server foreach ($drive in $drives) { $drive.deviceid+" "+$drive.freespace.tostring("#,0")+' bytes' } } Function stop-serviceremote { param ([string]$server, [string]$service) if ($server -eq "") { "Usage: stop-serviceremote [servicename]" "If no service name is specified, lists services." return } #$result=[System.Reflection.Assembly]::LoadWithPartialName("System.ServiceProcess") if ($service -eq "") { [System.ServiceProcess.ServiceController]::GetServices($server) return } $oService=new-object System.ServiceProcess.ServiceController $oService.MachineName=$server $oService.ServiceName=$service $oService.Stop() $oService } Function start-serviceremote { param ([string]$server, [string]$service) if ($server -eq "") { "Usage: start-serviceremote [servicename]" "If no service name is specified, lists services." return } #$Result=[System.Reflection.Assembly]::LoadWithPartialName("System.ServiceProcess") if ($service -eq "") { [System.ServiceProcess.ServiceController]::GetServices($server) return } $oService=new-object System.ServiceProcess.ServiceController $oService.MachineName=$server $oService.ServiceName=$service $oService.Start() $oService } Function get-serviceremote { param ([string]$server) if ($server -eq "") { "Usage: get-serviceremote " return } #$result=[System.Reflection.Assembly]::LoadWithPartialName("System.ServiceProcess") [System.ServiceProcess.ServiceController]::GetServices($server) } Function get-processremote { param ([string]$server, [string]$process) if ($server -eq "") { "Usage: get-processremote [servicename]" "If no service name is specified, lists processes." return } if ($process -eq "") { [system.diagnostics.process]::GetProcesses($server) return } $oProcess=[system.diagnostics.process]::GetProcessesByName($process,$server) #$oProcess.kill() not support for remote machines??? $oProcess } function get-binary { #Returns string binary representation for integer. param ([int] $gb) $gbresult="" $gbpower=0 $gbtmp=[int] $gb while ($gbtmp -ge 2) { $gbtmp=$gbtmp / 2 $gbpower=$gbpower+1 } $gbtmp=[int] $gb foreach ($gbindex in ($gbpower..0)) { $test=([system.math]::pow(2,$gbindex)) if ($test -gt $gbtmp) { $gbresult=$gbresult+'0' } else { $gbtmp=$gbtmp - $test $gbresult=$gbresult+'1' } } return $gbresult } function get-cidr { param ([string]$gcAddress, [string]$gcmask) $gcnetbits=0 foreach ($gcOctet in $gcmask.split(".")) { $gcOctBinary=get-binary ($gcOctet) #$gcnetbits=$gcnetbits+$gcOctBinary.replace("0","").length $gcnetbits=$gcnetbits+$gcOctBinary.split("0")[0].length } return $gcAddress+'/'+$gcNetbits } Function get-LargeGroupMembers { param ([System.DirectoryServices.DirectoryEntry]$group) # For large groups (over 1500) # From http://mow001.blogspot.com/2006/04/large-ad-queries-in-monad.html trap{$all = $True;continue} $from = 0 $all = $false $members = @() while (! $all) { $to = $from + 999 $DS = New-Object DirectoryServices.DirectorySearcher($Group,"(objectClass=*)","member;range=$from-$to",'Base') $members += $ds.findall() | foreach {$_.properties | foreach {$_.item($_.PropertyNames -like 'member;*')}} $from += 1000 } return $members } function is-Alive { param ([string]$hostname,[int]$timeout=5000) if ($hostname -eq "") { "Usage: is-Alive [Timeout in ms]" return } $isAlive=$false if ($hostname -match "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}") { $ip=$hostname } else { $ip=([system.net.dns]::resolve($hostname)).addresslist[0].tostring() if (!($ip -match "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}")) { return "Couldn't resolve name $hostname to ip" } } $ping=new-object system.net.networkinformation.ping if (($ping.send($ip,$timeout)).Status -eq "Success") { $isAlive=$true } else { if (($ping.send($ip,$timeout)).Status -eq "Success") { $isAlive=$true } else { if (($ping.send($ip,$timeout)).Status -eq "Success") { $isAlive=$true } } } return $isAlive } function Copy-Groups { param ([string]$sourcepath,[string]$destpath) #copies sourcepath user's groups to destpath user #$sourcepath="LDAP://cn=myuser1,cn=users,dc=mydomain,dc=com" #$destpath="LDAP://cn=myuser2,cn=users,dc=mydomain,dc=com" $user=new-object system.directoryservices.directoryentry $sourcepath foreach ($goupPath in $user.memberof) { $Group=new-object system.directoryservices.directoryentry "LDAP://$groupPath" $Group.add($destpath) } } function get-ismember { param ([System.DirectoryServices.DirectoryEntry]$user, [System.DirectoryServices.DirectoryEntry]$group) if (($user -eq $null) -or ($group -eq $null)) { "Usage: get-ismember " "where both user and group are objects of type System.DirectoryServices.DirectoryEntry" break } $rc=$false $irc=new-object System.Security.Principal.IdentityReferenceCollection [void]$irc.Add((new-object System.Security.Principal.SecurityIdentifier $group.objectsid[0],0)) $GroupSID=$irc[0].value #$groupname=$irc[0].translate([System.Security.Principal.NTAccount]).value [void]$irc.remove((new-object System.Security.Principal.SecurityIdentifier $group.objectsid[0],0)) $user.psbase.refreshcache(@("TokenGroups")) foreach ($groupToken in $user.TokenGroups) { [void]$irc.Add((new-object System.Security.Principal.SecurityIdentifier $groupToken,0)) $CurrentSID=$irc[0].value [void]$irc.remove((new-object System.Security.Principal.SecurityIdentifier $groupToken,0)) if ($CurrentSID -eq $GroupSID) {$rc=$true} } $rc } function get-diffcsvfield { param ([string]$file1,[string]$file2,[int]$fieldnumber=0,[string]$delim=',') if (($file1 -eq '') -or ($file2 -eq '')) { "Usage: get-diffcsvfield [fieldnumber] [delim]" "" "Will show entries in from csv1 not in csv2 and vice versa." "Default field number is 0 and default delimiter is a ," "" break } $fields=@{} get-content $file1|foreach {$field=$_.split($delim)[$fieldnumber];if ($fields.containskey($field) -eq $false) {$fields.add($field,$true)}} "Fields in $file2 but not in "+$file1+"):" get-content $file2|foreach {$field=$_.split($delim)[0];if ($fields.containskey($field) -eq $false) {$field}} $fields=@{} get-content $file2|foreach {$field=$_.split($delim)[$fieldnumber];if ($fields.containskey($field) -eq $false) {$fields.add($field,$true)}} "Fields in $file1 but not in "+$file2+":" get-content $file1|foreach {$field=$_.split($delim)[0];if ($fields.containskey($field) -eq $false) {$field}} } function get-difftext { param ([string]$file1,[string]$file2) if (($file1 -eq '') -or ($file2 -eq '')) { "Usage: get-difftext " "" "Will show entries in from file1 not in file2 and vice versa." "" break } $fields=@{} get-content $file1|foreach {$field=$_;if ($fields.containskey($field) -eq $false) {$fields.add($field,$true)}} "Fields in $file2 but not in "+$file1+"):" get-content $file2|foreach {$field=$_;if ($fields.containskey($field) -eq $false) {$field}} $fields=@{} get-content $file2|foreach {$field=$_;if ($fields.containskey($field) -eq $false) {$fields.add($field,$true)}} "Fields in $file1 but not in "+$file2+":" get-content $file1|foreach {$field=$_;if ($fields.containskey($field) -eq $false) {$field}} } function send-mail { param ([string]$mailto,[string]$subject,[string]$body,[string]$atts,[string]$smtpserver="mysmtprelay.mydomain.com",[string]$mailfrom="soureaddress@mydomain.com") if (($mailto -eq '') -or ($subject -eq '')) { "Usage: send-mail [body] [attachment1,attachment2] [smtp server] [from]" "" "Will send an e-mail." "" break } if (!($smtpserver)) {$smtpserver="mysmtprelay.mydomain.com"} $sc=new-object Net.Mail.SmtpClient -arg $smtpserver #In case of attachments, use mailmessage instead. #$sc.send($mailfrom,$mailto,$subject,$body) $msg = new-object Net.Mail.MailMessage($mailfrom, $mailto, $subject, $body) if ($atts) { $atts.split(",")|foreach-object { if (test-path $_) { $msg.attachments.add([Net.Mail.Attachment]$_) } else { "Couldn't find file $_" } } } $sc.send($msg) "Message sent to $mailto." } function get-hex { param ([string]$mystring) if (!($mystring)) { "" "Usage:" "" "get-hex `"a phrase`"" "" "Will display hex values for each letter." "" break } $result='' foreach ($letterindex in (0..($mystring.length - 1))) { #$mystring.chars($letterindex)+': '+[int] $mystring.chars($letterindex) #$mystring.chars($letterindex)+': 0x'+"{0:x}" -f ([int] $mystring.chars($letterindex)) $result=$result+"{0:x}" -f ([int] $mystring.chars($letterindex)) } $result } function get-asc { param ([string]$mystring) if (!($mystring)) { "" "Usage:" "" "get-asc `"a hex string`" (i.e. get-asc `"6120706872617365`"" "" "Will display ascii values for hex two digits." "" break } $result='' for ($i=0;$i -le $mystring.length/2;$i=$i+2) { #$mystring.get_chars($i)+$mystring.get_chars($i+1) + ":" + [char]([int]("0x" + $mystring.get_chars($i) + $mystring.get_chars($i+1))) $result=$result+[char]([int]("0x" + $mystring.get_chars($i) + $mystring.get_chars($i+1))) } $result }