Wednesday, March 30, 2011

ConfigMgr 2007 R2 SP2 OSD Imaging issue

So for the past several months my coworker and I have been wanting to update our Imaging process from an unatteded install of XP to a true Slim Image using SCCM 2007 OSD.

During the process of doing this we keep running in to an issue of applications not installing when we would bring down our test image that was captured using a CD instead of a Build and Capture task sequence. After much googling we could not find anything that would fix our issue, so we place a call to the boys in blue (Microsoft) after looking though our smsts.log Microsoft noticed a small oddity during the process of installing the SCCM Client.


Basicly what the issue was when OSD would go to install the SCCMClient  it would error out with a 0x80004005 error code. It would error out during this step because CCMSetup was running with a switch of /config:Mobileclient.tcf. the odd thing though was our configmgr package did not have this configured there and we still do not know where this is coming from. So for now we have rename Mobileclient.tcf to .old and wallah the issue is now resolved.

Successfully registered TS Progress UI.    OSDSetupHook    3/30/2011 4:01:38 PM    896 (0x0380)
Executing C:\_SMSTaskSequence\OSD\BHG00077\ccmsetup.exe /useronly /config:MobileClient.TCF /status:1592    OSDSetupHook    3/30/2011 4:01:38 PM    896 (0x0380)
Command line for extension .exe is "%1" %*    OSDSetupHook    3/30/2011 4:01:38 PM    896 (0x0380)
Set command line: "C:\_SMSTaskSequence\OSD\BHG00077\ccmsetup.exe" /useronly /config:MobileClient.TCF /status:1592    OSDSetupHook    3/30/2011 4:01:38 PM    896 (0x0380)
Executing command line: "C:\_SMSTaskSequence\OSD\BHG00077\ccmsetup.exe" /useronly /config:MobileClient.TCF /status:1592    OSDSetupHook    3/30/2011 4:01:38 PM    896 (0x0380)
Process completed with exit code 1    OSDSetupHook    3/30/2011 4:01:39 PM    896 (0x0380)
FALSE, HRESULT=80004005 (e:\nts_sms_fre\sms\client\osdeployment\osdgina\installclient.cpp,1078)    OSDSetupHook    3/30/2011 4:01:39 PM    896 (0x0380)
Client installation failed, code 1    OSDSetupHook    3/30/2011 4:01:39 PM    896 (0x0380)

Tuesday, March 22, 2011

Undocumented Citrix PNAgent Command Line Switches

The list below is a list of undocumented switches for Pnagent.exe Version 12.1.030 but may work on older versions of pnagent. I have used a few of them with success when needing to script an uninstall of a client or needing to manipulate the client in a way without causing a outage. For example I needed to basically have the pnagent reconnect to the server, but need to do it via a script. I ran pnagent.exe /configurl /pram:<our url to WI> and that caused pnagent to reconnect simulating a user terminating pnagent with out terminating and with out losing connection to any open applications.

Use the below list with caution and always test to avoid any unwanted side-affects.


/Terminate Closes out PNAgent and any open sessions
/terminatewait  Closes out PNAgent and any open sessions
/Configurl  /param:URL
/displaychangeserver
/displayoptions
/logoff
/refresh
/disconnect
/reconnect
/reconnectwithparam
/qlaunch

Till Next Time!

Monday, March 21, 2011

Replacing The HD on a 24inch iMac




















Using 2 Suction Cups in opposing corners, I remove the glass panel. This glass panel is held on using a series of magnets around the bezel. Once the glass is removed it will expose the necessary T8 Screws that need to be removed.

Once the bezel is removed you will have access to remove the 8 or so T8 screws holding down the LCD panel. Once remove the screws are removed you can lift display. Note that you will want a second set of helping hands as the display cables are still attached to hold the display as the drive is replaced.
With your second set of hands holding the display remove the 2 T8 screws holding the 3.5 inch drive from its mount. Now slide the black drive mount towards the supper drive. Next carefully remove the thermistor that is located on the drive case and disconnect the SATA and Power cables from the drive. Now Pull the drive towards you removing it from the case. 



