Monday, June 22, 2009

Reinstalled my HTPC

My HTPC was giving more and more problems and so I decided to reinstall the system. I'm running Windows 7 on my laptop and workstation so I wanted to try it on the HTPC as well. I did run into a couple of problems but though, here's what I needed to fix:

The soundcard of my Biostar P4VBM800 motherboard was working. The onboard chip is a C-Media CMI9761, which should be AC97 compatible but Windows did not detect it. after a little trial and error I found these drivers. Audio's working fine now, even the digital output works.

My ATI Radeon X1600 was detected but the standard MS driver does not support OpenGL. After trying a couple of solutions I found that the 7.11 Catalyst Vista Drivers work fine.

My HTPC is quite old (Pentium 4 @2,53 GHz with 1 GB RAM) but Windows 7 was running like a champ, better then XP and of course the biblically terrible Vista. So now I needed to install some media players:

First I installed XBMC as my main media center. This was the main reason I needed to get OpenGL going. XBMC does not do hardware accelerated video playback so I also installed MPC-HC and now my old HTPC is capable of 720p video playback at 25% CPU load.

Last I installed Hulu and used HotSpot Shield to access Hulu outside of the US. Video playback is fairly watchable on low quality, I'm going to check some other VPN solutions to see if I can get this to work better.

Tuesday, June 16, 2009

VBScript: Remove old Windows Updates

My virtual machines regularly fill up their system disks, with old uninstall information. I was getting tired of fixing this manually, so I wanted to create a script to do this automatically. I found a script that removed all updates and modified it to only remove updates older than 90 days:

Option Explicit
Dim o, oShell, nConfirm
Set o = WScript.Application
o.Interactive = True
Set oShell = CreateObject("WScript.Shell")
nConfirm = oShell.Popup("Do you want to remove Windows Update Uninstall Files?", 0, "Remove Windows Update Uninstall Files", 4 + 32)
If nConfirm = 7 Then
o.Quit 0
End If
Dim oFSO, sWinDir, oFolder, oDictionary, oSubFolder, sFolderName, sFolderPath, sUpdateName, sDeleted, sFolderDate
Set oFSO = CreateObject("Scripting.FileSystemObject")
sWinDir = oFSO.GetSpecialFolder(0)
sDeleted = vbNullString
Set oFolder = oFSO.GetFolder(sWinDir)
Set oDictionary = CreateObject("Scripting.Dictionary")
For Each oSubFolder In oFolder.SubFolders
sFolderName = LCase(oSubFolder.Name)
sFolderPath = LCase(oSubFolder.Path)
'Check date of update
sFolderDate = oSubFolder.DateCreated
If Left(sFolderName, 12) = "$ntuninstall" And Mid(sFolderName, 13, 2) = "kb" Or Mid(sFolderName, 13, 2) = "q" Then
sUpdateName = Mid(sFolderName, 13, Len(sFolderName) - 13)
'Remove update if older than x days
If DateDiff("d", sFolderDate, Now) > 90 Then
oDictionary.Add sUpdateName, sFolderPath
End If
End If
For Each sUpdateName in oDictionary.Keys
sDeleted = sDeleted & vbCrLF & sUpdateName
sFolderPath = oDictionary.Item(sUpdateName)
On Error Resume Next
oShell.RegDelete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" & sUpdateName & "\"
On Error Goto 0
oShell.Run "%ComSpec% /C RD /S /Q " & Chr(34) & sFolderPath & Chr(34), 0, True
If Len(sDeleted) > 0 Then
WScript.Echo "The uninstall data for the following updates are now removed:" & vbCrLf & UCase(sDeleted), vbOKOnly
sDeleted = vbNullString
WScript.Echo "No Windows Update Folders found for removal", vbOKOnly + vbInformation, "Nothing To Do"
End If
o.Quit 0

Save this code as removeOldUpdates.vbs and schedule a task to run weekly.

I'm thinking about expanding this script to clean up all kinds of temporary files.

Thursday, June 11, 2009

VBScript: Find username by AD fullname

I needed to find the username for a large number of active directory users. Turns out it's actually quite easy to do this with VBScript. Save the following script as a VBScript, for instance username.vbs. Change "domainname" to your own domain name.

Set oArgs = WScript.Arguments
Set objDomain = GetObject("WinNT://domainname")
objDomain.Filter = Array("User")
str2Find = oArgs(0)
For Each aUser In objDomain
If LCase(str2Find) = LCase(aUser.FullName) Then
Wscript.Echo str2Find & "=" & aUser.Name
strUser = aUser.Name
End If
Set objDomain = Nothing

Now you can search a username by running: cscript username.vbs "Full Username"

Monday, May 18, 2009

Sync Windows Mobile with Google Calendar

In this post I discussed Syncing Windows Mobile with Google Calendar using ActiveGCSync. Now I have found a way to sync your calendar using regular Active Sync.

