Coding

List Security group members with a autocomplete form

 

#http://social.technet.microsoft.com/wiki/contents/articles/28824.how-to-add-a-graphical-user-interface-to-your-powershell-functions-using-the-net-systemwindowsform-class.aspx
#https://community.spiceworks.com/topic/255740-powershell-script-to-show-all-groups-in-ad
#https://www.petri.com/powershell-problem-solver-exporting-active-directory-groups-csv
get-adgroup -filter 'GroupCategory -eq "Security"'  | sort name | select Name|Export-Csv -Path $env:temp\ADGroup.txt -NoTypeInformation
(Get-Content $env:temp\ADGroup.txt) -replace '"''' | Set-Content $env:temp\ADGroup.txt
Import-Module activedirectory
#import Presentation framework for error message pop-up
Add-Type -AssemblyName PresentationCore,PresentationFramework
Function getADMember($groupName)
{
    try
    {
        Get-ADGroupMember $groupName -Recursive|select-object name,SamAccountName,distinguishedName,objectClass|Export-Csv -Path $env:temp\$groupName.csv -NoTypeInformation
        #|Export-Csv -Path $env:temp\$groupName.csv -NoTypeInformation
        #Out-GridView -PassThru|
        invoke-item -Path $env:temp\$groupName.csv
    }
    catch
    {
        $ButtonType = [System.Windows.MessageBoxButton]::OK
        $MessageIcon = [System.Windows.MessageBoxImage]::Error
        $MessageBody = $($_.Exception.Message)
        $MessageTitle "Error"
        $Result = [System.Windows.MessageBox]::Show($MessageBody,$MessageTitle,$ButtonType,$MessageIcon)
    }
    finally
    {
        
    }
}
#region Boring beginning stuff
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
#endregion
  
#region begin to draw forms
$Form = New-Object System.Windows.Forms.Form
$Form.Text = "Get AD Group Member"
$Form.Size = New-Object System.Drawing.Size(300,170)
$Form.StartPosition = "CenterScreen"
$Form.KeyPreview = $True
$Form.MaximumSize = $Form.Size
$Form.MinimumSize = $Form.Size
  
$label = New-Object System.Windows.Forms.label
$label.Location = New-Object System.Drawing.Size(5,5)
$label.Size = New-Object System.Drawing.Size(240,30)
$label.Text = "Type any group name"
$Form.Controls.Add($label)
$textbox = New-Object System.Windows.Forms.TextBox
$textbox.Location = New-Object System.Drawing.Size(5,40)
$textbox.Size = New-Object System.Drawing.Size(165,25)
#$textbox.Text = "Select source PC:"
$Form.Controls.Add($textbox)
  
$search_group =
{
#region Actual Code
  
$statusBar1.Text = "Searching..."
$DLName $textbox.Text
  
getADMember($DLName)
  
$statusBar1.Text = "Searching Complete"
#endregion
}
  
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(180,38)
$OKButton.Size = New-Object System.Drawing.Size(50,23)
$OKButton.Text = "OK"
$OKButton.Add_Click($search_group)
$Form.Controls.Add($OKButton)
  
$result_label = New-Object System.Windows.Forms.label
$result_label.Location = New-Object System.Drawing.Size(5,65)
$result_label.Size = New-Object System.Drawing.Size(240,30)
$result_label.Text = ""
$Form.Controls.Add($result_label)
  
$statusBar1 = New-Object System.Windows.Forms.StatusBar
$statusBar1.Name = "statusBar1"
$statusBar1.Text = "Ready..."
$form.Controls.Add($statusBar1)
  
$Form.Add_KeyDown({if ($_.KeyCode -eq "Enter"){& $search_group}})
$Form.Add_KeyDown({if ($_.KeyCode -eq "Escape")
{$Form.Close()}})
#endregion begin to draw forms
#Autocomplete region begins here
$textbox.AutoCompleteSource = 'CustomSource'
$textbox.AutoCompleteMode='SuggestAppend'
$textbox.AutoCompleteCustomSource=$autocomplete
#Importing from a file
Get-content -Path $env:temp\ADGroup.txt | % {$textbox.AutoCompleteCustomSource.AddRange($_) }
#Autocomplete region ends here
  
#Show form
$Form.Topmost = $True
$Form.Add_Shown({$Form.Activate()})
[void] $Form.ShowDialog()

