Exchange 2010: Database Copies with PowerShell

December 9th, 2009 Justin Braun No comments

I needed a quick and dirty method to add database copies to other servers in an Exchange 2010 Database Availability Group (DAG).  I had three servers, each with 10 databases.  Each one of those databases should have a copy on the other two servers. 

Now, this is painful if you have to use the GUI to do it – not that it takes a lot, but it’s time consuming.  The Add-MailboxDatabaseCopy cmdlet is very helpful in PowerShell, but still I wanted to automate it since my naming conventions were pretty standard.

So, I wrote a PowerShell script to automate this process.  Essentially, the script has a few variables and I dome some loop magic to drop everything into place. 

$servers = "E2K10MBX01", "E2K10MBX02", "E2K10MBX03"
$databases = "DB1", "DB2", "DB3", "DB4", "DB5", "DB6", "DB7", "DB8", "DB9", "DB10"
 
foreach($database in $databases)
{
       foreach($server in $servers)
       {
              foreach($copyserver in $servers)
              {
                     "Adding mailbox copy for $server-$database to $copyserver..."
                     Add-MailboxDatabaseCopy -Identity $server-$database -MailboxServer $copyserver -ErrorAction "Continue"
              }
       }
}

This script is quick and dirty for a lab environment.  Keep in mind that this doesn’t do any error checking and there is no validation to see if a database is already homed to a server.  This just uses the cmdlet to try to create the database copy; if it is successful, you’re good to go.  If it fails, the script just keeps on rolling.  No harm, no foul.

Categories: Exchange, PowerShell Tags:

Exchange 2010 Pre-Req Setup (Updated)

December 9th, 2009 Justin Braun No comments

A couple of months back I wrote a post on how to automatically install pre-requisites for Exchange 2010 on a Windows 2008 (including R2) server.

I specifically talked about a method for doing this with ServerManagerCmd.exe, which is included with Windows Server 2008.  However, in Windows Server 2008 R2, ServerManagerCmd is deprecated and the recommended method is to use PowerShell (as pointed out by my buddy, Josh). 

The Add-WindowsFeature cmdlet in PowerShell provides the capability to add individual Windows features directly from a script.  You can use Get-WindowsFeature to obtain a detailed list of available features, ones that are installed, and their “official” name if you wish to install them via PowerShell.

To install the required pre-reqs for Exchange 2010, from a PowerShell prompt, be sure to add the Server Manager module so the Add-WindowsFeature and Get-WindowsFeature cmdlets are available.

Import-Module ServerManager

Once you have imported the module, then you can use Add-WindowsFeature to take care of the rest.

Add-WindowsFeature -Name RSAT-ADDS-Tools, RPC-over-HTTP-proxy, NET-HTTP-Activation, Web-Dyn-Compression, Web-Windows-Auth, Web-Digest-Auth, Web-Basic-Auth, Web-Lgcy-Mgmt-Console, Web-Metabase, Web-ISAPI-Ext, Web-Server -Concurrent

Categories: Exchange Tags:

Legislation Would Limit Early Termination Fees

December 3rd, 2009 Justin Braun No comments

I don’t normally follow politics, but my own Senator from the state of Minnesota, Amy Klobuchar and other senate colleagues introduced a bill today that would limit the amount of cell phone service provider could charge in early termination fees.

The timing is perfect since Verizon recently announced that their customers who were smartphone users would have to pay in upwards of $300 if they prematurely ended their relationship with the provider.  How ridiculous!

Several years ago, I did pay Verizon $175 to end our relationship. 

“Changing your wireless provider shouldn’t break the bank,” said Klobuchar. “Forcing consumers to pay outrageous fees bearing little to no relation to the cost of their handset devices is anti-consumer and anti-competitive.”

I have to agree.  Instead of spending the money on litigation with AT&T, both carriers should put that money towards getting their networks in better shape, especially AT&T.  The iPhone has been a goldmine for AT&T, but their network has subsequently suffered and become unbearable to use.  Between dropped calls and general coverage issues, I can barely stand to keep their service at this point.  Most customers can’t afford to switch carriers – and I’m not talking about those who bought an iPhone.

According to Senator Klobuchar’s website, the bill would:

- Prevent wireless carriers from charging an ETF that is higher than the discount on the cell phone that the wireless company offers consumers for entering into a multi-year contract.  For example, if a wireless consumer enters into a 2-year contract and receives a $150 discount with the contract, the ETF cannot exceed $150.

