Tuesday, August 30, 2016

Show inactive users of active directory group

I have limited license count for users which use Office 365 system. The assigned user license for office system happens to be managed via Active Directory group. I my situation the user count exceeds number 300. Now it is pretty crucial to start look in this group which users are not using domain system at all.

It is time for PowerShell.

Here is quick query to look for most inactive user accounts which has assigned to the office system:
Get-ADGroup "Office 365 Users" | Get-ADGroupMember | Get-ADUser -Properties LastLogonDate | sort LastLogonDate | ft Name,SamAccountName,LastLogonDate -AutoSize

Monday, August 29, 2016

Find latest computer object in AD, PowerShell

I have computer hall where I set up new computer devices over PXE boot. This zero touch scenario is pretty awesome since it is automatically installs operating system, join workstation to domain, installs office, drivers and enable remote desktop access so I can setup few custom things. Since I am lazy bastard and do not note down the computer mac address and do not create IP address reservation then I need somehow know the computer name or IP address for this new system. One way I found is using this PowerShell query:
Get-ADComputer -Filter 'name -Like "MININT*"' -Properties name,whenCreated,IPv4Address | sort whenCreated | ft name,whenCreated,IPv4Address
MININT* is automatically generated computer name from SCCM operating system deployment.

Tuesday, August 23, 2016

Shut down multiple Raspberry Pies remotely

I have multiple Raspberry Pies and one main proxy Pi which monitor these pies.
I want to shut down all other pies without entering any password.

To do this task I have to set the main RPi very trusted and let other pies know that this one is the king. Lets log into the main pi now.

Make sure I am logged with user [pi] right now:
whoami
Lets generate some public key content:
ssh-keygen
After this command I need to press [Enter] two times.

With user [pi] I need to install this key on all other pies:
ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.99.61
ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.99.62
ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.99.63
..
If I have done some cloning with pies then I need to remove key:
ssh-keygen -f "/home/pi/.ssh/known_hosts" -R 192.168.99.61
ssh-keygen -f "/home/pi/.ssh/known_hosts" -R 192.168.99.62
ssh-keygen -f "/home/pi/.ssh/known_hosts" -R 192.168.99.63
..
Again make sure you are user [pi] right now:
whoami
Now I create this new script:
vi ~/emergency-shutdown.sh
Lets create some loop with host names in array:
#!/bin/sh
for a in 192.168.99.61 192.168.99.62 192.168.99.63 192.168.99.64;do
ssh -t pi@$a 'sudo shutdown -h now'
done
Set the script executable:
chmod +x ~/emergency-shutdown.sh
To shut down everything I use:
./emergency-shutdown.sh

Monday, August 22, 2016

CalcAverage.java, compile, run

To compile Java code I need some working code.
The are file names at the internet which ends with .java

To compile code I need to install jdk. This time I use version 8.

Once the program is installed I can modify windows %path% variable to include:
C:\Program Files\Java\jdk1.8.0_101\bin
This is a sample program CalcAverage.java:
 import java.util.Scanner;

 // Note: In order to keep this code simple, there is no exception handling in this class.  
 //  Please enter only integers when you run this program.
 
public class CalcAverage {

   public static void main (String args[]) {
 
    Scanner sc = new Scanner (System.in);
 System.out.println();
 System.out.println("Enter 3 Integers separated only by spaces: (example 20 30 40)");
 int i1 = sc.nextInt();
 int i2 = sc.nextInt();
 int i3 = sc.nextInt();
 int avg = (i1 + i2 + i3)/3;
 System.out.println();
  
 System.out.println("Average = " + avg);
   }  // end of main method
} // end of class
To compile this code I use:
javac CalcAverage.java
This will create .class. To run the code I use:
java CalcAverage
If I execute file with .class extension then I get errror:
Error: Could not find or load main class CalcAverage.class
.java file in not necessary to run the program. Only .class file is needed.
CalcAverage.java is only needed for source.

Another way to work with code is to install NetBeans:
https://netbeans.org/downloads/