Creating a form with .NET library in PowerShell

Below is an example of calling .NET library with PowerShell to build a form. The form will have a textbox for user to input a computer name to ping.

Web link reference included in the comment

#http://social.technet.microsoft.com/wiki/contents/articles/28824.how-to-add-a-graphical-user-interface-to-your-powershell-functions-using-the-net-systemwindowsform-class.aspx
#region Boring beginning stuff
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
#endregion
  
#region begin to draw forms
$Form = New-Object System.Windows.Forms.Form
$Form.Text = "Computer Pinging Tool"
$Form.Size = New-Object System.Drawing.Size(300,170)
$Form.StartPosition = "CenterScreen"
$Form.KeyPreview = $True
$Form.MaximumSize = $Form.Size
$Form.MinimumSize = $Form.Size
  
$label = New-Object System.Windows.Forms.label
$label.Location = New-Object System.Drawing.Size(5,5)
$label.Size = New-Object System.Drawing.Size(240,30)
$label.Text = "Type any computer name to test if it is on the network and can respond to ping"
$Form.Controls.Add($label)
$textbox = New-Object System.Windows.Forms.TextBox
$textbox.Location = New-Object System.Drawing.Size(5,40)
$textbox.Size = New-Object System.Drawing.Size(120,20)
#$textbox.Text = "Select source PC:"
$Form.Controls.Add($textbox)
  
$ping_computer_click =
{
#region Actual Code
  
$statusBar1.Text = "Pinging..."
$ComputerName $textbox.Text
  
if (Test-Connection $ComputerName -quiet -Count 2){
Write-Host -ForegroundColor Green "Computer $ComputerName has network connection"
$result_label.ForeColor= "Green"
$result_label.Text = "System Successfully Pinged"
}
Else{
Write-Host -ForegroundColor Red "Computer $ComputerName does not have network connection"
$result_label.ForeColor= "Red"
$result_label.Text = "System is NOT Pingable"
}
  
$statusBar1.Text = "Testing Complete"
#endregion
}
  
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(140,38)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.Add_Click($ping_computer_click)
$Form.Controls.Add($OKButton)
  
$result_label = New-Object System.Windows.Forms.label
$result_label.Location = New-Object System.Drawing.Size(5,65)
$result_label.Size = New-Object System.Drawing.Size(240,30)
$result_label.Text = "Results will be listed here"
$Form.Controls.Add($result_label)
  
$statusBar1 = New-Object System.Windows.Forms.StatusBar
$statusBar1.Name = "statusBar1"
$statusBar1.Text = "Ready..."
$form.Controls.Add($statusBar1)
  
$Form.Add_KeyDown({if ($_.KeyCode -eq "Enter"){& $ping_computer_click}})
$Form.Add_KeyDown({if ($_.KeyCode -eq "Escape")
{$Form.Close()}})
#endregion begin to draw forms
  
#Show form
$Form.Topmost = $True
$Form.Add_Shown({$Form.Activate()})
[void] $Form.ShowDialog()

[AutoIT] Creating a Welcome document for new joiners.

The WelcomePack is an application written in AutoIT to generate a Word document with information of the current login user. The generated document will be saved under a folder with the current user’s display name.

WelcomePack.exe will search for $Date, $Username, $tel, $ext, $Email, $ComputerName, $NetworkDrives, $Printers and replace them with the information gathered.

The information includes with the source listed:

  • logon name – Windows session
  • direct line – AD
  • extension number – Shoretel
  • email address – AD
  • distribution list the user is a member of – AD
  • computer name – Windows session
  • mapped drive – Windows session
  • connected printers – Windows session

 

System requirements:

  • Word 2010 or later
  • The template file named “!Default Template.doc”
  • MySQL ODBC 5.3 Unicode Driver

 

*Shoretel DB credential  and server info removed

Minimal handling has been implement into the code.

 

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseX64=Y
#AutoIt3Wrapper_Res_Comment=Welcome Pack Executable
#AutoIt3Wrapper_Res_Description=WF Welcome Pack
#AutoIt3Wrapper_Res_Fileversion=1.0
#AutoIt3Wrapper_Res_LegalCopyright=Max Lee (argentolee@hotmail.com)
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Word.au3>
#include <Date.au3>
#include <MsgBoxConstants.au3>
;*****************************************
;WelcomePack.au3 by Max Lee
;Created with ISN AutoIt Studio v. 0.95 BETA
;*****************************************
; Create application object
Global $oWord = _Word_Create()
If @error <> 0 Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocFindReplace Example", _
        "Error creating a new Word application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