- Require wireless carriers to pro-rate their ETFs for consumers who leave their contracts early so that the ETF for a two-year contract would be reduced by half after one year and pro-rated down to zero by the end of a contract term.

- Require wireless carriers to provide “clear and conspicuous disclosure” of the ETF at the time of purchase.

- Require monthly billing statements to clearly state the pro-rated fee customers would be charged if they terminate their contracts before the end of the next billing cycle.

I think most customers are pretty loyal to their carriers.  Most customers see an average bill between $90-$200/month.  Your customers are paying plenty to stay connected – if you as a carrier can’t get the job done, then the customer should have the right to go somewhere that can.

If you’re interested in more about the bill, check out Senator Klobuchar’s press release.

Categories: Technology Tags:

Compellent Volume Reporting with PowerShell

December 2nd, 2009 Justin Braun No comments

Compellent Enterprise Manager works great for managing your Storage Center environment and providing reports on volume usage and utilization.

I was looking for a little different spin on the information.  I was looking for a cumulative volume count across an entire Storage Center, plus a total count of replays on the system, and how many of the volumes that exist are actually mapped up to a server object.

For example, the test system that I ran my script on determined that we had over 900 volumes with over 3,000 replays.  We also realized that we had some cleanup to do when we figured out that only 180 of the volumes were actually mapped up.

I did build into the script to collect the page count of each replay so you could tell how large they were if you wanted to; just the calculation needs to be added.

# NAME: VolumeInfo.ps1
# DESC: PowerShell script to report on volume information
# BY  : Justin Braun, Compellent Technologies, Inc.
# DATE: December 1, 2009
# VER : 1.0
#
# THIS CODE IS MADE AVAILABLE AS IS, WITHOUT WARRANTY OF ANY KIND.  THE ENTIRE
# RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS CODE REMAINS WITH THE USER.
#
# NOTE: This script assumes a default Get-SCConnection already exists.
 
# Collection
$colVolumes = @()
 
foreach($volume in Get-SCVolume)
{
    Write-Host "Gathering volume data for $volume.Name..."
    
    $replays = $null
    $mappings = $null
    $pagecount = 0
    
    # Volume Information
    $ReportData = New-Object System.Object
    $ReportData | Add-Member -Type NoteProperty -Name "Volume Index" -Value $volume.Index
    $ReportData | Add-Member -Type NoteProperty -Name "Volume Name" -Value $volume.Name
    $ReportData | Add-Member -Type NoteProperty -Name "Volume Size" -Value $volume.Size
    $ReportData | Add-Member -Type NoteProperty -Name "Block Count" -Value $volume.BlockCount
    $ReportData | Add-Member -Type NoteProperty -Name "Created By" -Value $volume.CreateUser
    $ReportData | Add-Member -Type NoteProperty -Name "Created On" -Value $volume.CreateTime
    $ReportData | Add-Member -Type NoteProperty -Name "Modified By" -Value $volume.ModifyUser
    $ReportData | Add-Member -Type NoteProperty -Name "Modified On" -Value $volume.ModifyTime
    $ReportData | Add-Member -Type NoteProperty -Name "Folder" -Value $volume.ParentFolder
    
    # Replay Count Information
    Write-Host "Gathering replay information for $volume.Name..."
    $replays = Get-SCReplay -SourceVolumeIndex $volume.Index
    $ReportData | Add-Member -Type NoteProperty -Name "Replay Count" -Value $replays.Count
    
    # Replay Cumulative Page Information
    Write-Host "Gathering replay page count information for $volume.Name..."
    foreach($replay in $replays)
    {
        $pagecount += $replay.OwnedPageCount
    }
    
    $ReportData | Add-Member -Type NoteProperty -Name "Total Replay Pages" -Value $pagecount
    
    # Volume Mapping Information
    Write-Host "Gathering volume mapping information for $volume.Name..."
    $mappings = Get-SCVolumeMap -VolumeIndex $volume.Index
    
    if($mappings -eq $null)
    {
        $ReportData | Add-Member -Type NoteProperty -Name "Mappings" -Value "No"
    }
    else
    {
        $ReportData | Add-Member -Type NoteProperty -Name "Mappings" -Value "Yes"
    }
    
    # Add to collection
    $colVolumes += $ReportData
    
}
 