To set specific java platform I need multiple jdk's installed for example jdk 8 and jdk 7

To force java 7 platform I need to install jdk 7 and the add it to netbeans:

Add path to JDK 7 for example:

Tuesday, August 16, 2016

vhd_boot_host_volume_not_enough_space

This happens when I add VHD image to the boot entry where the disk by itself in guest operating system is much bigger then real free space on physical drive. It can be solved if I add additional disk with a lot of free space and move VHD file to this disk. No need to modify boot manager :)

Monday, August 15, 2016

python2, No parser was explicitly specified, windows

I am running program in Python2 using Windows machine. The code I use is:
import requests
from bs4 import BeautifulSoup
r = requests.get("https://distrowatch.com/")
soup = BeautifulSoup(r.content)

And I got this message:
Warning (from warnings module):
  File "C:\Python27\lib\site-packages\beautifulsoup4-4.5.1-py2.7.egg\bs4\__init__.py", line 181
UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.

The code that caused this warning is on line 1 of the file <string>. To get rid of this warning, change code that looks like this:

 BeautifulSoup([your markup])

to this:

 BeautifulSoup([your markup], "html.parser")
I found out that I can soulve this situation by including forcing to use HTMLParser:
import requests
import HTMLParser
from bs4 import BeautifulSoup
r = requests.get("https://distrowatch.com/")
soup = BeautifulSoup(r.content, "html.parser")

Wednesday, August 10, 2016

Add Public Folder Owner permission, PowerShell, Exchange

List all folders:
Get-PublicFolder -Identity "\" -Recurse
Add permissions to single public folder:
Add-PublicFolderClientPermission -Identity "\Custom Folder Name" -Recurse -AccessRights Owner -User usernamegoeshere
Add permissions to all public folders:
Get-PublicFolder –Identity "\" –Recurse | Add-PublicFolderClientPermission –User usernamegoeshere –AccessRights Owner
Related:
http://port25guy.com/2009/11/13/how-to-apply-permissions-to-public-folder-and-all-sub-folders-in-exchange-20072010-using-exchange-management-shell/

Tuesday, August 9, 2016

Add user to multiple exchange additional mailboxes

Content of C:\PowerShell\mailboxes.lst:
email1@custom.com
email2@custom.com
email3@custom.com
Content of C:\PowerShell\add-user-to-mailboxes.ps1:
Get-Content c:\PowerShell\mailboxes.lst | Foreach-Object {
Add-MailboxPermission -Identity $_ -User usernamegoeshere -AccessRights FullAccess
Set-Mailbox -Identity $_ -GrantSendOnBehalfTo @{add='usernamegoeshere '}
}

Monday, August 8, 2016

Measure Raspberry Pi temperature with zabbix agent

I have zabbix server running on raspberry and I have bunch of other pies with different heatsinks on the top of CPU. It is interesting to create some historical record of how the temperature changes for my pies.

At first I need to let the zabbix user execute that kind of sensitive commands for the raspbian operating system. One way how to do it is to add zabbix user to group video:
usermod -a -G video zabbix
Now I move to zabbix user cause I need to test if this command is allowed to run by this user:
sudo su
su - zabbix
The magic command for temperature measure is:
vcgencmd measure_temp | sed "s/^.*=\|..$//g"
Now I exit zabbix user:
exit
The magic command for zabbix server item is:
system.run[vcgencmd measure_temp | sed "s/^.*=\|..$//g"]
I decided to put this item under classic zabbix agent template:

Float data type must be selected otherwise nothing will work:

After few hours I got some results:

Sunday, August 7, 2016

Outlook.exe always runs in administrative mode

I have this situation when the Outlook 2016 icon suddenly show as administrative.

In my situation I think my office was not activated and reached its deadline period. So the computer now wants that the administrator really opens outlook application and activate it.

Another thing I did is I execute MS Office repair wizard:
http://download.microsoft.com/download/5/0/5/505878EB-FFC4-4DF0-A526-B1165BFA6C35/o15-ctrremove.diagcab
4874105a5002fc5066c3b535e6afd2ed
56c6ca76993a96cf9a255463b90db96cb9d24464

