#skype4b #powershell Get Registrar Pool Names from Cluster Id (msRTCSIP-PrimaryHomeServer)
Instead of legible plain text is a long string describing the distinguished name of the Skype for Business Front-End Server pool in the msRTCSIP-PrimaryHomeServer Active Directory user attribute. This can become difficult to identify and manage if several registrar pools exist in your environment whether they are located in the same or different sites.
To decipher the DN (pool cluster Id) into the fully qualified distinguished name of the corresponding #skype4b pools,
#powershell Get-Date v.s. [datetime] Format and System Locale III
On a non-US system locale Windows machine[1], running this statement in a #powershell script will fail:
[datetime]$dt1 = (Get-Date).DateTime
Cannont convert value “Dienstag, 12. Dezember 2017 22:20:20” to type “System.DateTime”. Error: “The string was not recognized as a valid DateTime. There is an unknown word starting at index 0.”
At line:1 char:1
+[datetime]$dt1 = (Get-Date).DateTime
+
+ CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException
+ FullyQualifiedErrorId : RuntimeException
To resolve this,
#powershell Get a List of Windows Update Hotfixes & Patches
To retrieve a comprehensive list of installed quick fix engineering hotfixes and patches[1] in Windows Update, you export into a format such as CSV with the help of the perennial $env:windir\Windows\System32\Wbem\WMIC.exe tool:
$file = “qfe.csv”
wmic qfe list full /format:csv > $file
#optionally run in MS-DOS
#wmic qfe list full /format:”%windir%\system32\wbem\en-us\csv.xsl” > “qfe.csv”
Subsequently, you can import the Comma Separated Variable file and…
#powershell Get-EventLog <-> Get-WinEvent
Inspecting the Event Log (eventvwr.exe) can provide clues to the startup (Event ID 6005*) and shutdown (Event ID 6006) date/time of a Windows machine. To do this, one common approach is with Get-EventLog:
#requires -version 3.0
Get-EventLog -LogName system -ComputerName FS01 | ? EventId -eq 6006
Instead, a more efficient way without the #powershell pipeline can be achieved using Get-WinEvent:
Get-WinEvent -ComputerName FS01 -FilterHashtable @{ LogName=’system’; Id=6006 }
Look out for Event ID 6008 which records the date/time of unexpected system shutdown.
* Event ID: 12 Provider (Source): Kernel-General contains actual operating system start time.
#powershell -version is not recognized
Note that powershell.exe /? shows the syntax to execute PowerShell from a command prompt. Nevertheless, running
C:\> powershell -noprofile -version 2.0
-version : The term ‘-version’ is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ -version 2.0
+ ~~~~~~~~
+ CategoryInfo : ObjectNotFound: (-version:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
fails …
#powershell Select-Object -ExcludeProperty
The ExcludeProperty parameter in Select-Object must always be used together with the Property parameter as illustrated:
gsv | Select-Object -ExcludeProperty status -first 1 | select s*
ServiceName : AJRouter
ServicesDependedOn : {}
ServiceHandle : SafeServiceHandle
Status : Stopped
ServiceType : Win32ShareProcess
StartType : Manual
Site :gsv | Select-Object -ExcludeProperty status -Property s* -first 1 | select s*
ServiceName : AJRouter
ServicesDependedOn : {}
ServiceHandle : SafeServiceHandle
ServiceType : Win32ShareProcess
StartType : Manual
Site :
#powershell Get-Date v.s. [datetime] Format and System Locale II
Irrespective of the Windows system language and locale, a non-US datetime format text string imported from a file into PowerShell may still need to be formated with Get-Date or cast through [datetime] prior to use.
However, date/time operations may fail silently if the conversion or re-formatting did not succeed.
#powershell Temporary Files
Introduced in PowerShell 5.0, the New-TemporaryFile cmdlet creates a single ‘scratch’ file with the tmp file extension in a user’s $env:temp directory. For previous #powershell versions, you can do this directly with .NET Framework:
$tempfile = [system.io.path]::GetTempFileName()
Likewise, this has the tmp file extension and is automatically placed in $env:temp. Assigning to a variable permits quick access.
Alternatively, you can create a unique file name for temporary usage by taking advantage of your system date/time as depicted:
$d = Get-Date
$d1 = $d.date.ToShortDateString() -replace “:|/|-|\.”
$d2 = $d.TimeOfDay.ToString() -replace “:|\|-|\.”
$tempfile = “$env:temp\” + $d1 + $d2 + “.tmp”
$tempfile
#powershell Auto Type Conversion – String Array Concatenation
$a1 = “apple”
$a2 = “pear”, “guava”
# add/join 2 string arrays together
[array]$fruits = $a1 + $a2
$fruits
# applepear guava
# $a1 is a simple string type;
# $a2 string array auto expanded and added to same string object
$fruits.count #1 unique string
$fruits.GetType() #a single unit of string array
# one correct way to add/join 2 string arrays together
# force conversion of $a1 simple string to a string array
$fruits = @($a1) + $a2
$fruits
<#
apple
pear
guava
#>
$fruits.count #3 items in array
$fruits.GetType() #an array of strings
$fruits[1]
# pear
#alternative if the order is not important
$fruits = $a2 + $a1
$fruits
<#
pear
guava
apple
#>
$fruits.GetType() #an array of 3 strings
#skype4b Audit Change Tracking Management?
With the right administrative permissions, a #skype4b administrator can add new or modify existing policies and global configuration settings. Every team member is happy when things go according to plan. If a system-wide or scope-level setting[1] goes awry, your end-users will likely be your most reliable “first level alarm” system. In this case, any remedial actions will visibly affect respective services or users in the firm.
Likewise, a Skype for Business enabled user…