Friday, December 26, 2008

Adding a Virtual Host to Apache2 based on Name in CentOS 5

Well today I was setting up our new web development server and I wanted to use Host / Name based virtual hosts in apache, instead of the previous use of ports.

Much to my amazment this one is really simple.

Make sure to uncomment or add in:
NameVirtualHost *:80
Since I don't want to add multple IP's to the server and I always want to use port 80 (The default for http). 

Then I added 

<VirtualHost *:80>
        ServerName scorpio.mydomain.local
        ServerAlias scorpio
        DocumentRoot "/var/www/html"
        ServerPath /html/
        DirectoryIndex index.php index.htm
<VirtualHost *:80>
        ServerName dev.mydomain.local
ServerAlias www.mydowmain.local mydomain.local
        DocumentRoot "/var/www/html"
        ServerPath /html/
        DirectoryIndex index.php index.htm
<VirtualHost *:80>
        ServerName dev.myotherdomain.local
ServerAlias www.myotherdowmain.local myotherdomain.local
        DocumentRoot "/var/www/html"
        ServerPath /html/
        DirectoryIndex index.php index.htm
<VirtualHost *:80>
        ServerName dev.mythirddomain.local
ServerAlias www.mythirddowmain.local mythirddomain.local
        DocumentRoot "/var/www/html"
        ServerPath /html/
        DirectoryIndex index.php index.htm

When it was all said and done this was pretty easy.  Not as easy as doing the same thing in IIS in my opinion but still very easy.  I could have tried this with Webmin but I did this all using vi from the CLI.

Thursday, November 20, 2008

How to post XML code on Blogger

Yes, my last post made me think for a little while. I wanted to post XML code on Blogger, but it could have been HTML for all Blogger cares. What I had to do was encode the code. Rather than do it the tedious way by hand I choose to use a site such as to encode it for me.

Once I had the code encode and pasted back into Blogger everything worked out as expected.

Windows Firewall Allow Remote Administration using the netsh command

This is a quick oneliner that I have used in the past.  I forget it now and then and always have a hell of a time looking it up again.  I use it to allow my Spiceworks monitoring software access to the PC's so it can do it's thing.

netsh firewall set service remoteadmin enable

You could also add this to a WPKG package with the following code.

<package id="XPFirewallRemoteAdmin" name="Allow Remote Admin" revision="1" reboot="false" notify="false" priority="2" execute="once">
<install cmd='netsh firewall set service remoteadmin enable' />

Friday, November 14, 2008

Adding a Virtual Host to Apache2 based on Port

Today I had to setup an internal testbed server for one of our websites.  I didn't want to create a new host name for the site on our Apache server so I went with port based virtual hosts.

There are a few things you need to add for this to work.  My first attempt to make this happed in Webmin didn't produce the results I wanted, so I turned to my trusty text editor vi.

vi /etc/httpd/conf/httpd.conf

Now I had to add in a line similar to:
Listen 8080

Also you have to tell apache to use name based virtual hosting. So add in the line:
NameVirtualHost *:8080

Then finally you can create the directives for your virtual host.
DocumentRoot /your/path/here

Wednesday, October 29, 2008

Using AT to schedule a command for later in Linux / CentOS

I know this should be one of those basic things ALL Systems Administrators knows but I just learned it today.  I just re-installed a  server with CentOS 5.2.  While it is mostly up to date there are a bunch of packages that need to be updated.  I didn't want to hog all of our bandwidth during production hours and I forget to do stuff once I get home, so I want this to happen with out me thinking about it too much.

From a command prompt I typed:
at midnight tomorrow [ENTER]
yum -y update [ENTER]
[CTLR + D]
 This set up my command to update via my Yum repositories tonight at 12:00:00am (well technically tomorrow).

That is all.

Tuesday, October 28, 2008

Using nagios to check PHP script execution time

We want to record the execution time of some of our PHP scripts.  I want to use nagios to do this but it is proving rather difficult.

Initially I was hoping I could provide some credentials to nagios for it to use and log into our web site, run a set of scripts, and then report back to us how long each script took.  Since our site does not use basic authentication I cannot do it the intial way I wanted.  

To work around the issues we are having and hopefully NOT have to write our own nagios plug-in here is what I am proposing.

Create a test directory that uses basic authentication so it is protected from the general public and has a set of scripts that we run with the execution time posted near the bottom.  We then use the standard check_http plug-in from nagios to search for that string and parse it as normal. 

Hopefully this approach to things won't take too long to develop and prototype.  Also I hope to report back with a follow up on what I actually did (with code examples) to get this working.

Monday, October 27, 2008

Adding a calender to your BASH login script

You milage may vary, but on CentOS 5.2 I edited my .bash_profile to contain the line:
cal `date +"%m"` `date +"%Y"`
This put a nice looking calendar on my screen when I logged in vi ssh.  A small addition but handy non the less.

Thursday, October 23, 2008

Nagios check_mysql_connections example

I had a little bit of trouble getting the check_mysql_connections working but once I figured it out on the command line I had to get it working in nagios.  Still being a nagios noob I had a little trouble but also got it working in nagios.

The line below will work from the command line.
[user@host libexec]# ./check_mysql_connections -w 75 -c 90 -H 555.555.555.555 -u YOUR_USER -p YOUR_PASS

In the host file I setup the service as 