After the restart I installed Office 365 again. Some errors occurred about upload center, but now the Outlook icon runs in non-administrative mode.
Problem solved :)

Saturday, August 6, 2016

Microsoft Office maintenance scripts, 2010, 2013

setup.xml which always restart computer at the end:
<Configuration Product="ProPlus">
<Display Level="basic" CompletionNotice="no" SuppressModal="yes" AcceptEula="yes" />
<Setting Id="SETUP_REBOOT" Value="AutoAlways" />
</Configuration>

setup.xml without restart:
<Configuration Product="ProPlus">
<Display Level="basic" CompletionNotice="no" SuppressModal="yes" AcceptEula="yes" />
<Setting Id="SETUP_REBOOT" Value="Never" />
</Configuration>

Install Office 2010 x86 on 64-bit or 32-bit machine:
@echo off
setlocal EnableDelayedExpansion
if not "%ProgramFiles(x86)%"=="" set x=Wow6432Node\
reg query "HKLM\SOFTWARE\%x%Microsoft\Windows\CurrentVersion\Uninstall\Office14.PROPLUS" > nul 2>&1
if not !errorlevel!==0 start /wait %~dp0setup.exe /config %~dp0setup.xml
endlocal

Uninstall Office 2010 x86 from 64-bit or 32-bit machine:
@echo off
setlocal EnableDelayedExpansion
if not "%ProgramFiles(x86)%"=="" set x=Wow6432Node\
reg query "HKLM\SOFTWARE\%x%Microsoft\Windows\CurrentVersion\Uninstall\Office14.PROPLUS" > nul 2>&1
if !errorlevel!==0 start /wait %~dp0setup.exe /uninstall ProPlus /config %~dp0setup.xml
endlocal

Install Office 2010 x64 on 64-bit machine:
@echo off
setlocal EnableDelayedExpansion
if "%ProgramFiles(x86)%"=="" goto exit
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Office14.PROPLUS" > nul 2>&1
if not !errorlevel!==0 start /wait %~dp0setup.exe /config %~dp0setup.xml
:exit
endlocal

Uninstall Office 2010 x64:
@echo off
setlocal EnableDelayedExpansion
if "%ProgramFiles(x86)%"=="" goto exit
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Office14.PROPLUS" > nul 2>&1
if !errorlevel!==0 start /wait %~dp0setup.exe /uninstall ProPlus /config %~dp0setup.xml
:exit
endlocal

Install Office 2013 x86 on 64-bit or 32-bit machine:
@echo off
setlocal EnableDelayedExpansion
if not "%ProgramFiles(x86)%"=="" set x=Wow6432Node\
reg query "HKLM\SOFTWARE\%x%Microsoft\Windows\CurrentVersion\Uninstall\Office15.PROPLUS" > nul 2>&1
if not !errorlevel!==0 start /wait %~dp0setup.exe /config %~dp0setup.xml
endlocal

Uninstall Office 2013 x86 from 64-bit or 32-bit machine:
@echo off
setlocal EnableDelayedExpansion
if not "%ProgramFiles(x86)%"=="" set x=Wow6432Node\
reg query "HKLM\SOFTWARE\%x%Microsoft\Windows\CurrentVersion\Uninstall\Office15.PROPLUS" > nul 2>&1
if !errorlevel!==0 start /wait %~dp0setup.exe /uninstall ProPlus /config %~dp0setup.xml
endlocal

Install Office 2013 x64 on 64-bit machine:
@echo off
setlocal EnableDelayedExpansion
if "%ProgramFiles(x86)%"=="" goto exit
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Office15.PROPLUS" > nul 2>&1
if not !errorlevel!==0 start /wait %~dp0setup.exe /config %~dp0setup.xml
:exit
endlocal