Friday, March 18, 2011

How to Remove a Contact from Outlook Web App's AutoFill List


  1. Login to the account.
  2. Compose a new message.
  3. In the To field start to type the name of the individual.

  4.  Arrow down till you have highlighted the contact you wish to delete.
  5. Press the Delete Key on your keyboard and the contact will be removed from the AutoFill list before your eyes.

Thursday, March 17, 2011

GroupWise To Exchange 2010 Part 1

Over the course of 2010 I was responsible for Migrating 4,000+ GroupWise accounts to Exchange 2010SP1. I would like to share a little over view of the project and some of the scripts I wrote.

While most of the setup of our Exchange environment was setup by a local consulting company I was responsible for the data migration, Blackberry migration, and the roll-out of office 2010 from office 2000 & 2003. while planning and prep work took about a year the actual roll-out /  cut over was to be over the course of a weekend yes 48+hrs to move 90 days of email calendar data. A combination of Quest Software's GroupWise Migrator for Exchange and a set of PowerShell Scripts allowed for such a successful cut-over aka the ripping of the band-aid approach.

Our environment  already had  Active Directory deployed and was the primary method of authentication, the only thing that NDS was used for GroupWise authentication. in order to do most of the mass operations I wrote 5 different Powershell scripts to handle this that would work off the CSV's that the Quest tool would output and use for the migration. The first script would Mail Enable an account on a random database, enable their archive on a random database if they had one, and set the mailbox limitations based off of a classification that was assigned to the user. Error logging was also incorporated into the script to allow us to fix any AD account.

Tomorrow I will will share my scripts used to set the primary email address and to set the visablity of the account to the address book.


Till next time.


#Created By Matt Karel Copyrighted Sept 2010
Add-PSSnapin Microsoft.Exchange.Management.Powershell.E2010 -ErrorAction SilentlyContinue
#Create new object to generate random numbers
$Rand=new-object System.Random

#Build 1d array of DB
$Databases=("DB1_A"),("DB1_B"),("DB2_A"),("DB2_B"),("DB3_A"),("DB3_B"),("DB4_A"),("DB4_B"),("DB5_A"),("DB5_B"),("DB6_A"),("DB6_B")

$ArchiveDatabases=("MBX1_Archive1"),("MBX1_Archive2"),("MBX2_Archive1"),("MBX2_Archive2"),("MBX3_Archive1"),("MBX3_Archive2")

$Errorfile = New-Item -type file "Enable-Mailbox ErrorLog.txt" -Force
$Error.Clear() #Clears the Error Variable that stores Error Information

# Import the CSV file   modify the path to your file here
#$csv = Import-CSV "C:\PS-Scripts\CSVs\BHGPO4.csv"
$CSVPath= read-host "Enter the Path to the Quest CSV here"
$csv = Import-CSV $CSVPath
# Your domain name
$domain = 'domain.local"

# Mailbox Database to create mailboxes in (format is server\StorageGroup\Database Name)
#$database = 'SERVER\StorageGroup\Database'

