Tim D'Annecy


#Windows #AutoHotkey

I wrote an AutoHotkey script that inserts commonly used text when a keystroke is pressed.

I had issues using the script with Active Directory Users and Computers. I would press the hotkey, but nothing would happen. This has something to do with how Windows handles UAC. Luckily, AHK has a workaround.

Found out from the AHK FAQ that I needed to rerun the AHK installer, select “Modify” in the installer, and check the box for “Add 'Run with UI Access' to context menus”.

Now, I can run my script and interact with ADUC windows without issues.

Making this note for myself for future reference.

#Windows #Powershell

I found a great way to have something similar to the GNU program top on Windows in Powershell in this Stack Exchange post.

While(1) {ps | sort -des cpu | select -f 15 | ft -a; sleep 1; cls}

It's not the exact same app, but it gives you the top 15 running processes sorted by CPU load.

#Windows #AutoHotkey

This AutoHotkey script improves the way Windows inserts accents to be more MacOS-like. I don't like the way the International keyboard handles, so I wrote this script.

Press the right Shift key with one of the letters a,c,e,i,n,o,u to get those characters with commonly used accent or alternative characters. The left Shift key will capitalize as normal. The Control key can also be used for other characters.

  • o + right Shift = ó
  • o + right Shift + left Shift = Ó
  • o + right Shift + Control = ö
  • o + right Shift + left Shift + Control = Ö
  • ? + right Shift = ¿

And so on.

; Accent keys, used with Right Shift key
RShift & 4::Send {€}

RShift & A::
    If GetKeyState("LShift", "P")
        Send {Á}
	Else Send {á}

RShift & C::
	If GetKeyState("LShift", "P")
		Send {Ç}
	Else Send {ç}

RShift & E::
	If GetKeyState("LShift", "P")
		Send {É}
	Else Send {é}

RShift & I::
	If GetKeyState("LShift", "P")
		Send {Í}
	Else Send {í}

RShift & N::
	If GetKeyState("LShift", "P")
		Send {Ñ}
	Else Send {ñ}

RShift & O::
	If GetKeyState("LShift", "P")
		If GetKeyState("Control", "P")
			Send {Ö}
		Else Send {Ó}

	Else If GetKeyState("Control", "P")
			Send {ö}
		Else Send {ó}

RShift & U::
	If GetKeyState("LShift", "P")
		If GetKeyState("Control", "P")
			Send {Ü}
		Else Send {Ú}
	Else If GetKeyState("Control", "P")
			Send {ü}
		Else Send {ú}

RShift & ?::Send {¿}

#Windows #AutoHotkey

This script inserts the date into the current cursor position after a hotkey is pressed.

  • ddd inserts the date like 2021-01-09

  • DDD inserts the date like 2021-Jan-09

  • fff inserts the date like 20210109T084323-0400

  • FFF inserts the date like 20210109 @ 084344-0400