Uninstall Office 2013 x64 from 64-bit machine:
@echo off
setlocal EnableDelayedExpansion
if "%ProgramFiles(x86)%"=="" goto exit
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Office15.PROPLUS" > nul 2>&1
if !errorlevel!==0 start /wait %~dp0setup.exe /uninstall ProPlus /config %~dp0setup.xml
:exit
endlocal

Office 2016 silent install, detection method

To install only Word, Excel, PowerPoint create install.xml with content:
<Configuration>
  <Display Level="Full" AcceptEULA="TRUE" />
  <Property Name="FORCEAPPSHUTDOWN" Value="TRUE"/>
  <Add OfficeClientEdition="32" Channel="Deferred">
    <Product ID="O365ProPlusRetail">
      <Language ID="en-us" />
      <ExcludeApp ID="Access"/>
      <ExcludeApp ID="Groove"/>
      <ExcludeApp ID="InfoPath"/>
      <ExcludeApp ID="Lync"/>
      <ExcludeApp ID="OneDrive"/>
      <ExcludeApp ID="OneNote"/>
      <ExcludeApp ID="Outlook"/>
      <ExcludeApp ID="Publisher"/>
      <ExcludeApp ID="SharePointDesigner"/>
      <ExcludeApp ID="Visio"/>
    </Product>
  </Add>
</Configuration>

Create silent-install.cmd with content:
@echo off
setlocal EnableDelayedExpansion
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\O365ProPlusRetail - en-us" > nul 2>&1
if not !errorlevel!==0 (
start /wait "" "%~dp0setup.exe" /configure %~dp0install.xml
echo !errorlevel!
) else echo Office 365 already insalled
endlocal

Friday, August 5, 2016

Office 2016 silent uninstall

create uninstall.xml with content:
<Configuration>
<Display Level="None" AcceptEULA="True" />
<Property Name="FORCEAPPSHUTDOWN" Value="True" />
<Remove>
    <Product ID="O365ProPlusRetail">
      <Language ID="en-us" />
    </Product>
  </Remove>
</Configuration>

And now silent-uninstall.cmd script:
@echo off
setlocal EnableDelayedExpansion
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\O365ProPlusRetail - en-us" > nul 2>&1
if !errorlevel!==0 start /wait %~dp0setup.exe /configure %~dp0uninstall.xml
endlocal

Thursday, August 4, 2016

Failed to remove driver, print management

Failed to remove driver. The specified printer driver is currently in use.

I solve this situation with regedit

Deleted all connections under:
HKEY_CURRENT_USER\Printers\Connections

Deleted all printer settings under:
HKEY_CURRENT_USER\Printers\Settings
With administrative permissions restart printer spooler.

If no success then with admin permissions under regedit delete all connections under
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers\Client Side Rendering Print Provider\S-1-5-21-725345543-515967899-839522115-6576\Printers\Connections
Remove printer id key searched by printer driver name under
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers\Client Side Rendering Print Provider\Servers\server-name\Printers

Restart printer spooler

Wednesday, August 3, 2016

Prepare Raspberry Pi for passive cooling

I was developing some security layer for raspberry passive cooling. At the end I want to put huge heat sink on the top :)

This is my template which I designed in OpenOffice Draw:

To download file copy this name to clipboard:
rpi23.odg
Click save target as and paste name from clipboard.

The result has been printed by 3d printer. I don't owe one. I just have 3d printing service in my city :) This time the layer is 0.4 mm thin.
On the left side this layer has been installed on Raspberry Pi 2.
On the right side this layer has been installed on Raspberry Pi 3.

I am not quite satisfied yet. It will be much better with 0.2 mm thickness.

Monday, August 1, 2016

Office 2010 / 2013 silent uninstall, directory based

Yet another master piece. I love directory based scripts so much. This only means less code and more productivity. Now I uninstall Office 2010 and Office 2013 systems with very short code. Same code for booth system. That is because the script looks for Office installation source into subdirectories. If it founds Office 2010 source then it compares the directory name with installed programs from registry. If the Office program was found then uninstall it. Same scenario for Office 2013.

