Use PowerShell Instead of cURL

I recently had to come up with a way to schedule regular downloads of a file from a website that uses cURL. cURL is a command line tool for transferring data with URL syntax.  Getting cURL approved for use in my company is a bit difficult, so I set out to find a PowerShell solution. What I found was surprisingly easy to write and implement. You may want to take a look at the cURL Sourceforge page to get more information. Keep in mind that cURL parameters are specific to the website you are downloading from so every website will be different. You may need to contact that site’s tech support to find out what you need to pass if you can’t figure it out from the URL.

As always, if you use this script, please give credit.

$path     = "c:\PoShOut\"
$username = "username"
$password = "password"
$filename = "somefile.zip"
$somefile = "downloadedfile.zip"
 
# Create COM object, open a connection to www.somewhere.com,
# and set the header type
$document = New-Object -ComObject msxml2.ServerXMLHTTP
$document.open("POST", "https://www.somewhere.com", $false)
$document.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
 
# Create the necessary login and report information from the parms we passed
$postline = "user=" + $username + "&password=" + $password + "&filename=" + $filename
 
# Login to Markit with the information we passed above
$document.send($postline)
 
# Check to see if we have a document matching the parms we passed
$response = $document.getResponseHeader("Content-Type")
 
# If we have a document, make sure it's a Zip file, get the filename,
# and put the Zip into a Byte array. Once the file is downloaded, write
# the Byte array to a file.
If($response.Substring(0,17).ToLower() -eq "application/x-zip")
{
     $filename = $response.Substring(24)
     [Byte[]]$file = $document.responseBody
     [System.IO.File]::WriteAllBytes($path + $filename,$somefile)
}

Fix Windows Live Movie Maker’s Black Screen When Editing Fraps Videos

I’ve recently decided to make some YouTube videos of how to find Datacrons in SW:TOR that I recorded with Fraps. My video editor of choice is typically Windows Live Movie Maker because:

    a.) It’s easy to use
    b.) It’s cheap (read: FREE)

However, for some reason, the preview screen only showed black. I dug out Google and Bing and began looking for solutions. I saw all kinds of solutions from uninstalling/reinstalling everything to using another app to import, convert, and export the Fraps movie to a format that WLMM could render. I know when I made my iRacing vids, I didn’t have this problem. So, I kept digging.

Finally, I happened upon a post on Windows 7 Forums that struck a chord. I have two Nvidia graphics card and after an upgrade to the 285.62 drivers, DCS: A-10 Warthog had some wierd graphical anomalies. There is a bug in this revision of the driver that causes chunks of the world to either render black or transparent.

So, with that in mind, I hit Nvidia’s website and downloaded the previous WHQL drivers (280.26) and voila! No more black preview screen. So, if you are having this problem I recommend getting the 280.62 drivers, or you can play around and find the latest drivers that fix this issue.

Use Your Logitech G25/G27 Pedals as Rudder Controls

If you are into flight sims like Flight Simulator X, X-Plane, or IL-2, you know that it’s much more realistic and much cooler to pilot your airplane with real rudder controls.  Unfortunately, the CH rudder pedals are kind of a one trick pony and kind of expensive.  If you happen to also be a sim racer and you happen to have a G25 or G27 wheel with pedals, you’re in luck.  You can used those G2x pedals as your rudder pedals for most flight sims.  I’ve been able to use them for FSX, IL-2, X-Plane, and Wings of Prey.  Theoretically, this should work with anything that uses rudder-type controls. It’s relatively to use the accelerator and the brake as rudder pedals.  The Logitech Profiler will do that for you by combining the accelerator and brake axis.  However, the brake has a much stiffer throw than the accelerator and, for me, it kind of breaks the illusion of flying.  So, we’ll learn how to combine your clutches axis with the accelerator so your feet will be in a more natural position and the throw will feel roughly the same on both pedals.

GET YOUR STUFF

What you’ll need at a minimum is:

  • Logitech G25/G27 Pedals
  • GlovePIE
  • PPJoy (version 0.8.4.5 early release)
  • Microsoft Windows

I also have a Bodnar box which allows me to connect my pedals directly to my computer.  It gives the pedals a much higher resolution than having them connected through the wheel.  The instructions here assume you have one.  If you don’t, you’ll still be able to make this work, but you’ll have to fiddle with the GlovePIE program a bit.  More on that later.

