Posts Tagged ‘ windows

Create a single standalone .exe from a Python program

I have been working on a small command line tool that I wanted to distribute it as a single executable file on . I tried cx_freeze and py2exe. Both of these tools worked well, but I couldn’t find an easy way to compress make the whole program into a .exe file. py2exe and cx_freeze both create working programs, but there are always some dependent .zip archive or .dll’s somewhere that need to be distributed with it. Pyinstaller, I found, actually compresses everything into a single .exe. This makes a pretty big executable (my small command line utility created a 5MB .exe file), but it’s simple and it works.

To use pyinstaller:

  1. grab pyinstaller 1.5rc (1.4 doesn’t work with 2.7). extract the zip file anywhere.
  2. change directories to the pyinstaller folder you just created.
  3. Before you create your first executable, you will have to run this once.
  4. python .py
  5. Now, pyinstall needs to scan through your program and create what they call a spec file.
  6. python makespec.py --onefile path\to\program\program.py
  7. Now, run this command to generate the executable.
  8. python build.py program\program.spec

Once the command has finished, the standalone executable will be available in the program\dist folder inside of pyinstaller.
Instructions for how to do this for a executable on ubuntu can be found here: http://excid3.com/blog/2009/12/pyinstaller-a-simple-tutorial/. You can find more info on pyinstaller at their website: http://www.pyinstaller.org/.

Monitoring Flexlm usage with Zabbix

Flexlm can be a hard thing to accurately measure and monitor. Luckily, the output from lmutil can be used to display . First thing to do is locate the lmutil binary and try to get it to run. I use Flexlm for autodesk on and ESRI on (centOS).

Windows:
This server seemed to want the license file specified. You may need to launch the GUI tool and watch the status bar for the path to it. This is what mine looked like:

"c:\program files\autodesk network license manager\lmutil" lmstat -c "c:\program files\autodesk network license manager\license\license.lic" -a

Linux:

/home/esri/arcgis/license10.0/bin/lmutil lmstat -a

That will spit out the current license usage for all your products. To isolate the numbers we want to monitor, we will be piping the output into some other commands like find and cut.
I recommend using the for windows http://gnuwin32.sourceforge.net/. These examples use the built-in ‘find’ utility, and a ‘cut.exe’ tool i found googling around. I had overlooked the gnutools when I first set this up. My mistake can be your gain. With gnutools, it will be easy to isolate the output you want using ‘grep’ and ‘cut’. First, isolate the line you are looking for with grep. You will have to figure out what feature code you want to monitor. mine looks like this:

Windows:

"c:\program files\autodesk network license manager\lmutil" lmstat -c "c:\program files\autodesk network license manager\license\license.lic" -a | find /i "64300acd_f:"

Linux:

/home/esri/arcgis/license10.0/bin/lmutil lmstat -a | grep ARC/INFO

now that you have the right line,  you can trim the extra characters with ‘cut’. It will take some experimentation to get it right.:

Windows:

"c:\program files\autodesk network license manager\lmutil" lmstat -c "c:\program files\autodesk network license manager\license\license.lic" -a | find /i "64300acd_f:" | cut -c 62-64

Linux:

/home/esri/arcgis/license10.0/bin/lmutil lmstat -a | grep ARC/INFO | cut -c 59-61

The output now should be only the number of licenses being used.

To allow zabbix to monitor this value, we need to create a ‘UserParameter’ read up on it here: http://www.zabbix.com/documentation/1.8/manual/config/user_parameters. This is what the parameter looks like on my servers:

Windows:

UserParameter=licenses.autocad.used,"c:\program files\autodesk network license manager\lmutil" lmstat -c "c:\program files\autodesk network license manager\license\license.lic" -a | find /i "64300acd_f:" | cut -c 62-64

Linux:

UserParameter=licenses.arcinfo.used,/home/esri/arcgis/license10.0/bin/lmutil lmstat -a | grep ARC/INFO | cut -c 59-61

Once you have the userparameter created on the license server, restart the agent and add an item in zabbix to begin collecting values.

Pstools: Access Denied in a Domain Environment

After upgrading to a 7 VM at work, I was having trouble getting commands to authenticate on remote machines. After much trial and error, I realized some curious behaviour with . Obviously, when connecting to a remote machine, I would try to use the ‘-u’ switch to specify my administrative account, but would always get ‘access is denied’. Of course, all of the normal things should be checked: simple sharing turned off, $ADMIN share working… you know…

The issue was apparently that if I log into my workstation as a non-administrative user, but try to issue pstools commands as an administrator,  it fails because Microsoft wants me to log into my workstation and work logged with my domain admin account.

Take a look at this example using psexec:
On windows 7, running ‘cmd’ as your non-admin user, if you type in the command:

c:\Program Files (x86)\PsTools>psexec -u domain\domainadmin \\targetmachine cmd

PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com

Password:
Could not start PsExec service on targetmachine:
Access is denied.

If you:

  1. Hit start
  2. Type “cmd”
  3. Hold down ‘shift’ and right-click on the ‘cmd’ in the start menu
  4. Select ‘run as different user’.
  5. Type in your administrative credentials. Use the same ones you will use in the psexec command.

Now you should have your command line window open. If you run the same command as earlier:

c:\Program Files (x86)\PsTools>psexec -u domain\domainadmin \\targetmachine cmd

PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com

Password:

Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.
C:\Windows\system32>

Now you’re in!

Windows 32 (x86) or 64 (AMD64) detection in batch files

While there are a lot of ways to detect for a 64 bit version of . you can test for %programFiles(x86)%, but handling the output and writing the IF comparisons is messy.

In files, you can easily check for architecture by using the “processor_architecture” variable. x86 versions of windows will have this set to “x86″, and x64 versions “x64″. Heres an easy example:

@echo off
IF %processor_architecture% ==  echo This is a 64-bit version of windows
IF %processor_architecture% == x86 echo this is a 32-bit version of windows.
pause

Uninstall ALL Versions of WinZip Batch Script

I have been struggling with this for quite a while, and ran into a lot of issues with all of the different versions on our network. There are people with 100 line .vbs to do this, and I think this is much simpler:

@echo off
REM
REM
REM    Detects winzip and silently uninstalls
REM    There is a un-stoppable pop-up window. so this will kill
REM    all instances of  IE after the UN-installation.
REM
REM
REM
 /F /IM wzqkpick.exe
 product where "name like '%%winzip%%'" call Uninstall
REM
REM This section is for WinZip <12
REM
If Exist "%programfiles(x86)%\Winzip\winzip32.exe" GOTO 64
If Exist "%programfiles%\Winzip\winzip32.exe" "%programfiles%\WinZip\Winzip32.exe" /Uninstallx
taskkill /F /IM iexplore.exe
GOTO :END
:64
"%programfiles(x86)%\WinZip\Winzip32.exe" /Uninstallx
taskkill /F /IM iexplore.exe
:END

For getting rid of WinZip 12, the magic happens in the 'wmic' line. It searches all of the installed product's names for "winzip" and will uninstall anything it finds. This only works for products that use MSI's. If you ran this outside of a file, you will have to use a single % percentage sign instead of the %% double percentage sign... scripting sucks, and that's just the way it is. Same thing that happens in "FOR" loops.

I never knew anything about the control (wmic) until now, but I will be sure to exploit it's features.