# Outfile ReportData Contents
Write-Host "Writing output file..."
 
$colVolumes | export-csv -path "c:\volumeinfo.txt"
 
Write-Host "Done!"

If you have any ideas on how this script could be more useful in your environment, drop me a comment below.

Sony BDP-N460 Network Blu-ray Disc Player Review

December 2nd, 2009 Justin Braun No comments

I was at Costco this last weekend and saw the Sony BDP-N460 Network Blu-ray Disc Player on sale for $199.  It usually sells for $249, but most places have it on sale right now.  As a side note, I wasn’t able to locate it on their website, but it was on an end-cap in one of their stores.

A while back, right after Blu-ray was initially introduced, I purchased the Best Buy “Insignia” brand Blu-ray player.  I think I paid $250 for it.  Back then, if you wanted network capabilities, you had to pay a premium, now this type of functionality is pretty standard. 

The Insignia model that I owned was slow to start up.  It took 30-45 seconds for it to power up before I could even insert a disc.  You can’t upgrade the firmware on it, and there are no network capabilities.

BDPN460_1

That’s why the Sony was appealing.  The BDP-N460 has full HD 1080p, Dolby True HD and DTS-MA audio decoding, BRAVIA Internet Video streaming, BD-Live 2.0 support, DVD playback and upscaling.  It has built-in applications for Netflix, Amazon Video On-Demand, and Slacker, just to name a few.

I hooked it up to my system, plugged in a network cable and powered it up.  It immediately determined that there was a firmware update available and within a couple minutes it had applied it and rebooted the player.  That’s cool. 

I also activated the Netflix application on the player.  I was able to see my queue and I played three different movies over the weekend.  It worked very slick.  No glitches as far as I could tell.  No skipping, very good video and sounds quality.  I also tried Slacker, a free Internet radio service, which I had never heard of. 

One other nicety of this product is that they include an HDMI cable in the box.  Overall, I am very happy with the player.  Historically, I have always had good luck with Sony components. 

Categories: Reviews, Technology Tags:

PowerShell with Compellent and Exchange 2010

December 2nd, 2009 Justin Braun No comments

I’ve been doing lots of work in the lab lately with Exchange 2010 to understand all the new changes and how it works with the Compellent Storage Center.

With Exchange 2010, the concept of Storage Groups no longer exists.  Databases are the sole object and are a peer to the server now.  Database names must be unique, but can be moved from server to server as necessary.

In the past, I’ve shared some scripts on how to provision storage for an Exchange 2007 environment.  I’ve slightly reworked this script to account for no longer needing storage groups, but to also automatically create the mailbox database on the Exchange Server and mount it when completed.

# NAME: Exchange2010LabCreate.ps1
# DESC: PowerShell script to create and map volumes for Exchange 2010 Lab
# BY  : Justin Braun, Compellent Technologies, Inc.
# DATE: November 24, 2009
# VER : 1.0
#
# THIS CODE IS MADE AVAILABLE AS IS, WITHOUT WARRANTY OF ANY KIND.  THE ENTIRE
# RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS CODE REMAINS WITH THE USER.
#
 
####################################################
# ERROR HANDLING
####################################################
    #"SilentlyContinue": do not print, continue 
    #"Continue": Print, continue (this is the default) 
    #"Stop": Halt the command or script 
    #"Inquire": Ask the user what to do 
    $ErrorActionPreference = "Inquire"
 
####################################################
# STORAGE CENTER CONFIGURATION INFORMATION
####################################################
    $schost = "storagecenter.lab.test"
    $user = "username"
    $pass = "password"
 
####################################################
# EXCHANGE STORAGE CONFIGURATION
####################################################    
    # Number of Databases Per Server
    $dbsize = "1TB"
    $dbtotal = 1
    $dbDiskFolder = "Assigned"
 
####################################################
# SERVER INFORMATION
####################################################
    # Server to Map To (server defintion on CSC must match server name in Windows because of VDS)
    $ServerName = "E2K10MBX01"
 
####################################################
# MISC. CONFIGURATION SETTINGS
####################################################
    # Volume folder name
    $SCParentFolderName = "E2K10MBX01"
    
    # Use custom disk folders for each volume? (if $false, then a single disk folder config is assumed)
    $useCustomDiskFolders = $false
    
    #Mountpoints (set to $true if mountpoint volumes weren't previously created.  Mountpoint volumes will be 1G by default)
    $createMountpointRoot = $true
    
    # Mountpoint Root
    $dbmproot = "M:\Exchange"
    $dbRootDrive = "M:"
 