Google has a new synchronisation service called Google Sync. The service is only available for Google Apps users so you need to set up a new calendar in Google Apps. Google Apps is still free up to a maximum of 50 users, but the registration page is difficult to find. You can find the registration page here.

Here's how I set up my calendar synchronisation:
1. Register a new account for Google Apps
2. Open Domain Settings, set Control Panel to "Next generation (US English only)"
3. Open Service Settings and enable Google Sync
4. Enable Google Calendar for your account
5. Set up ActiveSync using this guide

If your PDA was already in sync, this is all you needed to do. Use the Google Apps calendar from now on. If you need to export the appointments from your old Google calendar use this guide and this guide to import them again.

So far this has been working great, I'm getting less errors than ActiveGCSync used to generate. Now let's see when Google will allow ActiveSync to work with Gmail.

Saturday, November 1, 2008

Ikea hack: monitor shelve

Ikea hacking is all the rage these days. When you can't find exactly what you want the price of their products allows you to hack it into exactly what you need without feeling guilty about it. My solution is not so much a hack but more an insight into using the product for some other purpose.

My desk at home was a real mess, you'll just have to trust me: I did not take a before picture. I realised most of the trouble would be solved if I would make a shelve on which I could put my monitor. All the loose routers and other devices would slide right under. And if I did not use my Electribe it could slide under as well...

Walking through the Ikea I realized they did not have the product I was looking for. Then I noticed a display for the Effectiv filing cabinets, and there was this perfect base with ajustable legs.

So I brought it home, assembled it (no missing pieces, yihaa!) and started to clean up my desk. Here's the result:

Thursday, October 30, 2008

Disconnect GPRS connection if your NIC is connected

This is a VBScript I created some time ago. It will connect your GPRS connection if your NIC is not connected and disconnect the GPRS connection if the NIC is connected. It will work with other dial-up connections as well.

The script will run as a service with SrvAny and will reconnect the GPRS connection if the connection was dropped. I'm using WMI to determine the status of the LAN connection. For some reason I did not find the correct status of the GPRS connection in WMI and needed to use the output of ipconfig to determine if GPRS was still up.

Dim Shell, Hell, GPRS, ExecuteObj, strcmd, GPRSConnected

On error resume next

Set Shell = CreateObject("WScript.Shell")
strComputer = "."
GPRS = "0"

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery( _
"SELECT * FROM Win32_NetworkAdapter Where NetConnectionID = 'Local Area Connection'")

For Each objItem in colItems
If objItem.NetConnectionStatus = 7 Then
If GPRS = "0" Then
' Wscript.Echo "LAN connection disconnected!"
Shell.Run ("rasdial GPRS"), 0
GPRS = "1"
End if
If GPRS = "1" Then
' Wscript.Echo "LAN connection connected!"
Shell.Run ("rasdial GPRS /DISCONNECT"), 0
GPRS = "0"
End if
End if

If GPRS = "1" Then
Set ExecuteObj = Shell.Exec("ipconfig.exe")
Do While Not ExecuteObj.StdOut.AtEndOfStream
strcmd = ExecuteObj.StdOut.ReadLine()
If Instr(strcmd, "PPP") > 0 Then
GPRSConnected = "1"
End if
If not GPRSConnected = "1" Then
' Wscript.Echo "GPRS connection disconnected!"
Shell.Run ("rasdial GPRS"), 0
End if
Set ExecuteObj = nothing
Set GPRSConnected = nothing
End if

Wscript.Sleep 10000

Loop Until Hell="Freezes over!"

Automate HTML form submission

I needed to make a large amount of changes that would require me to open a form, fill it in, submit it and repeat this hundreds of times. I really did not have the time to do this so I needed a quick way to automate this process.

First let's take a look at part of the form I needed to fill in:

<form method="POST" action="/cgi-bin/script.cgi">
<input type="radio" name="brand" value="product1">Product 1
<input type="radio" name="brand" value="product2">Product 2
<td>User: </td>
<td><input type="text" name="username" size="20" id="fp1"></td>
<input type="submit" value="Submit" name="submit">

So there's a radio button to select a product and a textbox to submit a username. The data is then posted to the script.cgi script. Now, how would we automate the process to fill this form from a script? I chose to use cURL to submit the data to the script like this:

curl -d "brand=pin&username=product1&username=user&submit=Submit"

The parameter -d tells cURL to HTTP post data. The data is specified between the quotes, first a value name and then the value data. Different values are seperated by the & character. Remember to figure out what part triggers submission of the code and to add this value as well. In my case "submit=Submit".

Now all you need to do is use your favorite method to call cURL and enter the correct data between the quotes. I used Bash and chose to read the data from CSV files.

One more thing: I needed to post a slash in one of the values ("") and got strange results. As it turned out I needed to escape the data like this: "". You can find a complete list of HTML escape characters here.