EXTRACT GLOVEPIE

Once you’ve downloaded all of the necessary software, you can begin by extracting GlovePIE.  It’s not an install, so just uzip it to wherever you are going to run it from.  After you’ve extracted the software, you’ll probably want to put a shortcut to GlovePIE somewhere you can launch it before launching your favorite sim.  You’ll be using GlovePIE.exe everytime you want to turn your G25 pedals into rudder pedals.

INSTALL PPJOY

After you’ve taken care of GlovePIE, you’ll need to install PPJoy.  Here is where the fun begins if you are a Windows 7 x64 user (if you are a 32 bit Windows user, you can skip straight to the configuration part).  Microsoft enforces driver signing in 64 bit Windows 7 for security purposes.  This is a good deal for security, but not so much for small hobbyist developers like Deon Van Der Westhuysen.  A Verisign certificate costs upwards of $500 per year…not very attractive for a guy just trying to help the community. In any case, there is good news for us in the x64 boat.  When you launch the installer, you’ll see a message box with some cryptic commands in it.  Essentially, this is what’s going to allow us to install and run PPJoy.  If you’ve begun installing PPJoy, click cancel.  Open a command prompt by clicking Start, then Run, type CMD, and hit Enter (or you can hold the Windows key and press R).  In the DOS window, type the following and hit enter:

BCDEDIT -SET TESTSIGNING ON

After you’ve turned Test Signing on, you you see a message on your desktop telling you that you are in Test Mode.Windows 7 Test Mode If you don’t see this message, PPJoy will not work.  It’s worth noting that if you have the User Account Control turned on, you may need to run the command prompt as the local administrator.  You can do this by finding the shortcut for the command prompt in the Start Menu, right-clicking it, and selecting Run As Administrator.

If you see this message, congratulations, you’ve just made your computer slightly less secure!  I recommend extreme caution when installing anything while running in Test Mode.  When not using your pedals as rudder pedals, I recommend turning this off by running the same command, but change ON to OFF.  Unfortunately, this seems to break the PPJoy install and you’ll need to reinstall it.  So, I’ve warned you about this.  If you goon your computer, I’m not legally, financially, morally, or emotionally responsible.  Like my old First Sergeant used to say, “Fair warning is fair play.”  You can go ahead an continue installing PPJoy like you would any other piece of software.

CONFIGURE PPJOY

After you’ve installed everything, you’ll need to configure a virtual joystick port.  Click Start, Programs, All Programs, and find the PPJoy Joystick Driver folder and launch “Configure Joysticks” and “Add” a joystick.  After adding a joystick, we need to configure it.  You can just use the defaults if you want, but it adds a bunch of stuff I don’t like.  Start the configuration process by clicking “Mapping” and doing the following:

  • Leave the default setting of “modify the mapping of this controller” and click Next
  • Change the Axes dropdown to 2 and make sure there are 0 buttons or POV hats selected (you may only need one axis here, but I chose 2 just to be safe)
  • Change Axis 1 to X Rotation and Axis 2 to Z Rotation and click Next
  • Make the Min setting on Axis 1 to Analog 0 and Axis 2 to Analogue 1 and click Next
  • Click Next on the next screen (everything should be grayed out anyway)
  • Click Finish

Windows Game ControllersYou can click “Done” on the PPJoy configuration window.  If everything is right with the world, you should see a PPJoy Virtual Joystick 1 entry in your Game Controllers settings.  If your Game Controllers window doesn’t show a virtual joystick, you’ll need to repeat the steps above.  It’s very important that a virtual controller shows up here.

CONFIGURE GLOVEPIE

Configuring GlovePIE is sometimes both the easiest and most frustrating part of this process.  GlovePIE is what turns your virtual joystick into a single axis that your flight simulator will be able to use as the rudder axis.  The biggest hurdle you have to overcome is to find out what your axes your computer reads on your virtual joystick.  Probably the easiest way is to buy FSUIPC. It’s an addon for FSX that really does a ton of stuff, but I use it for joystick calibration.  It will also show you what axis your rudder pedals use.