The direcotry structure for this sample is:
\uninstall-office-2010-2013.cmd
\x64\Office14.PROPLUS\setup.exe
\x64\Office14.PROPLUS\setup.xml
\x64\Office15.PROPLUS\setup.exe
\x64\Office15.PROPLUS\setup.xml
\x86\Office14.PROPLUS\setup.exe
\x86\Office14.PROPLUS\setup.xml
\x86\Office15.PROPLUS\setup.exe
\x86\Office15.PROPLUS\setup.xml
The directory names like Office14.PROPLUS and Office15.PROPLUS is just registry key name under HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall or
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
That is why I call this method "directory based" :)

The content of setup.xml for all four type of source files are the same and it is:
<Configuration Product="ProPlus">
<Display Level="none" CompletionNotice="no" SuppressModal="yes" AcceptEula="yes" />
<Setting Id="SETUP_REBOOT" Value="AutoAlways" />
</Configuration>
Main code uninstall-office-2010-2013.cmd is here:
@echo off
rem list of errorlevel codes
rem https://support.microsoft.com/en-us/kb/304888

setlocal EnableDelayedExpansion

date /t
time /t
echo.

rem this sleep is very important. it will complete remove software from previsous restart
echo sleeping for 90 seconds
"%~dp0sleep.exe" 90

rem this sleep is very important. it will complete remove software from previsous restart

rem detect if this is 64-bit or 32-bit windows
if "%ProgramFiles(x86)%"=="" goto UNINSTALL_32_BIT_OFFICE_FROM_32_BIT_SYSTEM

rem this happens only on 64-bit windows
echo This is 64-bit operating system
echo.

:UNINSTALL_32_BIT_OFFICE_FROM_64_BIT_SYSTEM
"%~dp0sleep.exe" 30

rem check if some office source exists
for /f "tokens=*" %%a in ('dir /b "%~dp0x86" ^| find "PROPLUS"') do if "%%a" NEQ "" (

rem if the source exists then check if the product is really installed
reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\%%a" > nul 2>&1

rem if product is installed..
if !errorlevel!==0 (

echo 32-bit %%a detected. uninstalling now..

rem execute uninstall process
for /f "tokens=2 delims=." %%l in ('echo %%a') do start /wait %~dp0x86\%%a\setup.exe /uninstall %%l /config %~dp0x86\%%a\setup.xml

echo setup has completed with code !errorlevel!, lets restart computer now..

rem if another installation process is in use then show all processes
if !errorlevel!==1618 tasklist
rem lets retry uninstallation if errorcode is 1618
if !errorlevel!==1618 goto UNINSTALL_32_BIT_OFFICE_FROM_64_BIT_SYSTEM

rem skip any other uninstall maintenance because computer restart is needed
goto exit
) else echo no 32-bit %%a installed
)

:UNINSTALL_64_BIT_OFFICE_FROM_64_BIT_SYSTEM
"%~dp0sleep.exe" 30

rem check if some office source exists
for /f "tokens=*" %%a in ('dir /b "%~dp0x64" ^| find "PROPLUS"') do if "%%a" NEQ "" (

rem if the source exists then check if the product is really installed
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%%a" > nul 2>&1

rem if product is installed..
if !errorlevel!==0 (

echo 64-bit %%a detected. uninstalling now..

rem execute uninstall process
for /f "tokens=2 delims=." %%l in ('echo %%a') do start /wait %~dp0x64\%%a\setup.exe /uninstall %%l /config %~dp0x64\%%a\setup.xml

echo setup has completed with code !errorlevel!, lets restart computer now..

rem if another installation process is in use then show all processes
if !errorlevel!==1618 tasklist
rem lets retry uninstallation if errorcode is 1618
if !errorlevel!==1618 goto UNINSTALL_64_BIT_OFFICE_FROM_64_BIT_SYSTEM

rem skip any other uninstall maintenance because computer restart is needed
goto exit
) else echo no 64-bit %%a installed
)
goto exit


:UNINSTALL_32_BIT_OFFICE_FROM_32_BIT_SYSTEM
"%~dp0sleep.exe" 30