; Open template document, read-only
Global $oDoc = _Word_DocOpen($oWord, @ScriptDir & "\!Default Template.doc", Default, Default, True)
If @error <> 0 Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocFindReplace Example", _
        "Error opening '!Default Template.doc'." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
; *****************************************************************************
; Replacing variables in the Word document
; *****************************************************************************
_Word_DocFindReplace($oDoc, "$Date", _NowDate())
_Word_DocFindReplace($oDoc, "$Username", @UserName)
_Word_DocFindReplace($oDoc, "$ComputerName", @ComputerName)
_Word_DocFindReplace($oDoc, "$Email", GetMail())
_Word_DocFindReplace($oDoc, "$NetworkDrives", GetMappedDrives())
_Word_DocFindReplace($oDoc, "$Printers", GetMappedPrinters())
_Word_DocFindReplace($oDoc, "$tel", GetTel())
_Word_DocFindReplace($oDoc, "$DL", _GetDL())
_Word_DocFindReplace($oDoc, "$ext", _GetExt())
;_Word_DocFindReplace($oDoc, "$othertel", GetotherTelephone())
If @error <> 0 Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocFindReplace Example", _
        "Error replacing text in the document." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
;MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocFindReplace Example", "Text successfully replaced.")
DirCreate(@ScriptDir & "\" & GetDisplayName())
_Word_DocSaveAs($oDoc, @ScriptDir & "\" & GetDisplayName() & "\" & GetDisplayName() & ".doc")
Func GetDisplayName()
    Local $objRootDSE, $strDomain, $objConnection, $objCommand, $objRecordSet, $strDN
    ;Const ADS_SCOPE_SUBTREE = 2
    
    $objRootDSE = ObjGet("LDAP://RootDSE")
    $strDomain = $objRootDSE.Get("DefaultNamingContext")
    ;Set ADO connection
    $objConnection = ObjCreate("ADODB.Connection")
    $objConnection.Provider = "ADsDSOObject"
    $objConnection.Open("Active Directory Provider")
    ;Set ADO command
    $objCommand = ObjCreate("ADODB.Command")
    $objCommand.ActiveConnection = $objConnection
    $objCommand.Properties("Searchscope") = 2
    $objCommand.CommandText = "SELECT distinguishedName FROM 'LDAP://" & $strDomain & "' WHERE objectCategory='user' AND samAccountName = '" & @UserName & "'"
    ;Set recordset to hold the query result
    $objRecordSet = $objCommand.Execute
    ;If a user was found - Retrieve the distinguishedName
    If Not $objRecordSet.EOF Then
        $strDN = $objRecordSet.Fields("distinguishedName").Value
        Dim $objUser = ObjGet("LDAP://" & $strDN)
        Return $objUser.displayName
    Else
        ;"Not found"
        Return
    EndIf
EndFunc   ;==>GetDisplayName
Func GetMail()
    Local $objRootDSE, $strDomain, $objConnection, $objCommand, $objRecordSet, $strDN
    ;Const ADS_SCOPE_SUBTREE = 2
    
    $objRootDSE = ObjGet("LDAP://RootDSE")
    $strDomain = $objRootDSE.Get("DefaultNamingContext")
    ;Set ADO connection
    $objConnection = ObjCreate("ADODB.Connection")
    $objConnection.Provider = "ADsDSOObject"
    $objConnection.Open("Active Directory Provider")
    ;Set ADO command
    $objCommand = ObjCreate("ADODB.Command")
    $objCommand.ActiveConnection = $objConnection
    $objCommand.Properties("Searchscope") = 2
    $objCommand.CommandText = "SELECT distinguishedName FROM 'LDAP://" & $strDomain & "' WHERE objectCategory='user' AND samAccountName = '" & @UserName & "'"
    ;Set recordset to hold the query result
    $objRecordSet = $objCommand.Execute
    ;If a user was found - Retrieve the distinguishedName
    If Not $objRecordSet.EOF Then
        $strDN = $objRecordSet.Fields("distinguishedName").Value
        Dim $objUser = ObjGet("LDAP://" & $strDN)
        Return $objUser.mail
    Else
        ;Msgbox(4096,"Title","Not found")
        Return
    EndIf
EndFunc   ;==>GetMail
Func GetMappedDrives()
    Local $strNetworkDrives
    Local $aArray = DriveGetDrive("NETWORK")
    If @error Then
        ; An error occurred when retrieving the drives.
        MsgBox($MB_SYSTEMMODAL, "", "It appears an error occurred.")
    Else
        For $i = 1 To $aArray[0]
            ; Show all the drives found and convert the drive letter to uppercase.
            ;MsgBox($MB_SYSTEMMODAL, "", "Drive " & $i & "/" & $aArray[0] & ":" & @CRLF & StringUpper($aArray[$i]) & "  " & DriveMapGet($aArray[$i]) &@CRLF )
            $strNetworkDrives = $strNetworkDrives & (@TAB & @TAB & @TAB & StringUpper($aArray[$i]) & "  " & DriveMapGet($aArray[$i]) & @CR)
        Next
        Return $strNetworkDrives
    EndIf
EndFunc   ;==>GetMappedDrives
Func GetMappedPrinters()
    $objWMIService = ObjGet("winmgmts:\\.\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Printer")
    Local $strNetworkPrinters
    For $objItem In $colItems
        If StringLen($objItem.ShareName) > 3 Then
            $strNetworkPrinters = $strNetworkPrinters & @TAB & @TAB & @TAB & $objItem.ShareName & @CR
        Else
        EndIf
    Next
    Return $strNetworkPrinters
EndFunc   ;==>GetMappedPrinters
Func GetTel()
    Local $objRootDSE, $strDomain, $objConnection, $objCommand, $objRecordSet, $strDN
    ;Const ADS_SCOPE_SUBTREE = 2
    
    $objRootDSE = ObjGet("LDAP://RootDSE")
    $strDomain = $objRootDSE.Get("DefaultNamingContext")
    ;Set ADO connection
    $objConnection = ObjCreate("ADODB.Connection")
    $objConnection.Provider = "ADsDSOObject"
    $objConnection.Open("Active Directory Provider")
    ;Set ADO command
    $objCommand = ObjCreate("ADODB.Command")
    $objCommand.ActiveConnection = $objConnection
    $objCommand.Properties("Searchscope") = 2
    $objCommand.CommandText = "SELECT distinguishedName FROM 'LDAP://" & $strDomain & "' WHERE objectCategory='user' AND samAccountName = '" & @UserName & "'"
    ;Set recordset to hold the query result
    $objRecordSet = $objCommand.Execute
    ;If a user was found - Retrieve the telephoneNumber
    If Not $objRecordSet.EOF Then
        $strDN = $objRecordSet.Fields("distinguishedName").Value
        Dim $objUser = ObjGet("LDAP://" & $strDN)
        Return $objUser.telephoneNumber
    Else
        ;Not found
        Return
    EndIf
EndFunc   ;==>GetTel
Func _GetExt()
    Local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc")
    Local $sUsername = 'username'
    Local $sPassword = 'password'
    Local $sDatabase = 'shoreware'
    Local $sServer = 'server'
    Local $sDriver = "{MySQL ODBC 5.3 Unicode Driver}"
    Local $iPort = 4308!Default Template
    Local $result
    $ObjConn = ObjCreate("ADODB.Connection")
    $ObjConn.ConnectionString = "DRIVER=" & $sDriver & ";SERVER=" & $sServer & ";DATABASE=" & $sDatabase & ";User=" & $sUsername & ";Password=" & $sPassword & ";PORT=" & $iPort
    If IsObj($ObjConn) Then
        $ObjConn.open()
    Else
        Exit
    EndIf
    $rsResult = $ObjConn.Execute("SELECT UserDN FROM users WHERE GuiLoginName='" & @UserName & "'")
    With $rsResult
        While Not .EOF
            
            ;MsgBox(0,'',.Fields("UserDN").Value)
            $result = .Fields("UserDN").Value
            .MoveNext
        WEnd
        .Close
    EndWith
    $ObjConn.Close
    ;MsgBox(0,'',$result)
    Return $result
    
EndFunc   ;==>_GetExt
Func _ErrFunc($oError)
    ; Do anything here.
    ConsoleWrite(@ScriptName & " (" & $oError.scriptline & ") : ==> COM Error intercepted !" & @CRLF & _
            @TAB & "err.number is: " & @TAB & @TAB & "0x" & Hex($oError.number) & @CRLF & _
            @TAB & "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
            @TAB & "err.description is: " & @TAB & $oError.description & @CRLF & _
            @TAB & "err.source is: " & @TAB & @TAB & $oError.source & @CRLF & _
            @TAB & "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
            @TAB & "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
            @TAB & "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
            @TAB & "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
            @TAB & "err.retcode is: " & @TAB & "0x" & Hex($oError.retcode) & @CRLF & @CRLF)
EndFunc   ;==>_ErrFunc
Func _GetDL()
    
    Local $objUser, $objRootDSE, $objConnection, $objRecordSet, $objCommand
    Local $GroupCollection, $ObjGroup, $result
    Local $StrUserName, $StrDomName, $StrSQL
    $objRootDSE = ObjGet("LDAP://RootDSE")
    $StrDomName = $objRootDSE.Get("DefaultNamingContext")
    $StrUserName = @UserName
    $StrSQL = "Select ADsPath From 'LDAP://" & $StrDomName & "' Where ObjectCategory = 'User' AND SAMAccountName = '" & $StrUserName & "'"
    ;Set ADO connection
    $objConnection = ObjCreate("ADODB.Connection")
    $objConnection.Provider = "ADsDSOObject"
    $objConnection.Open("Active Directory Provider")
    ;Set ADO command
    $objCommand = ObjCreate("ADODB.Command")
    $objCommand.ActiveConnection = $objConnection
    $objCommand.Properties("Searchscope") = 2
    $objCommand.CommandText = $StrSQL
    ;Set recordset to hold the query result
    $objRecordSet = $objCommand.Execute
    If Not $objRecordSet.EOF Then
        $objRecordSet.MoveLast
        $objRecordSet.MoveFirst
        $objUser = ObjGet($objRecordSet.Fields("ADsPath").Value)
        $GroupCollection = $objUser.Groups
        For $ObjGroup In $GroupCollection
            If ($ObjGroup.GroupType = 2 Or $ObjGroup.GroupType = 4 Or $ObjGroup.GroupType = 8) Then
                $result = $result & @TAB & @TAB & @TAB & $ObjGroup.CN & @CR
            Else
                ;Do nothing
            EndIf
            
        Next
        $ObjGroup = Null ;
        $GroupCollection = Null ;
        $objUser = Null ;
        Return $result ;
    Else
    EndIf
    
EndFunc   ;==>_GetDL
Func GetotherTelephone()
    Local $objRootDSE, $strDomain, $objConnection, $objCommand, $objRecordSet, $strDN
    ;Const ADS_SCOPE_SUBTREE = 2
    
    $objRootDSE = ObjGet("LDAP://RootDSE")
    $strDomain = $objRootDSE.Get("DefaultNamingContext")
    ;Set ADO connection
    $objConnection = ObjCreate("ADODB.Connection")
    $objConnection.Provider = "ADsDSOObject"
    $objConnection.Open("Active Directory Provider")
    ;Set ADO command
    $objCommand = ObjCreate("ADODB.Command")
    $objCommand.ActiveConnection = $objConnection
    $objCommand.Properties("Searchscope") = 2
    $objCommand.CommandText = "SELECT distinguishedName FROM 'LDAP://" & $strDomain & "' WHERE objectCategory='user' AND samAccountName = '" & @UserName & "'"
    ;Set recordset to hold the query result
    $objRecordSet = $objCommand.Execute
    ;If a user was found - Retrieve the otherTelephone
    If Not $objRecordSet.EOF Then
        $strDN = $objRecordSet.Fields("distinguishedName").Value
        Dim $objUser = ObjGet("LDAP://" & $strDN)
        Return $objUser.otherTelephone
    Else
        ;"Not found"
        Return
    EndIf
EndFunc   ;==>GetotherTelephone
Default template attached:

[SHORETEL] Get workgroup, user extension, user login and workgroup description.

To get a list of workgroup, user extension, user login and workgroup description, connect to the Shoretel Shoreware database and run the following SQL:

SELECT workgroupmembers.WorkgroupDN,workgroupmembers.UserDN,users.GuiLoginName, dn.Description FROM workgroupmembers 
INNER JOIN DN ON workgroupmembers.WorkgroupDN=dn.DN
INNER JOIN users ON workgroupmembers.UserDN=users.UserDN

 

[PowerShell] Send email from Gmail with attachment on PowerShell

Credits goes to 

I modified the script a little bit to pick up the log from c:\temp\ daily where the filename is made up of yyyymmdd

$a = Get-Date -Format yyyyMMdd

$smtpClient = new-object system.net.mail.smtpClient 
$smtpClient.Host = 'smtp.gmail.com'
$smtpClient.Port = 587
$smtpClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("username@gmail.com", "password");

$emailFrom = "sender@domain.com"
$emailTo = "receipt1@domain.com,receipt2@domain.com"
$Subject = "Backup log for " +$a
$Body = "Please refer to attached logfile."

$emailMessage = New-Object System.Net.Mail.MailMessage
$emailMessage.From = $EmailFrom
$emailMessage.To.Add($EmailTo)
$emailMessage.Subject = $Subject
$emailMessage.Body = $Body
$emailMessage.Attachments.Add("C:\temp\libra_backup"+ $a+".txt")
$SMTPClient.Send($emailMessage)
$emailMessage.Attachments.Dispose()

 

For more information on Get-Date format, please click here

[PowerShell] Retrieving hard disk health through SMART status

To get the SMART status of the hard disk with PowerShell, you could run the following:

Get-WmiObject win32_diskdrive|Select-Object Status

 

Below is a sample script to check multiple PC’s SMART status by getting a list of PC names from a text file.

$allComputers=Get-Content -Path C:\temp\pc.txt

foreach($computer in $allComputers)
{

$isonline=test-connection -Quiet -count 2 -ComputerName $computer
if($isonline)
{

$diskStatus= Get-WmiObject win32_diskdrive -ComputerName $computer|Select-Object -ExpandProperty Status

Write-Host -ForegroundColor Green "$computer is online and disk status is $diskStatus";
$diskStatus="";
}
else
{
Write-Host -ForegroundColor Red "$computer is offline";
}

}

[Mac] Backup and restore Microsoft Office 2011 for Mac.

Referring to this article, we could move Office 2011 license from one Mac to another simply by copying a couple files. I had created 2 scripts to simplify the task.

 

BackupOfficeLicense.sh

#!/bin/sh

cd ~/Desktop
mkdir OfficeLicense
mkdir OfficeLicense/$HOSTNAME
mkdir OfficeLicense/$HOSTNAME/LaunchDaemons
mkdir OfficeLicense/$HOSTNAME/PrivilegedHelperTools
mkdir OfficeLicense/$HOSTNAME/Preferences
cp /Library/LaunchDaemons/com.microsoft.office.licensing.helper.plist ./OfficeLicense/$HOSTNAME/LaunchDaemons
cp /Library/PrivilegedHelperTools/com.microsoft.office.licensing.helper ./OfficeLicense/$HOSTNAME/PrivilegedHelperTools
cp /Library/Preferences/com.microsoft.office.licensing.plist ./OfficeLicense/$HOSTNAME/Preferences

 

The script would backup the necessary files to a folder called OfficeLicense on the Desktop. The files will be placed into Desktop/OfficeLicense\$HOSTNAME. Where $HOSTNAME will be the current Mac’s hostname.

RestoreOfficeLicense.sh

#!/bin/sh

cd ~/Desktop
cp ./OfficeLicense/$HOSTNAME/LaunchDaemons/com.microsoft.office.licensing.helper.plist /Library/LaunchDaemons
cp ./OfficeLicense/$HOSTNAME/PrivilegedHelperTools/com.microsoft.office.licensing.helper /Library/PrivilegedHelperTools
cp ./OfficeLicense/$HOSTNAME/Preferences/com.microsoft.office.licensing.plist /Library/Preferences

 

Assuming that the Mac where you want to restore the license will be using the same hostname, place the folder on the Desktop and run RestoreOfficeLicense.sh

 

 

 

 

[Shoretel] Get Workgroup and user extension with login name

To get a list of Workgroup and user extension with login name, connect to the Shoretel Shoreware database and run the following SQL:

SELECT workgroupmembers.WorkgroupDN,workgroupmembers.UserDN,users.GuiLoginName FROM workgroupmembers INNER JOIN users ON workgroupmembers.UserDN=users.UserDN