define service{
        service_description             MySQL Connections
        check_command                   check_mysql_connections! -w 75 -c 90 -H 555.555.555.555 -u YOUR_USER -p YOUR_PASS
        check_period                    24x7
        max_check_attempts              2
        notification_interval           30
        notification_options            c,w
        contact_groups                  mrsitis

Powershell: Equal Sign vs. -eq

I was just working on a script in powershell and saw the error "Length" is a ReadOnly property. It was from the code if ($args.count = 0) {exit;}.  Having "grown up" writing VB code this would have worked.  But in powershell you need to do if ($args.count -eq 0) {exit;} instead.

Powershell: Accept Unknown number of Args and process them

Recently I needed a script to move some files for a user.  It might be two or three files but I wanted to exersise my noggin in powershell.  This code will take any number of arguments and copy the files from the input directory to the output directory. Below is the code.

::Start Code::
# Display Help
if (($Args[0] -eq "-?") -or ($Args[0] -eq "-help")) {
   "Usage: pullQualityAssesments.ps1 "
   "            copies the Faxjob over to the Quality Assesments folder."
   "Example: pullQualityAssesments.ps1 400001 400002"
$inputdir = "\\someserver\savedfaxjobs\"
$outputdir = "\\someotherserver\Quality Assessments\"
$x = $args.count
$i = 0
do {
   $ordernumber = $args[$i]
   #write-host $inputdir$ordernumber.faxjob.* $outputdir
   $filelist = get-childitem $inputdir$ordernumber.faxjob.*
   foreach ($file in $filelist){write-host $file}
while ($i -le $x)
::End Code::

Unfortunatly we have 23,000+ files in our Input directory and this script is slower than me pulling them manually.  Maybe someday I can revisit this to filter it down to something that works and pulls in only the files it needs.

Powershell Check MySQL Status

The script below will check the specified server using the credentials provided and report back to you all of the Status Variables. You will have to change the line "$myconnection.ConnectionString" to what ever your settings are.  On a side note drop the <> from the lines.  Also you will need the MySQL .Net Connector for this to work.

::Start Code::
[void][system.reflection.Assembly]::LoadFrom("C:\Program Files\MySQL\MySQL Connector Net 5.2.3\Binaries\.NET 2.0\MySQL.Data.dll")

$myconnection = New-Object MySql.Data.MySqlClient.MySqlConnection
$myconnection.ConnectionString = "server=;user id=;password=;pooling=false"

$mycommand = New-Object MySql.Data.MySqlClient.MySqlCommand
$mycommand.Connection = $myconnection
$mycommand.CommandText = "SHOW STATUS;"
$myreader = $mycommand.ExecuteReader()
while($myreader.Read()){write-host $myreader.getstring(0)"|"$myreader.getstring(1)}
::End Code::

If you are only interested in a two or three of those variables (say threads_running and threads_connected) you can use the code below.

[void][system.reflection.Assembly]::LoadFrom("C:\Program Files\MySQL\MySQL Connector Net 5.2.3\Binaries\.NET 2.0\MySQL.Data.dll")

$myconnection = New-Object MySql.Data.MySqlClient.MySqlConnection
$myconnection.ConnectionString = "server=IP OR HOSTNAME;user id=YOUR_USER;password=YOUR_PASSWORD;pooling=false"

$mycommand = New-Object MySql.Data.MySqlClient.MySqlCommand
$mycommand.Connection = $myconnection
$mycommand.CommandText = "SHOW STATUS LIKE 'threads_connected';"
$myreader = $mycommand.ExecuteReader()

while($myreader.Read()){write-host $myreader.getstring(0)" : "$myreader.getstring(1)}
$mycommand.CommandText = "SHOW STATUS LIKE 'threads_running';"
$myreader = $mycommand.executereader()
while(${write-host $myreader.getstring(0)" : "$myreader.getstring(1)}

Tuesday, October 21, 2008

How to: Update the locate database in CentOS 5

I was curious after having to do this on a Fedora Core 4 box.  It is not the same. 

On CentOS run updatedb as root to update the locate database.  Handy if you just added a bunch libraries or programs and don't know where they got installed, mostly thanks to yum.

warning: locate: warning: database /var/lib/slocate/slocate.db' is more than 8 days old Fedora 4 Core 4 Fedora Core 4

warning: locate: warning: database /var/lib/slocate/slocate.db' is more than 8 days old
warning: Please make sure the daily cron job is enabled in /etc/updatedb.conf
The quick way to fix this error is to run locate -u from the command line as root.
Then edit the locate config file (vi /etc/updatedb.conf) and change the line "DAILY_UPDATE=no" to "DAILY_UPDATE=yes"

Thats it!

Monday, October 20, 2008

configure: error: Cannot find ssl headers on CentOS 5

I have been installing and configuring Nagios for monitoring our network here at work.  While this is not the perfect solution (not due it nagios limitations, but our own internal limits) it certainitly works for us for now.  
One of the things I have been wanting to monitor on top of our publicly available services such as HTTP, SSH, and FTP is the cpu load and other metrics of our servers.  

The problem I ran into while trying to configure the nrpe plugin before I compiled it was "configure: error: Cannot find ssl headers". I had been looking into this problem for a day or so before I found the simple solution.

yum install openssl-devel

After I ran the above command and installed it's dependencies I was able to configure and then complie the nrpe plug in per the guild I was following.
Now I just need to get the nrpe plugin installed on all of my servers!

Monday, October 13, 2008

CentOS 5 Default Apache Configuration httpd.conf

Yup, here is my backup plan for this file.
# This is the main Apache server configuration file. It contains the
# configuration directives that give the server its instructions.
# See URL: for detailed information.
# In particular, see
# URL:
# for a discussion of each configuration directive.
# Do NOT simply read the instructions in here without understanding
# what they do. They're here only as hints or reminders. If you are unsure
# consult the online docs. You have been warned.
# The configuration directives are grouped into three basic sections:
# 1. Directives that control the operation of the Apache server process as a
# whole (the 'global environment').
# 2. Directives that define the parameters of the 'main' or 'default' server,
# which responds to requests that aren't handled by a virtual host.
# These directives also provide default values for the settings
# of all virtual hosts.
# 3. Settings for virtual hosts, which allow Web requests to be sent to
# different IP addresses or hostnames and have them handled by the
# same Apache server process.
# Configuration and logfile names: If the filenames you specify for many
# of the server's control files begin with "/" (or "drive:/" for Win32), the
# server will use that explicit path. If the filenames do *not* begin
# with "/", the value of ServerRoot is prepended -- so "logs/foo.log"
# with ServerRoot set to "/etc/httpd" will be interpreted by the
# server as "/etc/httpd/logs/foo.log".

### Section 1: Global Environment
# The directives in this section affect the overall operation of Apache,
# such as the number of concurrent requests it can handle or where it
# can find its configuration files.

# Don't give away too much information about all the subcomponents
# we are running. Comment out this line if you don't mind remote sites
# finding out what major optional modules you are running
ServerTokens OS

# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
# NOTE! If you intend to place this on an NFS (or otherwise network)
# mounted filesystem then please read the LockFile documentation
# (available at );
# you will save yourself a lot of trouble.
# Do NOT add a slash at the end of the directory path.
ServerRoot "/etc/httpd"

# PidFile: The file in which the server should record its process
# identification number when it starts.
PidFile "/var/run/"

# Timeout: The number of seconds before receives and sends time out.
TimeOut 300

# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
KeepAlive on

# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
MaxKeepAliveRequests 100

# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
KeepAliveTimeout 15

## Server-Pool Size Regulation (MPM specific)

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves

StartServers 8
MinSpareServers 5
MaxSpareServers 20
MaxClients 150
MaxRequestsPerChild 100

# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves

StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0

# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, in addition to the default. See also the
# directive.
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses (
Listen *:80

# Dynamic Shared Object (DSO) Support
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need
# to be loaded here.
# Example:
# LoadModule foo_module modules/
LoadModule auth_basic_module modules/
LoadModule auth_digest_module modules/
LoadModule authn_file_module modules/
LoadModule authn_alias_module modules/
LoadModule authn_anon_module modules/
LoadModule authn_dbm_module modules/
LoadModule authn_default_module modules/
LoadModule authz_host_module modules/
LoadModule authz_user_module modules/
LoadModule authz_owner_module modules/
LoadModule authz_groupfile_module modules/
LoadModule authz_dbm_module modules/
LoadModule authz_default_module modules/
LoadModule ldap_module modules/
LoadModule authnz_ldap_module modules/
LoadModule include_module modules/
LoadModule log_config_module modules/
LoadModule logio_module modules/
LoadModule env_module modules/
LoadModule ext_filter_module modules/
LoadModule mime_magic_module modules/
LoadModule expires_module modules/
LoadModule deflate_module modules/
LoadModule headers_module modules/
LoadModule usertrack_module modules/
LoadModule setenvif_module modules/
LoadModule mime_module modules/
LoadModule dav_module modules/
LoadModule status_module modules/
LoadModule autoindex_module modules/
LoadModule info_module modules/
LoadModule dav_fs_module modules/
LoadModule vhost_alias_module modules/
LoadModule negotiation_module modules/
LoadModule dir_module modules/
LoadModule actions_module modules/
LoadModule speling_module modules/
LoadModule userdir_module modules/
LoadModule alias_module modules/
LoadModule rewrite_module modules/
LoadModule proxy_module modules/
LoadModule proxy_balancer_module modules/
LoadModule proxy_ftp_module modules/
LoadModule proxy_http_module modules/
LoadModule proxy_connect_module modules/
LoadModule cache_module modules/
LoadModule suexec_module modules/
LoadModule disk_cache_module modules/
LoadModule file_cache_module modules/
LoadModule mem_cache_module modules/
LoadModule cgi_module modules/
LoadModule version_module modules/

# The following modules are not loaded by default:
#LoadModule cern_meta_module modules/
#LoadModule asis_module modules/

# Load config files from the config directory "/etc/httpd/conf.d".
Include conf.d/*.conf

# ExtendedStatus controls whether Apache will generate "full" status
# information (ExtendedStatus On) or just basic information (ExtendedStatus
# Off) when the "server-status" handler is called. The default is Off.
#ExtendedStatus On

# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.
# User/Group: The name (or #number) of the user/group to run httpd as.
# . On SCO (ODT 3) use "User nouser" and "Group nogroup".
# . On HPUX you may not be able to use shared memory as nobody, and the
# suggested workaround is to create a user www and use that user.
# NOTE that some kernels refuse to setgid(Group) or semctl(IPC_SET)
# when the value of (unsigned)Group is above 60000;
# don't use Group #-1 on these systems!
User apache
Group apache

### Section 2: 'Main' server configuration
# The directives in this section set up the values used by the 'main'
# server, which responds to any requests that aren't handled by a
# definition. These values also provide defaults for
# any containers you may define later in the file.
# All of these directives may appear inside containers,
# in which case these default settings will be overridden for the
# virtual host being defined.

# ServerAdmin: Your address, where problems with the server should be
# e-mailed. This address appears on some server-generated pages, such
# as error documents. e.g.

# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
# If this is not set to valid DNS name for your host, server-generated
# redirections will not work. See also the UseCanonicalName directive.
# If your host doesn't have a registered DNS name, enter its IP address here.
# You will have to access it by its address anyway, and this will make
# redirections work in a sensible way.

# UseCanonicalName: Determines how Apache constructs self-referencing
# URLs and the SERVER_NAME and SERVER_PORT variables.
# When set "Off", Apache will use the Hostname and Port supplied
# by the client. When set "On", Apache will use the value of the
# ServerName directive.
UseCanonicalName on

# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
DocumentRoot "/var/www/html"

# UserDir: The name of the directory that is appended onto a user's home
# directory if a ~user request is received.
# The path to the end user account 'public_html' directory must be
# accessible to the webserver userid. This usually means that ~userid
# must have permissions of 711, ~userid/public_html must have permissions
# of 755, and documents contained therein must be world-readable.
# Otherwise, the client will only receive a "403 Forbidden" message.
# See also:

# UserDir is disabled by default since it can confirm the presence
# of a username on the system (depending on home directory
# permissions).
UserDir "disable"

# To enable requests to /~user/ to serve the user's public_html
# directory, use this directive instead of "UserDir disable":
#UserDir public_html

# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
# The index.html.var file (a type-map) is used to deliver content-
# negotiated documents. The MultiViews Option can be used for the
# same purpose, but it is much slower.

# AccessFileName: The name of the file to look for in each directory
# for access control information. See also the AllowOverride directive.
AccessFileName .htaccess

# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.

Order allow,deny
Deny from all

# TypesConfig describes where the mime.types file (or equivalent) is
# to be found.
TypesConfig "/etc/mime.types"

# DefaultType is the default MIME type the server will use for a document
# if it cannot otherwise determine one, such as from filename extensions.
# If your server contains mostly text or HTML documents, "text/plain" is
# a good value. If most of your content is binary, such as applications
# or images, you may want to use "application/octet-stream" instead to
# keep browsers from trying to display binary files as though they are
# text.
DefaultType text/plain

# The mod_mime_magic module allows the server to use various hints from the
# contents of the file itself to determine its type. The MIMEMagicFile
# directive tells the module where the hint definitions are located.

# MIMEMagicFile /usr/share/magic.mime
MIMEMagicFile conf/magic

# HostnameLookups: Log the names of clients or just their IP addresses
# e.g., (on) or (off).
# The default is off because it'd be overall better for the net if people
# had to knowingly turn this feature on, since enabling it means that
# each client request will result in AT LEAST one lookup request to the
# nameserver.
HostNameLookups Off

# EnableMMAP: Control whether memory-mapping is used to deliver
# files (assuming that the underlying OS supports it).
# The default is on; turn this off if you serve from NFS-mounted
# filesystems. On some systems, turning it off (regardless of
# filesystem) can improve performance; for details, please see
#EnableMMAP off

# EnableSendfile: Control whether the sendfile kernel support is
# used to deliver files (assuming that the OS supports it).
# The default is on; turn this off if you serve from NFS-mounted
# filesystems. Please see
#EnableSendfile off

# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a
# container, error messages relating to that virtual host will be
# logged here. If you *do* define an error logfile for a
# container, that host's errors will be logged there and not here.
ErrorLog "/var/log/httpd/error_log"

# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a
# container, they will be logged here. Contrariwise, if you *do*
# define per- access logfiles, transactions will be
# logged therein and *not* in this file.
# CustomLog logs/access_log common
CustomLog logs/access_log combined

# If you would like to have agent and referer logfiles, uncomment the
# following directives.
#CustomLog logs/referer_log referer
#CustomLog logs/agent_log agent

# If you prefer a single logfile with access, agent, and referer information
# (Combined Logfile Format) you can use the following directive.
#CustomLog logs/access_log combined

# Optionally add a line containing the server version and virtual host
# name to server-generated pages (error documents, FTP directory listings,
# mod_status and mod_info output etc., but not CGI generated documents).
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
# Set to one of: On | Off | EMail
ServerSignature on

# Aliases: Add here as many aliases as you need (with no limit). The format is
# Alias fakename realname
# Note that if you include a trailing / on fakename then the server will
# require it to be present in the URL. So "/icons" isn't aliased in this
# example, only "/icons/". If the fakename is slash-terminated, then the
# realname must also be slash terminated, and if the fakename omits the
# trailing slash, the realname must also omit it.
# We include the /icons/ alias for FancyIndexed directory listings. If you
# do not use FancyIndexing, you may comment this out.
Alias /icons/ "/var/www/icons/"

# This should be changed to the ServerRoot/manual/. The alias provides
# the manual, even if you choose to move your DocumentRoot. You may comment
# this out if you do not care for the documentation.
# 05/23/05: This is now provided via a separate package called httpd-manual
# which comes with an own manual alias
#Alias /manual "/var/www/manual"

# Location of the WebDAV lock database.
DAVLockDB /var/lib/dav/lockdb

# ScriptAlias: This controls which directories contain server scripts.
# ScriptAliases are essentially the same as Aliases, except that
# documents in the realname directory are treated as applications and
# run by the server when requested rather than as documents sent to the client.
# The same rules about trailing "/" apply to ScriptAlias directives as to
# Alias.
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

# Additional to mod_cgid.c settings, mod_cgid has Scriptsock
# for setting UNIX socket for communicating with cgid.
#Scriptsock logs/cgisock

# Redirect allows you to tell clients about documents which used to exist in
# your server's namespace, but do not anymore. This allows you to tell the
# clients where to look for the relocated document.
# Example:
# Redirect permanent /foo

# Directives controlling the display of server-generated directory listings.

# IndexOptions: Controls the appearance of server-generated directory
# listings.
IndexOptions FancyIndexing VersionSort NameWidth=*

# AddIcon* directives tell the server which icon to show for different
# files or filename extensions. These are only displayed for
# FancyIndexed directories.
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*

AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core

AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^

# DefaultIcon is which icon to show for files which do not have an icon
# explicitly set.
DefaultIcon /icons/unknown.gif

# AddDescription allows you to place a short description after a file in
# server-generated indexes. These are only displayed for FancyIndexed
# directories.
# Format: AddDescription "description" filename
#AddDescription "GZIP compressed document" .gz
#AddDescription "tar archive" .tar
#AddDescription "GZIP compressed tar archive" .tgz

# ReadmeName is the name of the README file the server will look for by
# default, and append to directory listings.
# HeaderName is the name of a file which should be prepended to
# directory indexes.
ReadmeName README.html
HeaderName HEADER.html

# IndexIgnore is a set of filenames which directory indexing should ignore
# and not include in the listing. Shell-style wildcarding is permitted.
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t

# DefaultLanguage and AddLanguage allows you to specify the language of
# a document. You can then use content negotiation to give a browser a
# file in a language the user can understand.
# Specify a default language. This means that all data
# going out without a specific language tag (see below) will
# be marked with this one. You probably do NOT want to set
# this unless you are sure it is correct for all cases.
# * It is generally better to not mark a page as
# * being a certain language than marking it with the wrong
# * language!
# DefaultLanguage nl
# Note 1: The suffix does not have to be the same as the language
# keyword --- those with documents in Polish (whose net-standard
# language code is pl) may wish to use "AddLanguage pl .po" to
# avoid the ambiguity with the common suffix for perl scripts.
# Note 2: The example entries below illustrate that in some cases
# the two character 'Language' abbreviation is not identical to
# the two character 'Country' code for its country,
# E.g. 'Danmark/dk' versus 'Danish/da'.
# Note 3: In the case of 'ltz' we violate the RFC by using a three char
# specifier. There is 'work in progress' to fix this and get
# the reference data for rfc1766 cleaned up.
# Catalan (ca) - Croatian (hr) - Czech (cs) - Danish (da) - Dutch (nl)
# English (en) - Esperanto (eo) - Estonian (et) - French (fr) - German (de)
# Greek-Modern (el) - Hebrew (he) - Italian (it) - Japanese (ja)
# Korean (ko) - Luxembourgeois* (ltz) - Norwegian Nynorsk (nn)
# Norwegian (no) - Polish (pl) - Portugese (pt)
# Brazilian Portuguese (pt-BR) - Russian (ru) - Swedish (sv)
# Simplified Chinese (zh-CN) - Spanish (es) - Traditional Chinese (zh-TW)
AddLanguage ca .ca
AddLanguage cs .cz .cs
AddLanguage da .dk
AddLanguage de .de
AddLanguage el .el
AddLanguage en .en
AddLanguage eo .eo
AddLanguage es .es
AddLanguage et .et
AddLanguage fr .fr
AddLanguage he .he
AddLanguage hr .hr
AddLanguage it .it
AddLanguage ja .ja
AddLanguage ko .ko
AddLanguage ltz .ltz
AddLanguage nl .nl
AddLanguage nn .nn
AddLanguage no .no
AddLanguage pl .po
AddLanguage pt .pt
AddLanguage pt-BR .pt-br
AddLanguage ru .ru
AddLanguage sv .sv
AddLanguage zh-CN .zh-cn
AddLanguage zh-TW .zh-tw

# LanguagePriority allows you to give precedence to some languages
# in case of a tie during content negotiation.
# Just list the languages in decreasing order of preference. We have
# more or less alphabetized them here. You probably want to change this.
LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW

# ForceLanguagePriority allows you to serve a result page rather than
# MULTIPLE CHOICES (Prefer) [in case of a tie] or NOT ACCEPTABLE (Fallback)
# [in case no accepted languages matched the available variants]
ForceLanguagePriority Prefer Fallback

# Specify a default charset for all content served; this enables
# interpretation of all content as UTF-8 by default. To use the
# default browser choice (ISO-8859-1), or to allow the META tags
# in HTML content to override this choice, comment out this
# directive:
AddDefaultCharset UTF-8

# AddType allows you to add to or override the MIME configuration
# file mime.types for specific file types.
#AddType application/x-tar .tgz

# AddEncoding allows you to have certain browsers uncompress
# information on the fly. Note: Not all browsers support this.
# Despite the name similarity, the following Add* directives have nothing
# to do with the FancyIndexing customization directives above.
#AddEncoding x-compress .Z
#AddEncoding x-gzip .gz .tgz

# If the AddEncoding directives above are commented-out, then you
# probably should define those extensions to indicate media types:
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz

# AddHandler allows you to map certain file extensions to "handlers":
# actions unrelated to filetype. These can be either built into the server
# or added with the Action directive (see below)
# To use CGI scripts outside of ScriptAliased directories:
# (You will also need to add "ExecCGI" to the "Options" directive.)
#AddHandler cgi-script .cgi

# For files that include their own HTTP headers:
#AddHandler send-as-is asis

# For type maps (negotiated resources):
# (This is enabled by default to allow the Apache "It Worked" page
# to be distributed in multiple languages.)
AddHandler type-map var

# Filters allow you to process content before it is sent to the client.
# To parse .shtml files for server-side includes (SSI):
# (You will also need to add "Includes" to the "Options" directive.)
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

# Action lets you define media types that will execute a script whenever
# a matching file is called. This eliminates the need for repeated URL
# pathnames for oft-used CGI file processors.
# Format: Action media/type /cgi-script/location
# Format: Action handler-name /cgi-script/location

# Customizable error responses come in three flavors:
# 1) plain text 2) local redirects 3) external redirects
# Some examples:
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/"
#ErrorDocument 402

# Putting this all together, we can internationalize error responses.
# We use Alias to redirect any /error/HTTP_.html.var response to
# our collection of by-error message multi-language collections. We use
# includes to substitute the appropriate text.
# You can modify the messages' appearance without changing any of the
# default HTTP_.html.var files by adding the line:
# Alias /error/include/ "/your/include/path/"
# which allows you to create your own set of files by starting with the
# /var/www/error/include/ files and
# copying them to /your/include/path/, even on a per-VirtualHost basis.

Alias /error/ "/var/www/error/"

AllowOverride None
Options IncludesNoExec
AddOutputFilter Includes html
AddHandler type-map var
Order allow,deny
Allow from all
LanguagePriority en es de fr
ForceLanguagePriority Prefer Fallback

# ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var
# ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var
# ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var
# ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var
# ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var
# ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var
# ErrorDocument 410 /error/HTTP_GONE.html.var
# ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var
# ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var
# ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var
# ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var
# ErrorDocument 415 /error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var
# ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var
# ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var
# ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var
# ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var
# ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var

# The following directives modify normal HTTP response behavior to
# handle known problems with browser implementations.
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0

# The following directive disables redirects on non-GET requests for
# a directory that does not include the trailing slash. This fixes a
# problem with Microsoft WebFolders which does not appropriately handle
# redirects for folders with DAV methods.
# Same deal with Apple's DAV filesystem and Gnome VFS support for DAV.
BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
BrowserMatch "MS FrontPage" redirect-carefully
BrowserMatch "^WebDrive" redirect-carefully
BrowserMatch "^WebDAVFS/1.[0123]" redirect-carefully
BrowserMatch "^gnome-vfs/1.0" redirect-carefully
BrowserMatch "^XML Spy" redirect-carefully
BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully

# Allow server status reports generated by mod_status,
# with the URL of http://servername/server-status
# Change the "" to match your domain to enable.
# SetHandler server-status
# Order deny,allow
# Deny from all
# Allow from

# Allow remote server configuration reports, with the URL of
# http://servername/server-info (requires that mod_info.c be loaded).
# Change the "" to match your domain to enable.
# SetHandler server-info
# Order deny,allow
# Deny from all
# Allow from

# Proxy Server directives. Uncomment the following lines to
# enable the proxy server:
#ProxyRequests On
# Order deny,allow
# Deny from all
# Allow from

# Enable/disable the handling of HTTP/1.1 "Via:" headers.
# ("Full" adds the server version; "Block" removes all outgoing Via: headers)
# Set to one of: Off | On | Full | Block
#ProxyVia On

# To enable a cache of proxied content, uncomment the following lines.
# See for more details.
# CacheEnable disk /
# CacheRoot "/var/cache/mod_proxy"


# End of proxy directives.

### Section 3: Virtual Hosts
# VirtualHost: If you want to maintain multiple domains/hostnames on your
# machine you can setup VirtualHost containers for them. Most configurations
# use only name-based virtual hosts so the server doesn't need to worry about
# IP addresses. This is indicated by the asterisks in the directives below.
# Please see the documentation at
# for further details before you try to setup virtual hosts.
# You may use the command line option '-S' to verify your virtual host
# configuration.

# Use name-based virtual hosting.

# Where do we put the lock and pif files?
LockFile "/var/lock/httpd.lock"
CoreDumpDirectory "/etc/httpd"

# Defaults for virtual hosts

# Logs

# Virtual hosts

# Virtual host Default Virtual Host

ServerSignature email

DirectoryIndex index.php index.html index.htm index.shtml

LogLevel warn
HostNameLookups off

# Each directory to which Apache has access can be configured with respect
# to which services and features are allowed and/or disabled in that
# directory (and its subdirectories).
# Note that from this point forward you must specifically allow
# particular features to be enabled - so if something's not working as
# you might expect, make sure that you have specifically enabled it
# below.

Options FollowSymLinks

AllowOverride None

Options Indexes Includes FollowSymLinks

AllowOverride None
Allow from all

Order allow,deny

Options Indexes MultiViews

AllowOverride None
Allow from all

Order allow,deny

Options ExecCGI

AllowOverride None
Allow from all

Order allow,deny

Powershell: Process contents of Directory

Hello!  I know it has been a while since I posted any thing.  I have been busy working on a lot of different projects and I picked up a second job so that has been keeping me busy as well.  

Todays post is mostly some powershell code to process Microsoft Document Imaging Files (.mdi or .tif) and converting them to PDF's using a program called MDI2PDF from Bugysoft.  

Part of our specific problem is these files are really Microsoft Document Imaging Files but they have the .tif file extenstion.  We wrote a PHP script to process all of our uploads from the one client that sends us these files and based on some tests we put the MDI Files into a specific directory for processing.

And now on to the Code.  Lines that start with a # are comments for explaining what each line / section does.

#Setting up variables for our use
         $input = "y:\allAuths\problemAuths\"
         $output = "y:\allAuths\processAuths\"
         $convert = "C:\Program Files\MDIConvertor\MDI2PDF.exe"

#Get the current number of errors present in the global $error variable.
     $olderrorcount = $error.count

#Check to see if MDI2PDF is running. If it is this script will fail, so we need to kill it.
       $proclist = get-process mdi2pdf -ea silentlycontinue

#If the number of errors is the same as is used to be then we can kill the running process(es).  Otherwise we have nothing to kill and continue on.
    if ($error.couint -eq $olderrorcount) {$proclist | stop-process}

#Here we get the contents of the input directory filtered for the type of file we want to convert.
      $filelist = get-childitem -Path $input -Filter *.tif

#For every file in our file list we need to run the following command in order from top to bottom.
     foreach ($file in $filelist)
#Replaces the .tif with .pdf.
          $filename=$file -replace ($file.extension + "`$"),".pdf"

#Write something to the screen so the user knows something is happening.
       write-host "Converting $input$file"

#Look ma! Simple string concatenation!!!
#Roughly equal to &"C:\program files\mdiconvertor\mdi2pdf.exe export:y:\allauths\problemauths\.tif y:\allauths\processauths\.tif.pdf
         &$convert "export:$input$file $output$filename"

#get the process info for the currently running mdi2pdf process.
     $convertprocess = get-process mdi2pdf
#Wait for the process to exit before moving on to the next one. I used to use sleep 10 here but this is much better.

#We need to check and make sure the converted file exists. If it does exist then we need to delete the original file.
    #variable to store the input filename. We will need this later to delete the file.
    $inputfile = $file.fullname
    #Variable to store the output filename and full path.  We use this later to check for its existance.
    $outputfile = $output + $filename
            #If the result of the path test is true we remove the file.
            if (test-path $outputfile)
            {remove-item $inputfile}

Wednesday, September 17, 2008

Excel Convert Multiple Cells to URLs

This will convert the selected cell range to a URL.  It assumes that the selected cells are vaild URLs but will skip empty cells.  

Sub Convert2URL()
    For Each cell In Selection
        If cell.Value <> "" Then
            If Left(cell.Value, 7) = "http://" Then
                URL = cell.Value
                URL = "http://" + cell.Value
            End If
            ActiveSheet.Hyperlinks.Add Anchor:=cell, _
              Address:=URL, TextToDisplay:=cell.Value
        End If
    Next cell
End Sub

Now lets say you have a list of order numbers and you want to click a link in Excel and go right to your order management screen you could do:

Sub Convert2URL()
    For Each cell In Selection
        If cell.Value <> "" Then
            If Left(cell.Value, 44) = "" Then
                URL = cell.Value
                URL = "" + cell.Value
            End If
            ActiveSheet.Hyperlinks.Add Anchor:=cell, _
              Address:=URL, TextToDisplay:=cell.Value
        End If
    Next cell
End Sub

Yup, its neat-o and works like a charm!

Excel Time Difference Formula

Yeah, I know this is all round the great interweb but I don't care.  I want to post it here too so I KNOW where it is.  This blog is not just to help someone else after I found a solution.  I often come back here myself to find solutions I have used in the past.


D2 = Start Time
H2 = End Time

Yeah, it look complicated but it works wonderfully.  It doesn't take into account dates, so it only works from one day to the next if going over night.

Wednesday, August 13, 2008

Firefox 3: places.sql to bookmarks.html conversion

Sometimes, just sometimes you jump the gun and upgrade too soon. Well as it turns out I did that when I first started my new job. Our home grown web app renders perfectly in Firefox 2 but looks odd in Firefox 3. Also one of the plugins we need to run is very unstable in Firefox 3 so I had to revert back.

If I had known this a month ago and not started accumulating bookmarks all over the place I would have been fine, but that was not the case. The main problem is that Firefox 3 uses a new places.sqlite SQL database to keep track of bookmarks instead of the tried and true bookmarks.html. I went online looking for some sort of conversion program, thought about making my own (which I still might do just as a proof of concept / fun project.)

So anyway, here is how to have Firefox 3 save a bookmarks.html file in addition to the places.sqlite. Open a new tab and go to about:config. Click "Ok" when it asks if you will be careful. Now browse down to "browser.bookmarks.autoExportHTML" and change this from the default of "false" to "true". Restart Firefox and you will have your bookmarks.html file updated as you add new bookmarks.

If I ever do create a conversion program I will post the link on this site.

yum install imagemagick

Today's blog is going to be quick.

For those linux users out there that don't have imagemagick already installed the correct syntax is:
yum install ImageMagick
NOT yum install imagemagick

To find out if you already have imagemagick just type convert -version from the command line.

As it turns out I was trying to install something I already had thanks to CentOS.

Tuesday, August 12, 2008


I have seen Symantec Ghost used in the past. I have always wanted a scenario where using something like Ghost would make sense and today I have found it!

We have a great many machines here that are identical. They do the same function, have the same hardware, and need the same software. That being said I have finally found a reason to really need a solution like Symantec Ghost. Now being on a very tight budget I was looking for a different solution and thanks to the generous folks over on the Spiceworks fourms I found Clonezilla.

Now there is a server based version that I could use to Clonecast (I don't know if that is a real word or even something they use but I like it) images out to machines, but for now I am booting off of my 2GB USB key and saving / reading images from a seperate 160GB USB drive.

It takes about 15 to 20 minutes do drop an image from the USB-Hard drive to the client machine (for around 1GB of info). It takes just around as long do put the image on the USB-HDD which is very quick if you ask me. Most of the time is getting the computer to boot off of the USB key and configure the options you want.

One of my projects that I hope to do later is to install the NTFS 3g drivers for Linux so I can modify the file system once the image is installed. This will enable me to do things like rename the PC based on it's MAC address. Also I may get a Clonezilla server up and running. If I do you can be sure I will post something about it.

Monday, August 11, 2008

New Job

Well I haven't posted in a while for many reasons.
For one I recently took a new position with a new company. It was sort of a lateral move, but sort of a downgrade. I went from being THE Systems Administrator to being more of a help desk tech. It was a move up the pay scale, which is nice and with less responcibility it's an added bonus, but I do miss some of the Sys Admin tasks I used to preform.

Also the new company uses Linux primarly and uses hosted managed servers, so there really isn't that much for me to do on the Sys admin side of things. All of this information is helpful because it means I won't have as much to write about, except on the desktop side of things.

That being said I hope to have something to share here shortly.

Tuesday, July 22, 2008

Howto: Reset Local Windows Passwords with Knoppix STD

From time to time I will run across a computer that I need to get Administrator access to, but I have no clue to the password. The easiest thing to do is simply reset it and if there is another administrator user I can open a command prompt and run "net user administrator newpassword" and be all set.

For those other times I have to use Knoppix STD to reset the password. It takes roughly 5 to 10 minutes to do this, but has worked everytime I have needed it to.
Download Knoppix STD.
Burn ISO to CD
Boot from the CD
Right click on the desktop and choose XShells, Root Aterm.
Type "cat /etc/fstab" and look for a NTFS drive like /dev/hda1 or /dev/sda1
Type "mount -o rw /dev/hda1" or whatever drive you need to mount.
Type "cd /mnt/hda1/" This will put in the "C" drive of the windows machine.
Type "ls" and look for either Windows or WINNT. Remember that in linux case matters so use what ever case you have.
Type "cd Windows/system32/config" If this fails cd one level at a time and use "ls" to find the case of the next directory.
Type "ls" once in /mnt/hda1/Windows/system32/config to find the case of three files. The three files you need are SAM, SECURITY, and SYSTEM. They will not have an extension on them.
Now to actually change the password.
Type "chntpw -u Administrator SAM SECURITY SYSTEM
It will prompt you to disable the SYSKEY, hit N for no.
chntpw will then prompt you for the new password, use * to blank it or type the new password.
Hit Y to really change the password.
Hit Y to write hive files.
Right click on the desktop again and choose "Reboot".

Once the reboot is complete you should have administrator access to the computer.

Monday, June 02, 2008

Howto: Allow Mailbox Access on Exchange 2007

Given our company structure I frequently have to allow User A to read or send as User B. This task is simple enough with the Exchange Management Shell (EMS) but does require two separate commands.

The first command here allows full access to the mailbox:
Add-MailboxPermission "FirstName LastName" -User "UserName" -AccessRights FullAccess
The FrirstName LastName is the mailbox that you are adding permissions to. The Username is the user that will have the permissions that you are adding.

The second command you will need to run is only necessary if you need to send email as that user.
Add-ADPermission -Identity "FirstName LastName" -User "UserName" -ExtendedRights Send-As
Once again the FirstName LastName should be the mailbox that you are adding permissions to and the UserName is the user that will have the permissions you are adding.

Based on how often I have to do this I really need to write a quick little application that will allow me to add these permissions with ease instead of having to type out the commands every time. I will keep you updated if I do.

*You have to have Exchange Organization Administrator role privileges on the Exchange server to make these changes.

Tuesday, May 27, 2008

Look How Easy Setup Is for Microsoft Exchange 2007

For anyone trying to setup Microsoft Exchange 2007 or thinking about it, or just curious about it. This is a good read for the first timers and even the veterans System Administrators among us.

Sunday, May 11, 2008

Unlocking the GPS on a BlackJack II

I recently purchased a BlackJack II from AT&T for personal use. One of the things I liked about it aside from the ability to get email and such on the road is the GPS embedded in it. I was saddened to find out that by default the GPS only worked with Telenav. I don't want to pay for even more services so I went out on the great old World Wide Web and found MoDaCo Smart phone GPS Activator. It's a handy little program that replaces the default GPS driver with a driver that allows any program (say Google Maps Mobile or Live Search.) to use the GPS unit via COM4.

There are a few ways to get this program on to your phone.
1) Direct via the phones browser. (
2) Installing via a CAB file on the Handset (
3) Or installing it via a PC. (

I tried the first option on my phone, but it didn't work correctly, so I had to go with option number two. I downloaded the CAB file to my desktop and dropped it into my phone via the USB cable that came with.

To install via the CAB file once its on the phone go to Start, Applications, File Explorer, Then go to the folder where you put the CAB file and click on it to install the file.

Monday, March 10, 2008

Tarpitting IISFTP Service

If you have been running an FTP server on the internet for any amount of time at some point you have noticed hundreds or even thousands of errors in your System Event log with an Event ID of 100. In an attempt to stop these run the following command from the command prompt, but if you change the location of the script file put in the correct path for this to work.

eventtriggers /create /TR "Reset FTP Service" /TK C:\scripts\ResetFTP.bat /L System /EID 100 /SO MSFTPSVC /RU "system"

The batch file is very simple, I created mine in a folder I have on my drive called "Scripts" and named it ResetFTP.bat. The contents of the script are below.

net stop msftpsvc
ping -n 10
net start msftpsvc

Thats it! The script will run when someone enters the wrong username and password for a FTP session. It will effectively stop the server for 10 seconds (10 pings to localhost) and then restart the FTP service. On a side note it only works on Microsoft Windows 2003 Server (Windows XP) and later. Also does not work on Microsoft Windows 2000 Server as there is no "Eventtriggers" program native to Windows 2000.

Releasing queued messages from eTrust SCM (Secure Content Manager)

Today I had an issue with Microsoft Exchange 2007 adding my CA eTrust SCM gateway to it's IP Block List. This caused all inbound emails to be delayed and dropped into Dead mail.

The recovery is pretty simple if you know what you are doing.

First you have to rename all of the .bad files to .inb. To do this simply open up a command window, change directories to (by default) c:\Program Files\eTrust SCM\Workspace\SMTP\Deadmail. Then "rename *.bad *.inb" without the quotes. Now that you have renamed all of the bad files you have to release them from the deadmail queue. To do so run the program "C:\Program Files\CA\eTrust SCM\bin\queues.exe"

Here you need to check the box next to "dead mail" and enter in the IP address of the SMTP server to forward the mail to and the port. Then click on the button. It might take some time to send all of the email through depending on server load and number of stuck emails.

On a side note while it eTrust SCM works on a x64 platform, offically its not supported or recommended.

uCertify Test Engine Review

To be totally up front I was asked to do this review by the company, but I won't let that affect my opinion of the product offered.

The download and installation of the product was straight forward. They even offer you a chance to do some practice tests for free to test out the software. The test itself is inexpensive coming in at $49.99 for a single user. Not bad in my opinion. So far I have only gone through the 15 question diagnostic test once, but the questions where challenging none the less.

I will be using this practice test for my 70-284 exam to truely test it out and to be honest I think it will work. I have to go through all of the exams first and then start using the "Adaptive Test" to really hone in on areas I have trouble in. Also the custom test allows you to pick areas of the exam that you are really struggeling with so you can "turn your weakness into stenght".

Friday, March 07, 2008

Follow Up: Failed to access IIS metabase.

As a quick followup post, if you need to do this procedure on a x64 system run this command instead: "%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_regiis.exe -i"

Tuesday, February 26, 2008

Failed to send SMTP (2AFC) for CA BrightStor ARCServe Back

This error was getting thrown after every backup my system does. BrightStor used to send me emails when it finished a backup job but at some point in time it started failing.

The simple fix for this is to add in a hosts entry for the SMTP server. Even though I specified an IP address for my SMTP server this fix worked.

To add in a hosts record open Notepad or whatever text editor you love and then open the file "C:\Windows\System32\Drivers\Etc\hosts". Notice there is no extension on this file.

If you have your \Windows directory located on a partition other than "C:" use "%windir%\System32\Drivers\Etc\hosts".

Monday, February 18, 2008

Failed to access IIS metabase.

This error typically occurs when you install IIS after you have installed. It is a very simple fix.

Copy and paste this into the Run Command from the Start Menu.
%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i

This will reinstall for use with IIS and in most cases fixes the error stated above.

Thursday, February 07, 2008

The operation failed due to a registry or installation problem. Restart Outlook and try again. If the problem persists, please reinstall.

I have seen this error "The operation failed due to a registry or installation problem. Restart Outlook and try again. If the problem persists, please reinstall." pop up twice in the past few weeks. After researching the error online I found numerous posts pointing to Microsoft Knowledge Base Article KB315048.

The solution as told in KB315048 is to create a new Outlook profile with for the user. This however did not fix my problem. I tried doing a "Repair" on Microsoft Office XP once and did a full uninstall, reboot, install of Microsoft Office the second time in an effort to fix the issue (as that is what the error clearly states). Neither of these options worked.

After searching and searching for a solution I tried something different. I rebooted the Microsoft Exchange 2007 server. That did the trick. First I had tried to restart the Microsoft Exchange Information Store Service, but when that failed to stop I had no choice but to restart the entire server.

From what I can tell the problem we had started when the power kicked out and back in really quick. Our Microsoft Exchange 2007 server stayed on due to its UPS as did the workstation, but something went wonky somewhere along the line.

Thursday, January 03, 2008

Fixing a bad Master Boot Record (MBR) in Microsoft Vista

A few months ago I installed CentOS on my laptops second hard drive. During this process it installed GRUB as my boot loader. Since the inital installation I have not booted back in to CentOS at all, so I removed the linux partitions from the second drive and hoped for the best. I was so wrong.

Removing those partitions removed GRUB as well, so my laptop (now my main computer) would no longer boot into Microsoft Vista Home Premium. To fix this I used the Vista DVD to boot into Windows Recovery Environment (Windows RE) and used a tool new to me Bootrec.exe.

Microsoft has a very handy article on how to use Bootrec.exe to fix just such an occasion. For my situation I had to use the /fixMBR switch and reboot. It was literally that simple!