[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

 

[Oracle] Allowing Oracle ADI users to switch database with a batch file

Some ADI users will need to switch between database for different purposes. However, this would not be easy without having to change the network config files for Oracle.

I had created a batch file to allow users to change database by first preparing all the database registry, network config (tnsnames.ora and sqlnet.ora) and put them under C:\ADI. I had grant normal users the rights to change those files.

Below is the batch:

@ECHO off
cls
:start
ECHO.
ECHO ADI Menu.
ECHO 1. PRD 8000
ECHO 2. TST 8001
ECHO 3. UAT 8002
ECHO 4. DEV 8003
ECHO 5. PTH 8018
ECHO 6. Exit

set choice=
set /p choice=Please select database from the above list and press enter:
REM if not '%choice%'=='' set choice=%choice:~0,1%
if '%choice%'=='1' goto PRD8000
if '%choice%'=='2' goto TST8001
if '%choice%'=='3' goto UAT8002
if '%choice%'=='4' goto DEV8003
if '%choice%'=='5' goto PTH8018
if '%choice%'=='6' goto Exit
REM set choice
ECHO "%choice%" is not a valid input, Please try again.
pause
ECHO.
cls
goto start

:PRD8000
ECHO PRD8000 selected.
del /q C:\orant\NET80\ADMIN\sqlnet.ora
del /q C:\orant\NET80\ADMIN\tnsnames.ora
del /q C:\orant\NETWORK\ADMIN\sqlnet.ora
del /q C:\orant\NETWORK\ADMIN\tnsnames.ora

copy C:\ADI\tnsnames.ora_Prod8000 C:\orant\NETWORK\ADMIN\
copy C:\ADI\tnsnames.ora_Prod8000 C:\orant\NET80\ADMIN\

ren C:\orant\NETWORK\ADMIN\tnsnames.ora_Prod8000 tnsnames.ora
ren C:\orant\NET80\ADMIN\tnsnames.ora_Prod8000 tnsnames.ora

regedit /s c:\adi\prd8000.reg
goto end

:TST8001
ECHO TST8001 selected.
del /q C:\orant\NET80\ADMIN\sqlnet.ora
del /q C:\orant\NET80\ADMIN\tnsnames.ora
del /q C:\orant\NETWORK\ADMIN\sqlnet.ora
del /q C:\orant\NETWORK\ADMIN\tnsnames.ora

copy C:\ADI\tnsnames.ora_tst8001 C:\orant\NETWORK\ADMIN\
copy C:\ADI\tnsnames.ora_tst8001 C:\orant\NET80\ADMIN\

ren C:\orant\NETWORK\ADMIN\tnsnames.ora_tst8001 tnsnames.ora
ren C:\orant\NET80\ADMIN\tnsnames.ora_tst8001 tnsnames.ora

regedit /s c:\adi\tst8001.reg
goto end

:UAT8002
ECHO UAT8002 selected.
del /q C:\orant\NET80\ADMIN\sqlnet.ora
del /q C:\orant\NET80\ADMIN\tnsnames.ora
del /q C:\orant\NETWORK\ADMIN\sqlnet.ora
del /q C:\orant\NETWORK\ADMIN\tnsnames.ora

copy C:\ADI\tnsnames.ora_uat8002 C:\orant\NETWORK\ADMIN\
copy C:\ADI\tnsnames.ora_uat8002 C:\orant\NET80\ADMIN\

ren C:\orant\NETWORK\ADMIN\tnsnames.ora_uat8002 tnsnames.ora
ren C:\orant\NET80\ADMIN\tnsnames.ora_uat8002 tnsnames.ora

regedit /s c:\adi\uat8002.reg

goto end

:DEV8003
ECHO DEV8003 selected.
del /q C:\orant\NET80\ADMIN\sqlnet.ora
del /q C:\orant\NET80\ADMIN\tnsnames.ora
del /q C:\orant\NETWORK\ADMIN\sqlnet.ora
del /q C:\orant\NETWORK\ADMIN\tnsnames.ora

copy C:\ADI\tnsnames.ora_dev8003 C:\orant\NETWORK\ADMIN\
copy C:\ADI\tnsnames.ora_dev8003 C:\orant\NET80\ADMIN\

ren C:\orant\NETWORK\ADMIN\tnsnames.ora_dev8003 tnsnames.ora
ren C:\orant\NET80\ADMIN\tnsnames.ora_dev8003 tnsnames.ora

regedit /s c:\adi\dev8003.reg
goto end

:PTH8018
ECHO PTH8018 selected.
del /q C:\orant\NET80\ADMIN\sqlnet.ora
del /q C:\orant\NET80\ADMIN\tnsnames.ora
del /q C:\orant\NETWORK\ADMIN\sqlnet.ora
del /q C:\orant\NETWORK\ADMIN\tnsnames.ora

copy C:\ADI\tnsnames.ora_pth8018 C:\orant\NETWORK\ADMIN\
copy C:\ADI\tnsnames.ora_pth8018 C:\orant\NET80\ADMIN\

ren C:\orant\NETWORK\ADMIN\tnsnames.ora_pth8018 tnsnames.ora
ren C:\orant\NET80\ADMIN\tnsnames.ora_pth8018 tnsnames.ora

regedit /s c:\adi\pth8018.reg
goto end

:Cancel
exit

:end
start C:\orant\BIN\GLDI9032.EXE

 

 

 

[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

[PowerShell] Export AD photo

Here is a PowerShell to export AD photo, please make sure you have the rights to do so before running the script. The script will prompt for the username and it will be saved as “username.jpg” under the path specify in $path variable.

 

$username = Read-Host 'Please enter Username'

$path = 'C:\Photos\'

$User=GET-ADUser $username –properties thumbnailphoto

$Filename=$path+$username+'.jpg'

[System.Io.File]::WriteAllBytes($Filename, $User.Thumbnailphoto)

 

[PowerShell] Retrieve temperature information for Nvidia display cards

Some Nvidia display cards has support for WMI such that you could retrieve the temperature information.

For more information, please check out NVIDIA Windows Management Instrumentation SDK

Below is the code for local computer, you can always change the $ComputerName variable to point to a remote computer. I had it probe for all instances of the ThermalProbe, you can comment that out and un-comment the last 3 lines for temperature only. The majority part of the code comes from Nvidia’s SDK examples, which you could download from the link above.

Please note, as I only have NVS cards, I had filled up $supportedModels with the NVS model I have.

$ComputerName="localhost"
$supportedModels= "NVIDIA NVS 290","NVIDIA NVS 295","NVIDIA NVS 300","NVIDIA NVS 310","NVIDIA NVS 315","NVIDIA NVS 420","NVIDIA NVS 450","NVIDIA NVS 510","NVIDIA Quadro NVS 450"


$video_card_name=(gwmi win32_videocontroller -ComputerName $ComputerName)|select-object -expand name
write-host $video_card_name

If($supportedModels|?{$video_card_name -match $_})
{

#Write-Host "True"
gwmi -ComputerName $ComputerName -Namespace root\CIMV2\NV gpu|select-object name,percent*


$namespace = "root\CIMV2\NV"
$classname = "ThermalProbe"
# For local system (e.g. "LocalHost", ".") '-computername $computer' could be omitted
# retrieve all instances of the ThermalProbe class and store them:
$probes =Get-WmiObject -class $classname -computername $ComputerName -namespace $namespace
# print all ThermalProbe instances
$probes
# iterate through all Probe instances
foreach( $probe in $probes )
{
#"Call the info() method and print all the data"
$res = $probe.InvokeMethod("info",$Null)
$res
#"Query just the temperature"
#$temp = $probe.temperature
#$temp
}
}

[Outlook] Search Results can’t be moved or Categorized and Categories column isn’t shown

When using Outlook 2016 with an Exchange account, setting flag or category on search result may not work. To fix the issue, please create and following key:

Key: HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Options\Search
Value name: DisableServerAssistedSearch
Value type: REG_DWORD
Value: 1

More details can be found in this article.