#SingleInstance force

    if GetKeyState("LShift", "P") {
        FormatTime, CurrentDateTime, , yyy-MMM-dd
        SendInput %CurrentDateTime%
     else {
        FormatTime, CurrentDateTime, , yyy-MM-dd
        SendInput %CurrentDateTime%

    if GetKeyState("LShift", "P") {
        FormatTime, CurrentDate, , yyyyMMdd
        FormatTime, CurrentTime, , HHmmss-0400
        SendInput %CurrentDate% @ %CurrentTime%
     else {
        FormatTime, CurrentDateTime, , yyyyMMddTHHmmss-0400
        SendInput %CurrentDateTime%

#Windows #Azure #EndpointIntune

The Freshservice Discovery Agent helps you keep track of your assets by sending details (and updates) about the machine it is installed on. You can use Microsoft Endpoint/Intune to deploy the Discovery Agent in all the computers in your tenant.

Download Discovery Agent

  1. In Freshservice, go to Admin –> Discovery

  2. In the Download Agent section, choose Windows. Click the Download Agent button.

Download Microsoft Win32 Content Prep Tool

  1. Go to the Microsoft Win32 Content Prep Tool Github page. Click on IntuneWinAppUtil.exe. Microsoft Win32 Content Prep Tool Github page

  2. Click the Download button. IntuneWinAppUtil.exe Download button

Creating the IntuneApp

  1. Open Windows Terminal or PowerShell as an Admin. Navigate to the downloaded exe file using cd Windows Terminal as Admin

  2. Type the command .\IntuneWinAppUtil.exe and press Enter.

  3. Fill in the information requested by the packager:

    • Please specify the source folder: Type . to use the current directory. I downloaded my Freshservice msi in a folder on the same level, so my entry would be ../FS

    • Please specify the setup file: Enter the location of the Freshservice Discovery Agent msi file. Mine is ../FS/fs-windows-agent-2.7.0.msi

    • Please specify the output folder: Type . to use the current directory. I put mine back in ../FS

    • Do you want to specify catalog folder (Y/N)? Just type n to continue.

  4. After entering that information, the package will be built in the location you specified. Microsoft Terminal INFO Done!!!

Create deployment package in Microsoft Endpoint/Intune

  1. Navigate to the Microsoft Endpoint main page.

  2. Click on the Apps blade on the right-side menu. Endpoint Apps

  3. Click All apps in the menu and then click on the Add button.

  4. Choose Windows app (Win32) in the dropdown menu for App type and then click the Select button to continue. Select app type

  5. In the first page of the wizard, click the link Select app package file. Find the .intunewin package and click the OK button to begin uploading. Choose App package file

  6. Back on the “Add information” tab, put in the required information and click the Next button to continue. App information

  7. On the “Program” tab, don't change any of the default options. Click the Next button. Program

  8. On the “Requirements” tab, change the two required options. Click the Next button.

    • For “Operating system architecture”, select both 32 bit and 64 bit.

    • For “Minimum operating system”, select the lowest value. In this case, it's Windows 10 1607.


  1. On the “Detection rule” tab, change the “Rules format” dropdown to “Manually configure detection rules.” Click the link to Add a new rule. In the popup pane, change the “Rule type” to “MSI” and the MSI product code should automatically generate the correct number. Click the OK button to continue and then Next. Detection rule

  2. On the “Dependencies” tab, just leave default and click the Next button. Dependencies

  3. On the “Assignments” tab, select the groups in the Required category on which you want the Freshservice Discovery tool to be installed. Click the Next button. Assignments

  4. On the “Review + create” tab, make sure the options look correct and then click the Create button.

  5. Remain on the page for a few minutes while the package uploads. When it's finished uploading and processing, the assignments will be populated and computers in the group will begin to receive the deployment. Uploading app

More information here:

#Windows #Powershell

I have had to run this script to re-enable the meetings plugin for Outlook countless times. We’re running Office 365 and I have an E5 license and it seems like Outlook just likes to turn off this plugin. Here’s how you can use Powershell to turn it back on.

$AddinName = 'UCAddin.dll'
$ErrorActionPreference = 'SilentlyContinue'
$OutlookVersion = (Get-Item HKLM:\SOFTWARE\Classes\Outlook.Application\CurVer)."(default)".Replace("Outlook.Application.", "")
$wshell = New-Object -ComObject Wscript.Shell

$wshell.Popup("Click 'OK' to close Outlook. [Haga clic en 'Aceptar' para cerrar Outlook.]",0,"Done",0x0) > $null
Get-Process 'OUTLOOK' | Foreach-Object { $_.CloseMainWindow() | Out-Null } | stop-process –force

Get-Item -Path "HKCU:\Software\Policies\Microsoft\Office\$OutlookVersion.0\Outlook\Resiliency\AddinList" | Set-ItemProperty -Name $AddinName -Value 1
Get-Item -Path "HKCU:\Software\Microsoft\Office\$OutlookVersion.0\Outlook\Resiliency\DoNotDisableAddinList" | Set-ItemProperty -Name $AddinName -Value 1
Get-Item -Path "HKCU:\Software\Microsoft\Office\$OutlookVersion.0\Outlook\Resiliency\DisabledItems" | Remove-Item
Get-Item -Path "HKCU:\Software\Microsoft\Office\$OutlookVersion.0\Outlook\Resiliency\DisabledItems" | Out-Null
Get-Item -Path "HKCU:\Software\Microsoft\Office\$OutlookVersion.0\Outlook\Resiliency\CrashingAddinList" | Remove-Item
Get-Item -Path "HKCU:\Software\Microsoft\Office\$OutlookVersion.0\Outlook\Resiliency\CrashingAddinList" | Out-Null
Get-Item -Path "HKCU:\Software\Microsoft\Office\$OutlookVersion.0\Outlook\Resiliency\NotificationReminderAddinData" | Set-ItemProperty -Name ([string]::Format("{0}\dtype",$AddinName)) -Value 2
Get-Item -Path "HKCU:\Software\Microsoft\Office\$OutlookVersion.0\Outlook\Resiliency\NotificationReminderAddinData" | Set-ItemProperty -Name $AddinName -Value 2524611661
Get-Item -Path "HKCU:\Software\Microsoft\Office\$OutlookVersion.0\Outlook\Resiliency" | Set-ItemProperty -Name "CheckPoint" -Value 1
Get-Item -Path "HKCU:\Software\Microsoft\Office\Outlook\Addins\UCAddin.LyncAddin.1" | Set-ItemProperty -Name '(Default)' -Value 0
Get-Item -Path "HKCU:\Software\Microsoft\Office\Outlook\Addins\UCAddin.LyncAddin.1" | Set-ItemProperty -Name 'LoadBehavior' -Value 3

$wshell.Popup("Outlook plugin for Skype for Business meetings re-enabled. [Complemento de Outlook para reuniones de Skype Empresarial re-habilitado.]",0,"Done",0x0) > $null

#Windows #iCloud

I had this come up at work and it’s a bigger pain than I realized.

Open Outlook and switch to the Contacts view. Find the contacts you want to move over and select them with Shift+click. It might be easier to put them in a folder to keep everything organized.

Once they’re selected, navigate to the Home tab in the Ribbon and select Forward Contact –> As a Business Card. This will create a new email message with the selected contacts formatted as .vcf files, the format that iCloud accepts. Send the message to your Outlook email address.

Outlook freaks out and crashes if you select too many contacts. I haven’t found a sweet spot, but it seems to be around 30 contacts at a time.

When the message arrives with your contacts, open it in Outlook and select one of the attachments. Click on the arrow to the right of the attachment and select Save All Attachments. Put them in a new folder somewhere on your computer.

Now, we get into the weeds. Outlook exports vcf contacts with the version set to 2.1. For some reason, iCloud doesn’t like the version and will refuse to import your contacts. I’m running Office Version 1906 (Build 11727.20244 Click-to-Run) and I’m on an Office 365 E5 license, so things may have changed since I wrote this guide. In any case, we need to change the version number in each file from 2.1 to 3.0.

You can do this using several different tools. I’m sure Regex will get you there, but figuring out the right syntax might be too much trouble. You could edit them one by one if you don’t have too many. I opened one of the .vcf files in Notepad++ and used the Find & Replace tool on my exported folder.

Once you’ve changed the version, log in to iCloud, open the Contacts page and click and drag the .vcf files over into the Contacts column. It should upload and import them to iCloud and you’ll be able to access them on your iPhone or other devices that use iCloud’s contact sync.

Let me know if this worked for you. I couldn’t find anything online, so it may be helpful to some people.


I ran into an issue trying to upgrade a Windows 7 machine to Windows 10. I kept getting an error that said...

Windows10UpgraderApp.exe – System Error

The program can't start because api-ms-win-core-libraryloader-l1-1-1.dll is missing from your computer. Try reinstalling the program to fix this problem.

I read through this article and found the solution and I wanted to re-post it for my future use.

  1. Close the Windows 10 updater app, if open.

  2. Copy the file at C:\Windows\System32\wimgapi.dll

  3. Replace the file at C:\Windows10Upgrade\wimgapi.dll

That's it! You should be able to upgrade to Windows 10 without any other DLL issues.

#Windows #AutoHotkey

Just press the Control + Space keys and it will toggle the current window to lock on top of the others. This can get a bit wonky with multiple windows on top, but most of the time it works great.

^SPACE::  Winset, Alwaysontop, , A

#Windows #AutoHotkey

Just press the Control + shift + Space keys to toggle the currently active window roll status. This is a feature in some Linux window managers that I really wanted on Windows, so I found this script.

This script acts wonky sometimes depending on how the window is composited, so beware.

ws_MinHeight = 0

OnExit, ExitSub

WinGet, ws_ID, ID, A
Loop, Parse, ws_IDList, |
    IfEqual, A_LoopField, %ws_ID%
        StringTrimRight, ws_Height, ws_Window%ws_ID%, 0
        WinMove, ahk_id %ws_ID%,,,,, %ws_Height%
        StringReplace, ws_IDList, ws_IDList, |%ws_ID%
WinGetPos,,,, ws_Height, A
ws_Window%ws_ID% = %ws_Height%
WinMove, ahk_id %ws_ID%,,,,, %ws_MinHeight%
ws_IDList = %ws_IDList%|%ws_ID%

Loop, Parse, ws_IDList, |
    if A_LoopField =  
    StringTrimRight, ws_Height, ws_Window%A_LoopField%, 0
    WinMove, ahk_id %A_LoopField%,,,,, %ws_Height%