#Function Section
Function EnableMailbox {
    Trap {
        Add-Content -Path "$Errorfile" -Value "$PO   -----  $DisplayName   -----  $Email   -----  $UserID"
        add-content -Path "$Errorfile" -Value "Error Enabling Mailbox $UserID "
        add-content -Path "$Errorfile" -Value  $Error[0].ToString()
        add-content -Path "$Errorfile" -Value ""
        Write-Host "$PO   -----  $DisplayName   -----  $Email   -----  $UserID"
        Write-Host $Error[0].ToString()
        Continue
        }
     Enable-Mailbox -Identity "$domain\$UserID" -Database "$DB" -PrimarySmtpAddress "$Email" -Alias "$Alias" -ErrorAction Stop
}
Function EnableArchive {
    Trap {
        Add-Content -Path "$Errorfile" -Value "$PO   -----  $DisplayName   -----  $Email   -----  $UserID"
        add-content -Path "$Errorfile" -Value "Error Enabling Archive $UserID "
        add-content -Path "$Errorfile" -Value $Error[0].ToString()
        add-content -Path "$Errorfile" -Value ""
        Write-Host "$PO   -----  $DisplayName   -----  $Email   -----  $UserID"
        Write-Host $Error[0].ToString()
        Continue
        }
     Enable-Mailbox -Identity "$domain\$UserID" -Archive -ArchiveDatabase "$ArchiveDB" -ErrorAction Stop
}
Function ModifyCASMailbox {
    Trap {
        Add-Content -Path "$Errorfile" -Value "$PO   -----  $DisplayName   -----  $Email   -----  $UserID"
        add-content -Path "$Errorfile" -Value "Error Set-CasMailbox $UserID "
        add-content -Path "$Errorfile" -Value $Error[0].ToString()
        add-content -Path "$Errorfile" -Value ""
        Write-Host "$PO   -----  $DisplayName   -----  $Email   -----  $UserID"
        Write-Host $Error[0].ToString()
        Continue
        }
     Set-CASMailbox -Identity "$domain\$UserID" -ActiveSyncEnabled:$ActiveSync -ErrorAction Stop
}
Function TestForMBX {
   
     $MBXExists=Get-Mailbox -Identity "$domain\$UserID" -ErrorAction SilentlyContinue
     If($MBXExists){
        Return $true
     }Else{
        Return $false
     }
}