In any case, when launched, GlovePIE is pretty nondescript.  GlovePIEIt just a window with a three tabs and a run button.  We’re interested in the tab that’s labeled “Untitled”.  That’s where we write our program that will tell GlovePIE to turn our accelerator and clutch into one axis that our flight sim can use.  Depending on your pedal configuration, this is going to be much different that what I’ve written for my pedals.  If you have a Bodnar box, you will probably be able to just take the GlovePIE program I’ve written and use it for your pedals.  If you don’t…well, that’s where the frustration happens.  You can try every random axis your pedals could possibly use and you may stumble on the correct ones, but you may not either.  This is where FSUIPC will be helpful.  It’s been a while, but I think you need the full version in order to find joystick assignments.  If you don’t have FSUIPC and can’t afford it, you may want to check the internet and see if you can find the axes that the accelerator and clutch use.

If you have a Bodnar box, the program I’ve written should mostly just work.  There is some modification you may have to make depending on the number of joysticks you have and where your virtual joystick shows up in Game Controllers.  We’ll talk about that in a minute, but for now, just copy and paste the code below in to GlovePIE and save your program someplace you can find it (I keep mine in my GlovePIE directory).

///Combined throttle (X Rotation) and clutch (Z Rotation)
///make virtual joystick axis.  This is required if your
///G25 pedals are using a Bodnar Box.

PPJoy1.Analog0 =  (.5*Joystick2.U) - (-.5*Joystick2.R)

 

The breakdown of the code here is PPJoy1.Analog0 means that your are working with the first PPJoy joystick on the Analog 0 axis.  This is the Analogs you set in the PPJoy configuration.  The (.5*Joystick2.U) – (-.5*Joystick2.R) is where we configure how the axis works.  Before I break this down, I need to point out that this is where your configuration could differ quite a bit depending on whether you have a Bodar box, how many joysticks you have, and where your virtual joystick appears in your Game Controllers control panel.  I have 3 joysticks listed and my PPJoy joystick appears third in the list, so I use Joystick2.  If you are a programmer or a scripter, you probably understand why my joystick appears third in the list and is Joystick2.  Your joystick count starts at zero.  So, your first stick is Joystick0, your second is Joystick1, and your third is Joystick2.  Hey, I didn’t make the rules.

In real aircraft rudder pedals, each pedal is only responsible for half the total movement of the rudder.  The code above takes half of clutch (.5*Joystick2.U) and half of the accelerator (-.5*Joystick2.R) and combines them to be the a single axis (X Rotation).  Notice the accelerator uses a negative number in the assignment. It’s complicated, but this is necessary to make the accelerator work correctly.  If anyone really wants to understand why that is, let me know and I’ll explain it.

ASSIGN YOUR AXIS

Now that you have your axis created and functioning correctly, you need to go to the control panel of your favorite flight sim and configure them to be your rudder pedals (you need to make sure you have GlovePIE up and running the program we just created).  If you’ve done everything correctly, when you press either the accelerator or clutch, your flight sim should assign your new pedals axis to the rudder.

 

Hopefully this is helpful to somebody who has been struggling getting this functioning in x64 Windows or somebody just looking to add rudder pedals to their flight sim without investing more money in yet one more peripheral.  Please let me know if this has been helpful.  if you run across any mistakes, let me know if the comments.

Really Kill that Excel Object

If you’ve tried to use Excel 2007 or above with any of your Powershell scripts, you know that more often than not, when you quit Excel, a process stays running.  Not a huge deal until you’ve got a script scheduled to run several times a week and you end up silly with memory-eating Excel processes. You could kill all EXCEL.EXE processes, but what if you’ve got a scheduler that may be running other Excel processes as well?  If you kill all  running EXCEL.EXE processes, you’ll also be killing other Excel processes that should be running.

I’ve managed to put together some code that will determine what Excel processes are running before your create your Excel object and kill only the process spawned by your script.

## Grab all EXCEL.EXE processes before we create our Excel object.  This will find
## all Excel processes that we don't want to kill.  After we have those, we create
## our Excel object and immediately look at the Excel processes afterward.  There
## obviously a slight chance that you'll grab a process that spawned between our
## $startprocs and $endprocs scans, but it's a pretty small chance.
$startprocs = Get-Process | Where {($_.Name.ToLower() -eq "excel")}
$excel      = New-Object -ComObject Excel.Application
$endprocs   = Get-Process | Where {($_.Name.ToLower() -eq "excel")}
 
//             Your Code Goes Here                                        //
 
## Try to quit Excel (after you've saved your doc).  It's probably not going to work,
## but we're gonna try anyway.
$excel.Quit()
 