##########################################################################################
##########################################################################################
# DO NOT EDIT BELOW THIS LINE !
##########################################################################################
##########################################################################################
 
 
# Creates volume with specified name and size using connection instantiated on script launch
function CreateVolume
{
    param
    (
        [string]     $VolumeName,
        [string]     $VolumeSize,
        [string]     $MPRoot,
        [string]     $SCDiskFolder,
        [bool]         $IsMountPoint
    )
 
    Write-Output "Creating new volume: $volumename..."
    if($useCustomDiskFolders -eq $true)
    {$scvolume = New-SCVolume -Name $VolumeName -Size $VolumeSize -ParentFolder $SCParentFolderName -StorageType $SCDiskFolder;}
    else
    {$scvolume = New-SCVolume -Name $VolumeName -Size $VolumeSize -ParentFolder $SCParentFolderName;}
 
    # Maps volume previously created and returned from CreateVolume function
    Write-Output "Mapping new volume $volumename to $servername..."
    
    # Map Volume (if multiple HBA ports are server will be used, make sure that MPIO is installed on server and remove -SinglePath switch from next line
    New-SCVolumeMap -VolumeIndex $scvolume.Index -ServerIndex $scserver.Index -SinglePath
 
    # Rescan Server
    Write-Output "Rescanning server for new volume..."
    Rescan-DiskDevice -Server $ServerName -RescanDelay 5
 
    # Issue Drive Letter / Mount Point
    Write-Output "Creating access path for new volume..."
    $device = Get-DiskDevice -SerialNumber $scvolume.SerialNumber
    
    # Check to see if the device is there yet after initial rescan
    if($device -eq $null)
    {
        # Device is still null, so let's perform up to 10 rescans before we move on
        $scancount = 0
        
        do
        {
            # Rescan the disk
            Write-Output "Rescanning server for new volume..."
            Rescan-DiskDevice -Server $ServerName -RescanDelay 5
            $scancount ++
            
            # Try getting the device again
            $device = Get-DiskDevice -SerialNumber $scvolume.SerialNumber
        }
        until($device -ne $null -or $scancount -eq 10)
    }
    
    # Set variable (this is only used if this is a drive letter mount)
    $finalpath = $MPRoot
    
    # Set full mountpoint path (create path if it doesn't exist)
    if($IsMountPoint -eq $true)
    {
        $finalpath = "$MPRoot\$VolumeName"
        
        # Check to make sure the full mountpoint path acutually exists, otherwise create it
        if (!(Test-Path -path "$finalpath\"))
        {
            New-Item "$finalpath\" -type directory
        }
    }
    
    Write-Output "Onlining Disk and setting access path to $finalpath..."
 
    # Finish creation of mountpoint/drive access
    Set-DiskDevice -SerialNumber $device.SerialNumber -Online
    Set-DiskDevice -SerialNumber $device.SerialNumber -ReadOnly:$false 
    $newvol = New-Volume -DeviceName $device.DeviceName -Server $ServerName -Label $VolumeName -AccessPath $finalpath
    
    # Null out device
    $device = $null
}
 
function LoadSnapins
{
    # Load Exchange Management Shell & Compellent Storage Center Snapins (if not already)
     $LoadedSnapins = Get-PSSnapin;
    $SnapinsToLoad = "Compellent.StorageCenter.Scripting", "Microsoft.Exchange.Management.PowerShell.E2010"
    
    "Adding PowerShell Snapins..."
 
    foreach($snapin in $SnapinsToLoad)
    {
        if (get-pssnapin $snapin -ea "silentlycontinue") 
        {
            write-host "$snapin is already loaded."
        }
        elseif (get-pssnapin $snapin -registered -ea "silentlycontinue") 
        {
            Add-PSSnapin $snapin
            Write-Host "$snapin is now loaded."
        }
        else 
        {
            write-host "PSSnapin $snapin not found" -foregroundcolor Red
        }
    }
}
 
#############################
# START SCRIPT
#############################
 
$started = Get-Date
 
#Load Requested Snapins
LoadSnapins
 
# Initialize Connection for Storage Center
#$pass = Read-Host -AsSecureString -Prompt "Please provide the Storage Center password for $user"
$securepass = ConvertTo-SecureString $pass -AsPlainText -Force
$connection = Get-SCConnection -HostName $schost -User $user -Password $securepass -Save $schost -Default
 
# Create new Volume Folder if it doesn't exist
$volumefolder = Get-SCVolumeFolder -Name $SCParentFolderName
if($volumefolder -eq $null)
{
    Write-Output "Creating new volume folder: $SCParentFolderName..."
    $volumefolder = New-SCVolumeFolder -Name $SCParentFolderName;
}
 
# Get server information for the server that we are mapping all of the volumes to
$scserver = Get-SCServer -Name $ServerName
 
# Create New Mount Point Volumes for database and logs (if requested)
if($createMountpointRoot -eq $true)
{
    CreateVolume "$ServerName-Exchange-MP" "1G" $dbRootDrive $dbDiskFolder $false
}
 
# Reset counters
$dbcount = 1
 
# Loop through total amount of databases for the server
do
{
    CreateVolume "$ServerName-DB$dbcount" $dbsize $dbmproot $dbDiskFolder $true
    
    "Creating mailbox database in Exchange 2010..."
    New-MailboxDatabase -Server $ServerName -Name "$ServerName-DB$dbcount" -EdbFilePath "$dbmproot\$ServerName-DB$dbcount\$ServerName-DB$dbcount.edb" -LogFolderPath "$dbmproot\$ServerName-DB$dbcount\Logs\"
    
    "Mounting new mailbox database..."
    Mount-Database -Identity "$ServerName-DB$dbcount"
    
    $dbcount ++ 
}
until($dbcount -eq $dbtotal + 1)
 
 
# Complete!
$ended = Get-Date
Write-Output "Volume Creation Complete!"
Write-Output "Started: $started"
Write-Output "Finished: $ended"
 
#############################
# END SCRIPT
#############################

There are a number of areas in which this script can be improved and that I will continue to work on. 

Exception handling is very important.  Understanding how your code could react in particular scenarios is difficult, but you don’t want your script to bomb out every time you run it either.  I’ve build quite a bit of exception handling into the mapping and mounting portions of the script, but this can always be reworked to be improved.

Categories: Compellent, Development, Exchange, PowerShell Tags:

Virgin Mobile Doesn’t Survive My Bag of Gadgets

November 29th, 2009 Justin Braun 1 comment

Only a week after I had purchased the Virgin Mobile Broadband2Go USB card, I returned it to Best Buy, the exclusive reseller of this product.

Last week, I wrote about the Broadband2Go card with somewhat of a glowing review because of the fact that it was available without a contract and actually connected through Sprint’s EVDO network.

So why didn’t it survive my bag of gadgets.  It’s pretty simple. 

Windows Only Support

I use both a Mac and PC and most of them time I am using Windows on top of my Mac.  This means that wherever I go, I usually have my Mac with me so I can work on both personal and business-related stuff.

Even though the Virgin Mobile website indicates that the system requirements include Mac OS 10.3, and the modem drivers actually install on my Mac, there is no “Connection Manager” type software.  I did manage to get the modem to connect to the Sprint network, but attempts to surf the web were filled with errors and lots of slowness.

I should’ve known this from the beginning when I discovered that the modem had to activated (programmed) on a Windows PC.

Weird Connectivity Issues

I call it “weird” because I got it home and found that I only had one bar for reception off of the card in Windows.  The activation process was extremely slow – took me about 30 minutes in whole to get the card activated.  Page loads were slow.  I have never had problems with Sprint coverage in my house previously.

Questionable Customer Support

Since not working on a Mac was a deal breaker, I returned it to Best Buy.  I called Virgin Mobile to cancel my account and was greeted with someone who I couldn’t completely understand and in the end took about 15-20 minutes to close my account as he “worked on the system”.  I was holding a screaming baby for all of the 20 minutes, but that didn’t seem to make him work any faster.  When I was asked about why I wanted to cancel, I plainly told the rep that the card didn’t work on a Mac.  I didn’t expect any technical banter, but I did also mention that the Virgin website includes Mac OS in their system requirements.  In the end, my account was closed, but my opinion of Virgin Mobile, although somewhat appealing, is now questionable.

In the end…

I still wanted to have an aircard so I went back to Best Buy and purchased the AT&T Quicksilver aircard.  This aircard has support for both Mac and PC and was functional and ready-to-go when I left the location. 

Both Windows and Mac have a connection manager that gets installed as soon as you insert the card.  I found this to be handy. 

The only quirk for me was that the firmware update that was recommended required Windows to apply the firmware update.  My opinion is that if you are going to support an OS, make sure that your application and any required utilities also support the OS.  Although they clearly noted on the website that the Mac firmware update was in development, you need to have this.  If I am a “Mac-Only” user, I’m left in the cold if I need that firmware update (which according to the website connectivity issues and provides stability), things that most people would like.

Categories: Mobile Devices, Technology Tags:

An Early Look At IE9 for Developers

November 19th, 2009 Justin Braun 1 comment

If you are one of the lucky few to be attending PDC in Los Angeles, CA this week, you probably got a sneak peak at Internet Explorer 9.  On Wednesday, the IE team showed off IE9 performance and standards compliance. 

They provide some interesting data points (and charts) on performance across browser platforms.  Interestingly enough, they show that their score on the Acid3 Test, a test widely known to test for compliance in, was a meek 32 out of 100.  We’ll assume that is when tested against IE8.

You can read more from the IE team on this topic here.

Categories: Development Tags:

A New Look for The Braun Blog

November 18th, 2009 Justin Braun 1 comment

I finished working on my new theme tonight, so you should be seeing the new look of my blog.  I’m still fine tuning some of what you are seeing, so things may seem a little dusty till we get all the kinks worked out.

Drop me a comment and let me know what you think of the new design or if something isn’t working as expected.

Categories: Site Updates Tags:

Virgin Mobile Broadband2Go USB Aircard

November 16th, 2009 Justin Braun 2 comments

I picked up a Virgin Mobile Broadband2Go USB modem for my laptop tonight.  I travel fairly regularly and like to have access to the Internet when I am on the road.  Since AT&T hasn’t enabled tethering for it’s iPhone users still, I wanted to find an aircard that would allow me to get Internet access wherever I may be.

I thought about purchasing an AT&T card, but wasn’t crazy about having to sign another two year contract even though the hardware was free, or pay $60 per month for data access.  In addition, monthly data transfer was capped at 5 GB.

Other vendors like Sprint and Verizon offer similar plans.

The one that I found that was pretty intriguing was the offering from Virgin Mobile called “Mobile Broadband2Go”.  Virgin Mobile prides itself on not signing it’s customers up for contracts, but providing affordable hardware and service at competitive prices. 

The USB modem cost me $99 at Best Buy.  While the competitors tend to give away their hardware for aircards, they get you by signing the two year contract and put you in a position to pay an early termination fee if you decide to quit your contract early.  $60 is a lot of money on top of an existing cell bill just to provide data access.

I intent to use it both with my work laptop which is PC-based running Windows 7.  I also plan to use it with my MacBook Pro.  I thought I would activate it using my Mac, but what I found out is that when you insert the USB modem into a USB port on your Mac, it will automatically start the installation of the modem drivers.  However, the configuration of the connection is completely manual and up to the user.  The process is a little different on a Windows machine.  When you insert the USB modem, an installation for a Connection Manager is started which installs the required drivers and an application to manage the aircard connection.

The important thing here is that initial activation of the modem has to take place on a Windows PC and not on the Mac.  Since when Connection Manager is started, it brings you to Virgin Mobile’s website where you can enter all of your account information.  It in turn gives you a couple sets of numbers which have to be entered in the Connection Manager to program the modem before it is usable.  During this time you will also select a rate plan or how you want to handle the data access on your account.

Once I followed the process to activate the modem on the Windows PC, I was then able to take it out and put it into my Mac and make things work. 

Why did I pick Virgin Mobile Broadband2Go?

1. No contract commitment (and no activation fee)
2. Pay-as-you-go Plans
3. Uses Sprint EVDO Network

Why I would possibly consider another carrier like AT&T, Sprint, or Verizon?

1. Quality of network
2. 5 GB data transfer/month vs. 1 GB max on Virgin Mobile
3. Price savings on larger data transfer plans

Who is the Mobile Broadband2Go suited for?

In my opinion, it is probably best suited for the person that needs occasional Internet access while on the go.  If you are an everyday road warrior, you’ll probably find that traditional aircard plans are better suited for you.

Categories: Mobile Devices, Technology Tags: