### ----------------------------------------------------------------- ### Written by Matt Brown ### ### Description: This Grabs a list of all the Domain Controllers and tries to connect to them via SSL over Port 636 ### ### ----------------------------------------------------------------- $DCList = @( "dc1.domain.com", "dc2.domain.com", "dc3.domain.com", "dc4.domain.com", "domain.com" ) $DCList | foreach { $DC = $_ $LDAPS = [ADSI]"LDAP://$($DC):636" try { $Connection = [adsi]($LDAPS) } Catch { } if ($Connection.Path) { Write-Host "Active Directory server correctly configured for SSL, test connection to $($LDAPS.Path) completed." -foregroundcolor Green } else { Write-Host "Active Directory server not configured for SSL, test connection to LDAP://$($DC):636 did not work." -ForegroundColor Yellow } }
Ramblings from University IT... VMWare, NetApp, Powershell,Active Directory, Exchange and Scripting.
Wednesday, November 12, 2014
Powershell: Test Domain Controller Certificates
When replacing Domain Controller certificates for Active Directory with a valid 3rd party certificate I use this script to quickly test my domain and all my domain controllers directly to make sure they are serving out the certificate.
Monday, November 10, 2014
PowerShell: Add Computer to Domain directly to OU
Here's a PowerShell script to add computers to the Domain to a specific OU (Organizational Unit) and allows you to select the OU Location. I did not use the AD modules as they are not pre-installed on most desktops, even though it would of been much easier to write with them.
### ----------------------------------------------------------------- ### Written by Matt Brown ### - http://universitytechnology.blogspot.com/ ### PowerShell script to search OU Structure and add computer to domain ### ### ----------------------------------------------------------------- Param( $user = $(Get-Credential -Credential "domain\user"), # Prompts user for credentials $filter = "(objectClass=organizationalUnit)", # Do not change $ouLocatoin = "LDAP://OU=Departments,DC=domain,DC=com", # Starting Organizational Unit $mydomain = "domain.com", # FQDN of Domain $whatif = "-WhatIf" # change to "" to actually run ) #-------------------------------------------------------------------- Function GetSecurePass ($SecurePassword) { $Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($SecurePassword) $password = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($Ptr) [System.Runtime.InteropServices.Marshal]::ZeroFreeCoTaskMemUnicode($Ptr) $password } #-------------------------------------------------------------------- Function AddTabs($mystring,[int]$numtabs=5) { for([int]$len = (([string]$mystring).length / 8.9); $len -lt $numtabs; $len++) { $mystring += "`t" } return $mystring } #-------------------------------------------------------------------- Function SelectOU($dn,$up) { Clear-Host Write-Host "### -----------------------------------------------------------------" -ForegroundColor Green Write-Host "### Select OU and Add Computer to Domain " -ForegroundColor Green Write-Host "### Written by Matt Brown " -ForegroundColor Green Write-Host "### - http://universitytechnology.blogspot.com/ " -ForegroundColor Green Write-Host "### PowerShell v.2 (Windows 7 / Server 2008 R2) " -ForegroundColor Green Write-Host "### -----------------------------------------------------------------" -ForegroundColor Green Write-Host "`nThe Number in the Select column adds the computer to the OU, where the List column will list Sub-OU's of the OU." -ForegroundColor Green Write-Host $dn Write-Host $up Write-Host "`n" Write-Host ("List Of " + (([string]$dn).split("/"))[2]) -ForegroundColor Yellow Write-Host " Select List`tOU" Write-Host " ----------------------------------------------------" Write-Host " 0`t L0 <- Up a Level" #$ou = Get-ADOrganizationalUnit -SearchBase $dn -SearchScope OneLevel -Filter 'Name -like "*"' $auth = [System.DirectoryServices.AuthenticationTypes]::FastBind $de = New-Object System.DirectoryServices.DirectoryEntry($dn,$user.UserName,(GetSecurePass $user.Password),$auth) $ds = New-Object system.DirectoryServices.DirectorySearcher($de,$filter) $ds.SearchScope = "OneLevel" $ou=($ds.Findall()) | Sort-Object -Property Name $sel = $null $selectList = @("0","L0","C") for($x=1; $ou.count -ge $x; $x++) { # output line, decide if it needs to be in yellow or white $selectList += $x $selectList += ("L"+$x) $outname = (AddTabs ($ou[$x-1].Properties['name'])) $lineout = (" " + $x + "`t " + ("L"+$x) + "`t" + $outname) if($x % 2 -eq 0) { Write-Host $lineout -BackgroundColor White -ForegroundColor Black } else { Write-Host $lineout -BackgroundColor Gray -ForegroundColor Black } } Write-Host " C`t C -- Cancel & Exit" Write-Host "`n" while($selectList -notcontains $sel) { $sel = Read-Host " Select OU or List Sub-OUs" } ## Figure out what the user selected if ( $sel[0] -eq "L") { ## Users Selected List Mode $y = ($sel.split("Ll")[1]) if([int]$y -eq 0) { $newup = ("LDAP://" + ($up -replace (($up -split ",")[0] + ","))) SelectOU $up $newup } else { SelectOU $ou[$y-1].Properties['adspath'] $dn } } elseif ($sel -eq "c") { ## User Selected Cancel return $false } else { ## User Selected the OU if([int]$sel -eq 0) { return ([string]$dn).split("//")[2] } elseif([int]$sel -le [int]$ou.count) { return $ou[$sel-1].Properties['distinguishedname'] } else { SelectOU $dn $up } } } #-------------------------------------------------------------------- #-------------------------------------------------------------------- ## Main #-------------------------------------------------------------------- ## Select / View OU while($ou = (SelectOU $ouLocatoin $ouLocatoin)) { ## Add to Domain Write-Host (" Will add computer (" + $env:computername + ") to:") -ForegroundColor Yellow Write-Host (" " + $ou + "`n") -ForegroundColor Green $continue = Read-Host " Continue (y | n)" if($continue -eq "y") { ## Now Add the Computer to the Domain add-computer -domainname $mydomain -OUPath $ou -Credential $user $whatif break } }
Friday, November 7, 2014
Powershell: Test VMWare Host Networks
Here's a handy script I use to verify networks on my VMWare Clusters. This script takes a test VM and changes the Network and IP Address from a list, then does a simple ping from the VM on each host to let you know your networks are working correctly before moving Production Machines to it. The need for this spawned from a missing "allowed vLan id" not being configured across the ether channel ports on one of the hosts.
### ----------------------------------------------------------------- ### Written by Matt Brown ### ### Description: Test VMWare Host Networks ### ### Requires: ### VMWare Snapin ### Test VM with a Local Admin Account, may need to turn UAC Off ### CSV File with Network Info ### ### Sample CSV File: ### Name,VLanId,ip,netmask,gateway ### VM-Subnet01,21,192.168.3.5,255.255.255.0,192.168.3.1 ### VM-Subnet02,22,192.168.4.5,255.255.255.0,192.168.3.5 ### ----------------------------------------------------------------- ## Load VMWare Snapin if(-not (Get-PSSnapin | where { $_.Name -match 'VMware.VimAutomation.Core' })) { Add-PSsnapin VMware.VimAutomation.Core } ## Vars to Configure $vCenterServer = "VC.domain.com" $clusterToTest = "ProductionCluster" $TestMachine = "TestVM" $vmnicname = "Local Area Connection" $NetworkListFile = "VMNetworkTestList.csv" function TestNetwork($currenthost,$newhost,$vm,$gateway,$guestCred) { if($currenthost -notmatch $newhost) { Write-Host ("Moving $TestMachine to " + $_.Name) -ForegroundColor Cyan $VM | Move-VM -Destination $_.Name | Out-Null } $script = ("ping " + $gateway) Write-Host $script -ForegroundColor Yellow $pingtest = Invoke-VMScript -VM $vm -ScriptText $script -scriptType bat -Credential $guestCred if($pingtest.ScriptOutput -match "(0% loss)") { Write-Host "Test Success" -ForegroundColor Green } else { $pingtest.ScriptOutput } #$continue = Read-Host "Hit Enter to Test on Next Host." return $newhost } ## Connect to vCenter and grab information Connect-VIServer -Server $vCenterServer -credential (Get-Credential -Message ("vCenter Account")) $hosts = Get-VMHost -Location $clusterToTest | select Name $VM = get-vm -name $TestMachine $currenthost = $vm.VMHost.Name $guestCred = Get-Credential -UserName ($TestMachine + "\") -Message "Local Admin Account" $NetworksToTest = Import-Csv $NetworkListFile $NetworksToTest | foreach { $NetworkName = $_.Name $IP = $_.ip $gateway = $_.gateway $netmask = $_.netmask Write-Host "Changing Network on $TestMachine to $NetworkName" -ForegroundColor Cyan Get-NetworkAdapter -VM $vm | Set-NetworkAdapter -NetworkName $NetworkName -Confirm:$false | Out-Null #$continue = Read-Host "Hit Enter to Set the IP Address." Write-Host "Changing IP Address on $TestMachine to $IP" -ForegroundColor Cyan $VM | Get-VMGuestNetworkInterface -GuestCredential $guestCred | Where-Object { $_.Name -eq $vmnicname } | Set-VMGuestNetworkInterface -GuestCredential $guestCred -Ip $IP -Netmask $netmask -Gateway $gateway | Out-Null #$continue = Read-Host "Hit Enter to Run Ping Tests." $x = @() $hosts | where { $_ -notmatch $currenthost } | foreach { $x += $_.Name } $currenthost = TestNetwork $currenthost $currenthost $vm $gateway $guestCred $hosts | foreach { $currenthost = TestNetwork $currenthost $_ $vm $gateway $guestCred } }
Wednesday, November 5, 2014
Powershell: Get AD Users from Group with Email Address
Here's a handy script I use to Generate a list of all "Users" with email addresses within a group. It's a recursive function so it will dig through nested groups to make sure all users are picked up. It does not do checking for duplicates as I normally just open the output in Excel and run the Remove Duplicates command.
### ----------------------------------------------------------------- ### Written by Matt Brown ### ### Description: Get Username / Email from All Users in AD Group ### ### Requires: ActiveDirectory Module ### ----------------------------------------------------------------- Import-Module ActiveDirectory $group = "Employees" $outfile = ("c:\" + $group + "_output.csv") function RecurseMyGroup($group,$outfile) { Write-Host ("Checking Group " + $group) (Get-ADGroup $group -properties members).members | foreach { $object = Get-ADObject $_ -Properties mail,samaccountname if($object.objectClass -eq "Group") { RecurseMyGroup $object.DistinguishedName $outfile } else { ($object.samaccountname + "," + $object.mail) | Out-File -FilePath $outfile -Append } } } RecurseMyGroup $group $outfile
Monday, November 3, 2014
Powershell: VMWare Snapshot Report
Here's a handy script I use to send me a report on all VM's in my VMWare Environment with active snapshots. This script finds all VM's with Snapshots, creates an HTML report and emails the info to the provided list. I schedule this to run via the Task Manager automatically every week.
### ----------------------------------------------------------------- ### Written by Matt Brown ### ### Description: Powershell script grabs a list of snapshots from the ### VMWare Enviornment and emails them out as a report. ### ### Requires: VMWare Powershell Extenstions ### ----------------------------------------------------------------- $thedate = Get-Date -f yyyy-MM-dd_HH-mm $scriptname = "VMWareSnapshots.ps1" $scriptlocation = "C:\Scripts\VMWare\" $filename = $scriptlocation + "Transcripts\" + $thedate + "_Snapshots.rtf" start-transcript -path $filename $htmlOutFile = "C:\Scripts\VMWare\Reports\snapshot_list.htm" $vCenterServer = "VC.domain.com" $vCenterLocation = "ProductionCluster" ### Load VMWare Snapin Add-PSSnapin -Name VMware.VimAutomation.Core ### ----------------------------------------------------------------- ### Start Functions ### ----------------------------------------------------------------- function SendEmail($body,$subject=("Script ERROR: " + $scriptname + " on " + ($env:COMPUTERNAME)),$to=@("admin@domain.com"),$attFile=$false) { $message = New-Object System.Net.Mail.MailMessage if($attFile) { $attachement = New-Object System.Net.Mail.Attachment($attFile) $message.Attachments.Add($attachement) $message.Headers.Add("message-id", "<3BD50098E401463AA228377848493927-1>") # Adding a Bell Icon for Outlook users } $message.From = "admin@domain.com" $to | foreach { $message.To.Add($_) # default is admin in function } $message.Subject = $subject $bodyh = "----------------------------------------------------------------------------------------------------`n" $bodyh += "Server: " + ($env:COMPUTERNAME) + "`n" $bodyh += "User: " + ($env:USERDOMAIN) + "\" + ($env:USERNAME) + "`n" $bodyh += "Location: " + $scriptlocation + $scriptname + "`n" $bodyh += "----------------------------------------------------------------------------------------------------`n`n" $message.Body = $bodyh + $body $smtp = New-Object System.net.Mail.SmtpClient $smtp.Host = "smtpserver.domain.com" $smtp.UseDefaultCredentials = $true $smtp.Send($message) } ### ----------------------------------------------------------------- Connect-VIServer $vCenterServer # HTML/CSS style for the output file $head = "" $title = ($vCenterLocation + " VMWare Snapshots as of ” + (get-date -Format "MM-dd-yyyy")) $data = @() Get-VM -Location $vCenterLocation | foreach { $snapshots = Get-SnapShot -VM $_ if ($snapshots.Name.Length -ige 1 -or $snapshots.length){ ForEach ($snapshot in $snapshots){ $myObj = "" | Select-Object VM, Snapshot, Created, Description $myObj.VM = $_.name $myObj.Snapshot = $snapshot.name $myObj.Created = $snapshot.created $myObj.Description = $snapshot.description $data += $myObj } } } # Write the output to an HTML file $data | Sort-Object VM | ConvertTo-HTML -Head $head -Body (""+$title+"
") | Out-File $htmlOutFile SendEmail ("See Attached VMWare Snapshot Report") $title (@("joe@domain.com","fred@domain.com")) $htmlOutFile DisConnect-VIServer -Confirm:$false stop-transcript
Subscribe to:
Posts (Atom)