# Loop through the CSV and create a new user & mailbox for each line found
foreach ($Record in $csv){
    $DB=$Databases[$Rand.Next(1,12)] #Get a random database
    $Email=$Record.TargetAddress
    $UserID=$Record.Userid
    $Class=$Record.Class
    $PO=$Record.PostOffice
    $DisplayName=$Record.DisplayName
   
    $Temp=(Get-Culture).TextInfo.ToTitleCase((($UserID).ToLower())) #Drop the user id to Title Case
    $Alias=$Temp.substring(0,$Temp.length -1)+$Temp.substring($Temp.length -1,1).ToUpper() #Use the Temp Var to set Alias var with the first and last char to caps.
   
    $Temp=(Get-Culture).TextInfo.ToTitleCase((($Email).ToLower())) #Drop the Email id to Title Case
    $EmailDomain=$Temp.substring($Temp.IndexOf("@")).ToLower()
    $Email=$Temp.substring(0,$Temp.length -15)+$Temp.substring($Temp.length -15,1).ToUpper()+$EmailDomain #Use the Temp Var to set Alias var with the first and last char to caps.

   
               Switch ($Class){
                1 {
                    $MB_Size_Warn="1.8GB"
                    $MB_Size_ProhibitSend="2GB"
                    $Archive=$TRUE
                    $ActiveSync=$FALSE
                    $RetentionPolicy=$null
                    $ArchiveDB=$ArchiveDatabases[$Rand.Next(1,6)]
                    $ArchiveQuota="50GB" #Exchange Default
                    $ArchiveWarnQuota="45GB" #Exchange Default
                   }
                 1a {
                    $MB_Size_Warn="1.8GB"
                    $MB_Size_ProhibitSend="2GB"
                    $Archive=$TRUE
                    $ActiveSync=$FALSE
                    $RetentionPolicy="Default Archive-Enabled Retention Policy"
                    $ArchiveDB=$ArchiveDatabases[$Rand.Next(1,6)]
                    $ArchiveQuota="50GB" #Exchange Default
                    $ArchiveWarnQuota="45GB" #Exchange Default
                   }
                 2 {
                     $MB_Size_Warn="921MB"
                     $MB_Size_ProhibitSend="1GB"
                     $Archive=$TRUE
                     $ActiveSync=$FALSE
                     $RetentionPolicy="Default Archive-Enabled Retention Policy"
                     $ArchiveDB=$ArchiveDatabases[$Rand.Next(1,6)]
                     $ArchiveQuota="1GB"
                     $ArchiveWarnQuota="900MB"
                   }
                 3 {
                     $MB_Size_Warn="720MB"
                     $MB_Size_ProhibitSend="800MB"
                     $Archive=$TRUE
                     $ActiveSync=$FALSE
                     $RetentionPolicy="Default Archive-Enabled Retention Policy"
                     $ArchiveDB=$ArchiveDatabases[$Rand.Next(1,6)]
                     $ArchiveQuota="800MB"
                     $ArchiveWarnQuota="720MB"
                   }
                 4 {
                     $MB_Size_Warn="180MB"
                     $MB_Size_ProhibitSend="200MB"
                     $Archive=$FALSE
                     $ActiveSync=$FALSE
                     $RetentionPolicy="Default No Archive Retention Policy"
                   }

            }
                           
                If($Archive -eq $FALSE){
                    If (TestForMBX){
                        Set-Mailbox -Identity "$domain\$UserID" -UseDatabaseQuotaDefaults $false -ProhibitSendQuota "$MB_Size_ProhibitSend" -IssueWarningQuota "$MB_Size_Warn" -RetentionPolicy "$RetentionPolicy"
                        ModifyCASMailbox
                    }
                    Else{
                        EnableMailbox
                        Start-Sleep -m 200
                        Set-Mailbox -Identity "$domain\$UserID" -UseDatabaseQuotaDefaults $false -ProhibitSendQuota "$MB_Size_ProhibitSend" -IssueWarningQuota "$MB_Size_Warn" -RetentionPolicy "$RetentionPolicy"
                        ModifyCASMailbox
                    }
                }
                   
                If($Archive -and $Class -eq "1") {
                    If (TestForMBX){
                        Set-Mailbox -Identity "$domain\$UserID" -UseDatabaseQuotaDefaults $false -ProhibitSendQuota "$MB_Size_ProhibitSend" -IssueWarningQuota "$MB_Size_Warn" -ArchiveQuota "$ArchiveQuota" -ArchiveWarningQuota "$ArchiveWarnQuota" -RetentionPolicy $null -ErrorAction Continue
                        ModifyCASMailbox
                    }
                    Else{                                           
                        EnableMailbox
                        Start-Sleep -m 200
                        EnableArchive
                        Start-Sleep -m 200
                        Set-Mailbox -Identity "$domain\$UserID" -UseDatabaseQuotaDefaults $false -ProhibitSendQuota "$MB_Size_ProhibitSend" -IssueWarningQuota "$MB_Size_Warn" -ArchiveQuota "$ArchiveQuota" -ArchiveWarningQuota "$ArchiveWarnQuota" -RetentionPolicy $null -ErrorAction Continue
                        ModifyCASMailbox
                    }
                }
                elseif($Archive -and $Class -ne "1"){
                    If (TestForMBX){
                        Set-Mailbox -Identity "$domain\$UserID" -UseDatabaseQuotaDefaults $false -ProhibitSendQuota "$MB_Size_ProhibitSend" -IssueWarningQuota "$MB_Size_Warn" -ArchiveQuota "$ArchiveQuota" -ArchiveWarningQuota "$ArchiveWarnQuota" -RetentionPolicy "$RetentionPolicy" -ErrorAction Continue
                        ModifyCASMailbox
                    }
                    Else{
                        EnableMailbox
                        Start-Sleep -m 200
                        EnableArchive
                        Start-Sleep -m 200
                        Set-Mailbox -Identity "$domain\$UserID" -UseDatabaseQuotaDefaults $false -ProhibitSendQuota "$MB_Size_ProhibitSend" -IssueWarningQuota "$MB_Size_Warn" -ArchiveQuota "$ArchiveQuota" -ArchiveWarningQuota "$ArchiveWarnQuota" -RetentionPolicy "$RetentionPolicy" -ErrorAction Continue
                        ModifyCASMailbox
                    }
                }

        }

Wednesday, March 16, 2011

My First Post

Well today marks the start of my first ever BLOG! With this blog I hope to bequeath useful things that I find in my day to day job as a desktop engineer and Exchange administrator.

Till next time