## Check to make sure $startprocs isn't null.  If it is null and we don't check, the
## script will blow.  If $startprocs is null, we're going to kill the only running
## Excel process...the one we created.
If($startprocs -gt $null)
{
     $compare = Compare-Object $startprocs $endprocs
     $process  = $compare | % {If($_.SideIndicator -match "=>") {$_.InputObject}}
}
else
{
     $process = $endprocs
}
 
Kill -Id $process.Id

Use Powershell to Pass Embedded Credentials

I needed to pass the ID/password of a service account to a Microsoft HPC grid for some jobs we were submitting automatically.  Powershell was able to do that pretty easily.

***WARNING***  This script reads a domain ID and password from an unencrypted file.  Our implementation of this script used a protected file.  Yours should too!  You’ve been warned.  I’m not responsible if your account password is compromised.

$domain      = "[Your domain name]"
$filename    = "[Path to filename]\filename"
$username    = $domain + "\" + ($username.substring(($username.Length - 5),5))
$password    = Get-Content $filename | ConvertTo-SecureString -AsPlainText -Force
$credentials = New-Object System.Management.Automation.PSCredential($username,$password)

A couple notes here.  The $filename variable is used to get the entire path of the password file.  For ease of scripting, I’ve created a file named the same as the user ID I’m using with no file extension.  In the $username line, I’ve concatenated the $domain variable, a backslash, and the user ID that I’ve derived by taking the substring of the length of the $filename variable, minus the length of the ID, plus the length.  There is a cleaner way to do this, but the ID I’m using will never change (yes, I said never), so I chose this method.

$username    = $domain + "\" + ($username.substring(($username.Length - 5),5))

From that point, we read the password from the file and pipe it into the ConvertTo-SecureString commandlet.  Since we are using a plaintext password here (see the warning above), we have to use the -AsPlainText and  Force parameters.  If you don’t use these, PoSh will complain, you’ll be frustrated.

$password    = Get-Content $filename | ConvertTo-SecureString -AsPlainText -Force

The last line is used to actually pass the credentials to a variable that can be used in a script that requires authentication.

$credentials = New-Object System.Management.Automation.PSCredential($username,$password)

Turn Off the UAC with Powershell

I wrote this script to turn off the UAC on our HPC R2 grid with 64 servers.  It works very well, but there is not any real error handling in there to account for offline computers.  If you are doing this for Windows 7 computers that may or may not be online, you may want to add some custom ping checks to keep the script from blowing chunks.

As always, uses the script in whole or in part, but I’d appreciate some props if you do.

########################################################################
#
#	Disable User Account Control
#
#	Author:  Jim Melton
#
#	This script checks the registry for all computer in a flat file
#		and checks to see if the UAC is turned on.  If it is, it will
#		set the EnableLUA value to 0.  The script can be modified to
#		enable the UAC if need be.  A machine reboot is required to
#		complete the change.
#
########################################################################
 
########################################################################
#
#	Initialize variables and set paths
#
########################################################################
$computers = Get-Content ""
$WriteUAC = $true
$UACvalue = "EnableLUA"
$UACoff   = 0
$UACpath  = "Software\Microsoft\Windows\CurrentVersion\policies\system"
 
########################################################################
#
#	Loop through the input file for all computers, open the remote
#		HKLM hive using .NET, open the subkey to the UAC setting, and
#		get the Enable UAC value.
#
########################################################################
ForEach($computer in $computers){
 
  $OpenRegistry = [Microsoft.Win32.RegistryKey]::`
	OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine,$computer)
 
  $UACsubkey = $OpenRegistry.OpenSubKey($UACpath,$WriteUAC)
  $UACsubkey.ToString()
  $UACstate  = $UACsubkey.GetValue($UACvalue)
  Write-Host "The UAC on $computer is currently set to $UACstate."
 
########################################################################
#
#	If the EnableLUA value is set to 1, set it to 0.  Grab the EnableLUA
#		value after the change to make sure it was successful.
#
########################################################################
 
  If($UACstate -eq 1)
    {
	Write-Host "Turning the UAC off..."
	$UACsubkey.SetValue($UACvalue, $UACoff)
	$UACstate = $UACsubkey.GetValue($UACvalue)
	Write-Host "The UAC on $computer is now set to $UACstate.`
             The computer needs to be rebooted."
    }
}