rem this happens only on 32-bit windows
echo This is 32-bit operating system
echo.

rem check if some office source exists
for /f "tokens=*" %%a in ('dir /b "%~dp0x86" ^| find "PROPLUS"') do if "%%a" NEQ "" (

rem if the source exists then check if the product is really installed
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%%a" > nul 2>&1

rem if product is installed..
if !errorlevel!==0 (

echo 32-bit %%a detected. uninstalling now..

rem execute uninstall process
for /f "tokens=2 delims=." %%l in ('echo %%a') do start /wait %~dp0x86\%%a\setup.exe /uninstall %%l /config %~dp0x86\%%a\setup.xml

echo setup has completed with code !errorlevel!, lets restart computer now..

rem if another installation process is in use then show all processes
if !errorlevel!==1618 tasklist
rem lets retry uninstallation if errorcode is 1618
if !errorlevel!==1618 goto UNINSTALL_32_BIT_OFFICE_2010_LANGUAGE_PACKS_FROM_32_BIT_SYSTEM

rem skip any other uninstall maintenance because computer restart is needed
goto exit
) else echo no 32-bit %%a installed
)


:exit

echo.

date /t
time /t
echo ===============================================================================

endlocal

I set this script in computer startup and then sleep.exe is crucial:
http://gnu.catonrug.net/sleep.exe

Cisco VPN Client silent install for Windows 10 x86

Download DNE Update:
ftp://ftpsupport.citrix.com/dneupdate.msi

Install DNE Update:
@echo off
setlocal EnableDelayedExpansion

reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{E4EC6A71-6B83-4F2A-A6F5-A54430564FE4}" > nul 2>&1
if not !errorlevel!==0 (
echo Installing DNE update..
%systemroot%\system32\msiexec.exe /i "%~dp0dneupdate.msi" /qb /norestart
) else echo DNE update is already installed

endlocal

Download Global VPN Client:
http://help.mysonicwall.com/applications/vpnclient/GVCSetup32_4.9.9.1016_EN.exe
a494ac99fa74aed2a24a14998e5ecb4a
c9fbc1870f54fcf5cd900de9d64139a490322c67

Use 7-zip to unpack GVCSetup32_4.9.9.1016_EN.exe and get GVCInstall32.msi.
037d1385f67b2b32c880c422c5f73257
6134e505f3c130bdde6175add99c46ece4887451

Install Global VPN Client:
@echo off
setlocal EnableDelayedExpansion

reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{3D3AD380-2DFE-4ACA-A014-4D12D4E9CE84}" > nul 2>&1
if not !errorlevel!==0 (
echo Installing Global VPN Client..
%systemroot%\system32\msiexec.exe /i "%~dp0GVCInstall32.msi" /qb /norestart
) else echo Global VPN Client is already installed

endlocal

Download Cisco VPN Client:
http://www.asc.edu/downloads/CiscoVPN/Windows/vpnclient-win-msi-5.0.07.0410-k9.exe
a8407593072cfabb83410f2f06fa8b61
9dcb2e9de75204a4361036cdd194d2775b0b4b26

Unpack vpnclient-win-msi-5.0.07.0410-k9.exe

Install Cisco VPN Client:
@echo off
setlocal EnableDelayedExpansion

reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1CE60928-8325-49A8-8B06-633E48DD2B67}" > nul 2>&1
if not !errorlevel!==0 (
echo Installing Cisco VPN Client..
%systemroot%\system32\msiexec.exe /i "%~dp0vpnclient_setup.msi" /qb /norestart
) else echo Cisco VPN Client is already installed

endlocal

Open command prompt in "Run As Administrator" mode and paste command
reg add "HKLM\SYSTEM\CurrentControlSet\Services\CVirtA" /v DisplayName /t REG_SZ  /d "Cisco Systems VPN Adapter" /f

All files unpacked and prepared for install can be found by extracting this archive:
https://drive.google.com/file/d/0B6XjkIrefxmZb3dUTFU2RXllWFE/view?usp=sharing

Blog Archive