Friday, August 1, 2014

A possible fix for Calendar Meeting Requests showing up as email messages on a BlackBerry Device


A few weeks ago we started getting reports of users on Exchange Server 2007 with BlackBerry devices getting calendar meeting requests on their BlackBerry device as an email with no option to accept or decline the meeting. We discovered that the problem was due to the
-AutomateProcessing attribute of the impacted mailbox being set to None. The default should be AutoUpdate.
 
 To see the setting for a single user open the Exchange Management Shell on Exchange 2007and type Get-MailboxCalendarSettings user alias | FL
press enter and look at what the attribute -AutomateProcessing is set to:
 
 replace user alias with the appropriate alias for the mailbox you are checking.
 
 
To fix the issue, type Set-MailboxCalendarSettings user alias -AutomateProcessing AutoUpdate and press Enter. After it is complete you can check again using Get-MailboxCalendarSettings user alias | FL 
and you should see the following: 
 
replace user alias with the appropriate alias for the mailbox you are checking.

The users were then able to see Calendar Meeting Requests correctly on the BlackBerry device.


If you want to see of all the user Mailboxes that are set to None, you can type the following in the Exchange Management Shell:

Get-Mailbox -Resultsize Unlimited -RecipientTypeDetails UserMailbox | Get-mailboxCalendarSettings | Where {$_.automateprocessing -eq "None"} | FL Identity, automateprocessing > c:\usermbcalsettings.txt

If you want to change the ones that are found you can type the following in the Exchange Management Shell: Get-Mailbox -Resultsize Unlimited -RecipientTypeDetails UserMailbox | Get-mailboxCalendarSettings | Where {$_.automateprocessing -eq "None"} | Get-MailboxCalendarSettings -AutomateProcessing AutoUpdate


Notes:
For Exchange Server 2010/2013 you will use Get-CalendarProcessing instead of
Get-MailboxCalendarSettings and Set-CalendarProcessing instead of
Set-MailboxCalendarSettings.

You can only apply Set-CalendarProcessing to Resource Mailboxes. It cannot be used on User Mailboxes like was done for Exchange 2007 users as mentioned in this post. Additionally in Exchange 2103, Exchange ignores the -AutoProcessing attribute on the user mailbox. So if it is set to None or AutoUpdate, Exchange treats the message the same way, which is to auto update the meeting.

Refer to RIM KB31558 for more information from RIM about this issue.


If this has helped you fix Calendar Meeting requests showing up as email messages on BlackBerry devices please share in the comments or if you have any additional insights in to this issue, it would be appreciated.

Thursday, March 6, 2014

Fun With PowerShell (Make it Speak)

In my downtime, I wanted to have some fun with PowerShell and make it speak using Add-Type -AssemblyName System.Speech. I have always written an age calculation script in every coding language I have learned and I realized I had never done one in PowerShell. So I wrote one and decided to have it speak. Here it is.

---------------------------------------------------------------------------------
######################################## 
# Funscript.ps1                        # 
# http://imjustanengineer.blogspot.com #
# Written by DJ 3/2014                 #
######################################## 

Add-Type -AssemblyName System.Speech
$synthesizer = New-Object -TypeName System.Speech.Synthesis.SpeechSynthesizer
$name = Read-Host 'What is your name?';
$synthesizer.Speak("Hello, ($name) ,!") | Out-Null
$yb = Read-Host 'What year were you born?';
$synthesizer.Speak("Thank you, ($name) ,") | Out-Null
$date = Get-Date;
$year = + $date.Year;
$today = Get-Date -Format D;
$span = $year - $yb;
Write-Host Hello, $name. Today is $today. you will be $span years old this year. When is the party?;
$synthesizer.Speak("Hello, ($name). Today is ($today). you will be ($span) years old this year. When is the partee? ") | Out-Null
[System.Console]::Beep(262,200)
[System.Console]::Beep(262,200)
[System.Console]::Beep(294,200)
[System.Console]::Beep(262,200)
[System.Console]::Beep(349,200)

[System.Console]::Beep(330,200)
[System.Console]::Beep(262,200)
[System.Console]::Beep(262,200)
[System.Console]::Beep(294,200)
[System.Console]::Beep(262,200)
[System.Console]::Beep(392,200)
[System.Console]::Beep(349,200)
[System.Console]::Beep(262,200)
[System.Console]::Beep(262,200)
[System.Console]::Beep(482,200)
[System.Console]::Beep(440,200)
[System.Console]::Beep(349,200)
[System.Console]::Beep(330,200)
[System.Console]::Beep(294,200)
[System.Console]::Beep(482,200)
[System.Console]::Beep(482,200)
[System.Console]::Beep(440,200)
[System.Console]::Beep(349,200)
[System.Console]::Beep(392,200)
[System.Console]::Beep(349,200)


I would like to see what you can come up with. Be sure to leave your comments and suggestions below.

Friday, January 17, 2014

Have you ever needed to keep the mouse moving? MouseMover can help.

After looking around the Internet a little and not finding a decent mouse moving program, I decided to write my own. I wanted something that had an adjustability to how fast or slow the mouse would oscillate back and forth as well as over all oscillation time, instead of one that just oscillates every second making it ridiculous.

If you have improvements or suggestions, just comment and mention them.

Download link for MouseMover


Friday, May 10, 2013

How to have a single instance app that minimizes to the system tray, as well as restores from the tray and any duplicate instance bring the original to the foreground

For a recent project, I wanted to minimize my application to the system tray, as to not inhibit the precious toolbar space for an application that is accessed at the beginning of the workday and the end of it. I also wanted to be able to restore the application from the system tray, as well as not allow more than 1 instance of the application to be opened and if the user attempted to do that, to bring the original application into the foreground before closing the duplicate app.

This proved to be much more convoluted and difficult then I had originally expected. I found a ton of different suggestions on the internet as to how to do this, but nothing straight forward and plug and play, so this blog post will be all about adding code into an existing project that is plug and play as well as giving a simplistic example application to cherry pick from or build off of. I tried to be as detailed as possible, if I missed a step please comment so I can explain a step or add a step into this.

Create a form in Visual studio, go to the toolbox and add a notify icon to the form1, then choose your icon and the icon name. You'll need to modify the third entry below named this.nofityIcon1.Icon to whatever you name your icon by going into the solution explorer, right clicking on the project name, clicking on the resources menu tab and then add a resource/add existing file. At this point that file will now reside in your resources and be accessible via Properties.Resources .

You can add the following to the Form1_Load method if you would like, it is optional

this.notifyIcon1.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info; //Shows the info icon so the user doesn't thing there is an error.
                this.notifyIcon1.BalloonTipText = "[Balloon Text when Minimized]";
                this.notifyIcon1.BalloonTipTitle = "[Balloon Title when Minimized]";
                this.notifyIcon1.Icon = ((System.Drawing.Icon)(Properties.Resources.alarm_clock_face_s)); //The tray icon to use
                this.notifyIcon1.Text = "[ApplicationName] application, double click to restore program";


Inside of Form1() you'll need to capture 2 events via the event handlers and have two corresponding functions to handle those events as well as add a new warning message form. Under solution explorer, right click on the solution, then add, then windows form. Name the form (I called it the default name of form2.cs) and then add a label and a checkbox to it for this code, or anything else you would like to customize it with.

this.Resize += new EventHandler(form1_Resize);
            notifyIcon1.DoubleClick += new EventHandler(notifyIcon1_DoubleClick);



       private void form1_Resize(object sender, EventArgs e)
        {
            if (FormWindowState.Minimized == WindowState)
            {
                Form2 warningForm = new Form2();
                try
                {
                    RegistryKey key = Registry.CurrentUser.OpenSubKey("Software", true);
                    if (key.OpenSubKey("TimeKeeper") == null)
                    {
                        key.CreateSubKey("TimeKeeper");
                    }

                    RegistryKey subKey = key.OpenSubKey([KeyName], true);
                    string regValue = subKey.GetValue("minimizeWarningHide").ToString();

                    if (regValue == "true")
                    {
                        // continue on
                    }
                    else
                    {
                        warningForm.Show();
                    }


                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message + System.Environment.NewLine + ex.Source + System.Environment.NewLine + ex.TargetSite + System.Environment.NewLine + ex.StackTrace + System.Environment.NewLine + System.Environment.NewLine);
                }

                this.Hide();
            
            }


        }
    }
}


      private void notifyIcon1_DoubleClick(object sender,System.EventArgs e)
        {
            Show();
            WindowState = FormWindowState.Normal;
        }

In the new form2 you'll want to paste the following code after adding checkBox1 (which I renamed to ckbxMinimizeWarning), again be sure to change the [KeyName] value to your registry key name that you've chosen. You also want to add the include using Microsoft.Win32; to the top. You'll also want to disable the minimizebox and maximizebox buttons for this warning message, they aren't necessary and could confuse your user.


private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                RegistryKey key = Registry.CurrentUser.OpenSubKey("Software", true);
                if (key.OpenSubKey([KeyName]) == null)
                {
                    key.CreateSubKey([KeyName]);
                }

                RegistryKey subKey = key.OpenSubKey([KeyName], true);

                if (ckbxMinimizeWarning.Checked == true)
                {
                    subKey.SetValue("minimizeWarningHide", "true", RegistryValueKind.String);
                }

                if (ckbxMinimizeWarning.Checked == false)
                {
                    subKey.SetValue("minimizeWarningHide", "false", RegistryValueKind.String);
                }
            }
            catch (Exception)
            {
              
                throw;
            }
        }


At this point you'll want to put this code into your Form1_Load() method, ensure to change [KeyName] to the name of the key you want to house your registry settings in, inside of hkcu\software. Also don't forget to add the registry include, using Microsoft.Win32; at the top of your project.


RegistryKey key = Registry.CurrentUser.OpenSubKey("Software", true);
                if (key.OpenSubKey([KeyName]) == null)
                {
                    key.CreateSubKey([KeyName]);
                }

                RegistryKey subKey = key.OpenSubKey([KeyName], true);

                string[] subKeys = subKey.GetValueNames();

                if (!(subKeys.Contains("minimizeWarningHide")))
                {
                    subKey.SetValue("minimizeWarningHide", "false", RegistryValueKind.String);
                }


Lastly go into the program.cs code and we will use pin invoke.

The first thing to do is add the pininvoke include as well as threading include at the top of program.cs
using System.Runtime.InteropServices; and using System.Threading; This part of the code allows you to identify existing windows and to bring a window to the foreground as needed. Be sure to change the Mutex value of ExampleMinimizeToTrayProject per your own needs. This is a unique value and needs to be unique for each application you write, or else the applications will all think they are the same application (no matter the code) when the open. Mutex stands for Mutually Exclusive.

Here is the program.cs code


static class Program
    {
       
<summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            if (IsSingleInstance())
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
            else
            {
                bringToFront("Time Keeper");
            }
        }

        static private Mutex _instanceMutex = null;

        [DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
        public static extern IntPtr FindWindow(String lpClassName, String lpWindowName);

        [DllImport("user32.dll")]
        public static extern uint GetWindowThreadProcessId(IntPtr hWnd,
            IntPtr ProcessId);

        [DllImport("user32.dll")]
        public static extern IntPtr GetForegroundWindow();

        [DllImport("kernel32.dll")]
        public static extern uint GetCurrentThreadId();

        [DllImport("user32.dll")]
        public static extern bool AttachThreadInput(uint idAttach,
            uint idAttachTo, bool fAttach);

        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool BringWindowToTop(IntPtr hWnd);

        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool BringWindowToTop(HandleRef hWnd);

        [DllImport("user32.dll")]
        public static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow);

        public static void bringToFront(string title)
        {
            IntPtr hWnd = FindWindow(null, title);
            uint foreThread = GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero);
            uint appThread = GetCurrentThreadId();
            const uint SW_SHOW = 5;

            if (foreThread != appThread)
            {
                AttachThreadInput(foreThread, appThread, true);
                BringWindowToTop(hWnd);
                ShowWindow(hWnd, SW_SHOW);
                AttachThreadInput(foreThread, appThread, false);
            }
        }

        static Mutex _m;
        static bool IsSingleInstance()
        {
            try
            {
                // Try to open existing mutex.
                Mutex.OpenExisting("ExampleMinimizeToTrayProject");
            }
            catch
            {
                // If exception occurred, there is no such mutex.
                Program._m = new Mutex(true, "ExampleMinimizeToTrayProject");

                // Only one instance.
                return true;
            }
            // More than one instance.
            return false;
        }
    }
Then add an image to form2 by going to the tool box and adding a picturebox and browsing to an image under the solution explorer for the picturebox, showing the system try and what the icon looks like placed in it by importing it. Then add the label (if you would like) as well as text to the label on form2 explaining to them the minimizing process. I use the following text

<blockquote>
This program will be minimized to the system tray by the clock as pictured above. To restore it, look for the alarm clock icon inside of the system tray icon list and double click it.</blockquote>
Also add the following text to the form2 checkbox explaining its usage

<blockquote>
Select this not to see this warning again.</blockquote>
Lastly, make sure the bringToFront("[texthere]"); in program.cs is looking for the name of your form, whatever text name you've given it in your project. In this project you'll see it is named ExampleMinimizeToTrayProject.


Project for download: (the second link should be a direct link)

http://www.filefactory.com/file/30lkeoyds5pj

http://s37.filefactory.com/dl/f/30lkeoyds5pj//b/3/h/4e0c1626bd0ca3ff8f36f7f7/m/e6c5d3cbdde8f5a9fc3377a40b53d308/n/ExampleMinimizeToTrayProject.zip




References I used:

http://www.codeproject.com/Forums/1649/Csharp.aspx

http://www.codeguru.com/csharp/.net/net_general/systeminformation/article.php/c6933/Placing-Your-C-Application-in-the-System-Tray.htm

http://tech.pro/tutorial/928/how-to-minimize-an-application-to-the-taskbar-tray-in-csharp

http://stackoverflow.com/questions/9168405/mutex-do-not-work-with-two-processes-running



keywords:

single instance app application
duplicate
system tray minimize restore from tray

Monday, May 6, 2013

How to fix Lync Server Error "An unhandled exception was encountered in Service service"




I recently encountered an error with a Microsoft Lync server "An unhandled exception was encountered in Service service" that impacted users who were trying to expand a Distribution Group in Microsoft Office Communicator 2007 that had a simple fix.


From the log files:

Log Name:      Lync Server
Source:        LS Web Components Server
Date:          4/30/2013 11:39:41 AM
Event ID:      4096
Task Category: (1074)
Level:         Error
Keywords:      Classic
User:          N/A
Computer:      DC-FEC-22.dc.ad.contoso.com
Description:
An unhandled exception was encountered in Service service.
Exception Details. System.Runtime.InteropServices.COMException (0x8007203A): The server is not operational.
   at Microsoft.LiveServer.DLExpansion.Service.ThrowSoapFault(Exception e)
   at Microsoft.LiveServer.DLExpansion.Service.QueryADGetDistributionListInfo(String mail, DirectorySearcher dSearcher)
   at Microsoft.LiveServer.DLExpansion.Service.ProcessADRequest(OCSPrincipal user, String key, DlxGroup& result)
   at Microsoft.LiveServer.DLExpansion.Service.ExpandDistributionList(String groupMailAddress)
   at SyncInvokeExpandDistributionList(Object , Object[] , Object[] )
   at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
   at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
Cause: Application error. Please look through the exception details for more information.
Resolution:
Restart the server. If the problem persists contact product support.


Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="LS Web Components Server" />
    <EventID Qualifiers="50226">4096</EventID>
    <Level>2</Level>
    <Task>1074</Task>
    <Keywords>0x80000000000000</Keywords>
    <TimeCreated SystemTime="2013-04-30T15:39:41.000000000Z" />
    <EventRecordID>65745</EventRecordID>
    <Channel>Lync Server</Channel>
    <Computer>DC-FEC-22.dc.ad.contoso.com</Computer>
    <Security />
  </System>
  <EventData>
    <Data>Service</Data>
    <Data>System.Runtime.InteropServices.COMException (0x8007203A): The server is not operational.
   at Microsoft.LiveServer.DLExpansion.Service.ThrowSoapFault(Exception e)
   at Microsoft.LiveServer.DLExpansion.Service.QueryADGetDistributionListInfo(String mail, DirectorySearcher dSearcher)
   at Microsoft.LiveServer.DLExpansion.Service.ProcessADRequest(OCSPrincipal user, String key, DlxGroup&amp; result)
   at Microsoft.LiveServer.DLExpansion.Service.ExpandDistributionList(String groupMailAddress)
   at SyncInvokeExpandDistributionList(Object , Object[] , Object[] )
   at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs)
   at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&amp; rpc)
   at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)</Data>
  </EventData>
</Event>

• Affected Users: users trying to expand Distribution Groups in Office Communicator 2007 were affected.

• Fix: Restarted IIS on Lync servers.

Friday, February 8, 2013

Browse the registry just like a UNC path

Periodically I am searching for a registry path and I stumble upon something on the internet telling me to go 10+ subkeys into a hive to find a value. Although not terrible, it's kind of annoying to switch back and forth between regedit and the browser to follow the path down to the key that I need.

After some googling, I found that Mark Russinovich made a command line version of a tool for this, but I wanted a GUI so I decided to write my own registry jump browser tool. It's pretty simple to use, you plug the key into the input box and hit enter or click the browse registry button.

Format for the key path should look like

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Test Key\Test Sub Key
or
hklm\SOFTWARE\Microsoft\Test Key\Test Sub Key

and if the key is present, it will open the registry and navigate down to the key you've input. If the key does not exist, it will tell you that as well.

You may also use a command line version of this using the format below in the command prompt (remember to navigate to it)
regbrowser "hklm\software\microsoft"

You can only have 1 instance of the registry open when doing this, and it is designed for local registry browsing only, FYI.

Enjoy and leave a comment if it is useful for you, or if you have a suggested improvement.



http://www5.zippyshare.com/d/25056500/3177663/RegBrowser.exe

^ new version with help file built in and minor added functionality



http://www17.zippyshare.com/d/54500288/4459293/Registry%20Browser.zip

^ Sorry blogspot doesn't host .zip files

Tuesday, January 15, 2013

So you're getting Event Manager / Application Log code 9669

This event manager code is generated when your Exchange Server 2007 environment has run out of rows to write to in a database column, that hold unique mail header information, per each mail server. There are many posts on the internet as to how to raise the threshold for this table up to the max (database crashing) limit of 32768.

If you've temporarily raised the ceiling, just as congress keeps raising the debt ceiling, you probably realize just as congress does that eventually a limit is going to be reached and everything is going to then crash and burn.

Fortunately for you, Microsoft decided to build a way to monitor this ceiling/threshold.

Open up regedit and navigate to HKLM\System\CurrentControlSet\Services\MSEXchangeIS\Performance

• Modify the string value "Library" from (notice the dll name) [drive you have exchange program files on]\Program Files\Microsoft\Exchange Server\Bin\Perf\%Processor_Architecture%\mdbperf.dll

to

[drive you have exchange program files on]\Program Files\Microsoft\Exchange Server\Bin\Perf\%Processor_Architecture%\mdbperfx.dll

• Go to each server and apply the attached registry file change (rename the file extension appropriately)

• Open perfmon after registry change

• Right click and add counters and then select “MsExchangeIS Mailbox” under the counters and expand it

• Scroll down to “Rows in ReplidMap Table” and click once on it

• In the “Instances of selected object” window below, highlight each database individually and click add and then ok

• Next scale your counters and determine if any of them are approaching the 16383 out of the box limit

• Save the counter report as an html file so you can go back later, run the report again and calculate the rate of change each day, you can also export them as a .tsv (Tab Separated Value) file for sharing.

At this point you can spot check all other databases to see which are also approaching the replica id limit you've coded into the registry. You can also check these values with a powershell command after you've altered the registry key mentioned above.

The code for that is:

Get-mailboxserver | foreach {get-counter –counter “\MSExchangeIS Mailbox(*)\Rows in ReplidMap Table” –sampleinterval 2 –maxsamples 1}

Tuesday, January 8, 2013

My Top 10 Windows Phone Apps


This post is inspired in part by my friend Chip Diz├írd who is new to Windows Phone which has been out since 2010 and I have been an owner of a HTC Trophy Phone since July 2011 and the Windows Phone Marketplace now has over 100,000 apps, For those of you who are new to Windows Phone, I'd like to share My Top 10 Windows Phone apps that I like and that I find useful.(not listed in any order)

10. WeatherLive

WeatherLive is a great weather app with great Live Tile Support. Being able to quickly see the updated forecast for my location from the Live Tile pinned to my Start Screen, See the10 day outlook, radar and satellite views as well as view webcams is fantastic. Publisher: Hyperise
Cost: Free








9. Slacker Radio
Slacker Radio is a great way to listen to music. I am not one of those people who has 5,000 songs on my device. Slacker Radio gives me access to over 200 professionally programmed stations as well as letting me create a station based on my tastes in music. Publisher: Slacker, Inc. Cost: Free
 

8. Rowi [lite]
I know that there are quite a few choices for Twitter Apps in the Windows Marketplace but I find Rowi to be a great Twitter app for Windows Phone with a simple interface. I like being able to pin my @mentions to my start screen. There are ads in the [lite] version of the app.  Publisher: Hidden Pineapple, LLC Cost: Free and $1.49 (ad-free with push notifications)









7. FoodSpotting

The Foodspotting app makes finding food recomendations at restaurants easier. I use it to take photos of good foods & share where to find them. I always check it for recommendations when I travel and I add the places I visit so others can see what's great.
Publisher: Foodspotting 
Cost: Free











6. Betty Crocker

Solve the age old question of What's for dinner?  Get great recipes from the mobile version of the world-famous Betty Crocker cookbook. I use it to update my Evernote grocery shopping list for ingredients for the meal.
Publisher General Mills Inc.
Cost: Free











5. Open Table
For the times when I do not cook at home, I like being able to make restaurant reservations for free, instantly from my Windows phone with Open Table. There are more than 15,000 OpenTable-enabled restaurants in the United States, Canada and United Kingdom.
Publisher: OpenTable, Inc.
Cost: Free










4. GasBuddy


 When I need to know if gas is cheaper near my home, near my job or near me if I am out running errands or traveling, I click on Gas Buddy before I start driving. Gas Buddy also tells you in miles, how far away you have to drive to get it. As an added bonus, if you help report gas prices at stations if they are different, you can get a chance to win free gas.
Publisher GasBuddy.com 
Cost: Free
Evernote allows you to create notes, lists that can be accessed from anywhere and shared with anyone. I can create shopping lists on my iPad that I can view on my phone while I am at the store. Or I can create the list on my phone while looking at a recipe on the Betty Crocker app. You can also update your Evernote notes from your computer.
Publisher Evernote
Cost : Free





2. SBux


Though it is not the official Starbucks app, SBUX comes pretty close to matching what Starbucks has done for iOS and Android devices. Paying with the phone, finding the closest starbucks to your current location and adding multiple cards are some of the features I like.
Publisher Denham Software Solutions
Cost : Free




 
1. Vimeo
The Vimeo app allows you watch videos as well as manage your videos if you have any on the site. You can create pinned tiles with your videos or featured channels. Sharing videos using social media is easy.
Publisher: Vimeo
Cost: Free





 
 
 
 
Conclusion
While there are thousands of apps available for Windows Phone users to get including others that do similar things to my list of Top 10 Windows Phone apps, I hope you will check out the ones I have shared in this post. I like the features and functionality provided by apps and I invite you to share some of your favorite Windows Phone apps in the comments.

Disclaimer
I was not compensated financially for mentioning any of the apps included in this post. I was, however, rewarded with satisfaction and enjoyment which allowed me to create this post about My Top 10 Windows Phone Apps.

Friday, September 28, 2012

Microsoft, What did you do to Forefront?

ForeFront Logo

I am shocked but not surprised by Microsoft's decisions about Forefront as recently announced on September 12th, 2012 (the same same day as Apple's iPhone 5 launch) on their Server and Cloud Blog titled "Important Changes to Forefront Product Map". The following products from the Forefront Product Set will no longer be sold as December 1st, 2012:
    • Forefront Protection 2010 for Exchange Server (FPE)
    • Forefront Protection 2010 for SharePoint (FPSP)
    • Forefront Security for Office Communications Server (FSOCS)
    • Forefront Threat Management Gateway 2010 (TMG)
    • Forefront Threat Management Gateway Web Protection Services (TMG WPS)
Also mentioned in Microsoft's blog post is that Forefront Online Protection for Exchange (FOPE) will be called Exchange Online Protection (EOP) for the next release. EOP can be combined with the new Anti-malware protection built-in to Exchange Server 2013. SharePoint and Lync Servers will continue to offer the built-in security capabilities also Forefront Unified Access Gateway (UAG) and Forefront Identity Manager (FIM) will still be be available.

Mary Jo Foley, from ZDNET, wrote a post called "Microsoft axes many of its Forefront enterprise security products" shortly after the announcement. She also mentioned that Forefront Endpoint Security will be rolled into the new System Center 2012 Endpoint Protection. The comments on her blog post, on Twitter as well as Microsoft's post show the confusion among users about the Forefront changes. People are wondering what will happen to their TMG deployments, will signatures be updated, Windows Server 2012 support, what exactly is the new Anti-malware protection built-in to Exchange Server 2013 and how is Exchange Online Protection different from that offering? Do you have any questions or comments about what your options will be once these changes take effect?

For us, we were considering replacing Internet Security and Acceleration (ISA) servers with Forefront Threat Management Gateway 2010 servers but now we are exploring other solutions I think partly based on this recent news. I will be watching closely to see what Microsoft does with new Forefront offerings. Comments, thoughts and opinions welcomed.

Friday, August 3, 2012

How to get around, bypass or defeat "A program is trying to automatically send email on your behalf" in Outlook 2010

If you've encountered this error like I have, you know it is a pain in the ass. You're writing code and trying to test it and you get blocked by Outlook security. Today I found a good solution that should be more widely available on the internet, then it is. These two registry keys disable that functionality. A C sharp code example is below and what I used to send emails in a console app. It loops and send a new incrementing subject email every 5 seconds. The code is from the internet and other people, that I've tweaked, same as the reg hacks. I have not tried this with some of the other programmatic ways to interact with Office, nor with other versions of Office. This may also work or affect the "A program is trying to access e-mail addresses you have stored in Outlook" as well.


[HKEY_CURRENT_USER\Software\Policies\Microsoft\Security] "CheckAdminSettings"=dword:00000002
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Outlook\Security] "ObjectModelGuard"=dword:00000002 



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Threading;

/*

 Windows Registry Editor Version 5.00

    [HKEY_CURRENT_USER\Software\Policies\Microsoft\Security] "CheckAdminSettings"=dword:00000002
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Outlook\Security] "ObjectModelGuard"=dword:00000002 
  
  
  
 */

namespace LateBindingTest
{
    class OutlookEmailerLateBinding
    {

        private object oApp;
        private object oNameSpace;
        private object oOutboxFolder;
        public static int messageNumber = 0;

        public OutlookEmailerLateBinding()
        {
            int loopNumber = 0;
            Type outlook_app_type;
            object[] parameter = new object[1];
            //Get the excel object
            outlook_app_type = Type.GetTypeFromProgID("Outlook.Application");
            //Create instance of excel
            oApp = Activator.CreateInstance(outlook_app_type);
            //Set the parameter which u want to set
            parameter[0] = "MAPI";
            //Set the Visible property
            oNameSpace = outlook_app_type.InvokeMember("GetNamespace",
            BindingFlags.InvokeMethod, null, oApp, parameter);

            var Logon_parameter = new object[4] { null, null, true, true };
            oNameSpace.GetType().InvokeMember("Logon",
            BindingFlags.InvokeMethod, null, oNameSpace, Logon_parameter);

            var GetDefaultFolder_parameter = new object[1] { 6 };
            oOutboxFolder =
            oNameSpace.GetType().InvokeMember("GetDefaultFolder",
            BindingFlags.InvokeMethod, null, oNameSpace,
            GetDefaultFolder_parameter);

            Console.WriteLine(messageNumber + " - Press enter to exit");
        }

        static void Main(string[] args)
        {
            //int messageNumber = 0;
            while (true)
            {
                messageNumber += 1;
                try
                {
                    OutlookEmailerLateBinding app = new OutlookEmailerLateBinding();
                    app.SendOutlookEmail("user1@domain.com; user2@domain.com", "Duplicate test message email " + messageNumber, "Test message. Testing. Only reply back if you see a duplicate.");
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error Stack {0} ", e.Message);
                }

                //Console.ReadLine();

                Thread.Sleep(5000);
            }
        }

        public void SendOutlookEmail(string toValue, string
subjectValue, string bodyValue)
        {
            var CreateItem_parameter = new object[1] { 0 };
            object oMailItem =
oApp.GetType().InvokeMember("CreateItem", BindingFlags.InvokeMethod,
null, oApp, CreateItem_parameter);

            var mail_item_type = oMailItem.GetType();
            mail_item_type.InvokeMember("To",
                BindingFlags.SetProperty, null, oMailItem, new
object[] { toValue });
            mail_item_type.InvokeMember("Subject",
                BindingFlags.SetProperty, null, oMailItem, new
object[] { subjectValue });
            mail_item_type.InvokeMember("Body",
                BindingFlags.SetProperty, null, oMailItem, new
object[] { bodyValue });
            mail_item_type.InvokeMember("Send",
                BindingFlags.InvokeMethod, null, oMailItem, null);

        }

    }
}




on a side note, here is how to do it in powershell in a slightly different way by connecting directly to the CAS server

if ( (Get-PSSnapin | Where-Object { $_.Name -eq "Microsoft.Exchange.Management.PowerShell.Admin"}) -eq $null )
  {
    add-pssnapin Microsoft.Exchange.Management.PowerShell.Admin
  }


 $emailattachment = "xx" # full path to attachment file

 $body = "xx" # body of email

 $smtp = new-object Net.Mail.SmtpClient("xxx") # Dns name or IP of your cas server
 $smtpuser = new-object System.Net.networkCredential
 $smtpuser.domain = "xx" # your domain
 $smtpuser.username = "xx" # your username
 $smtpuser.password = "xx" # your password
 $smtp.Credentials = $smtpuser
 
 $SmtpClient = new-object system.net.mail.smtpClient
 $MailMessage = New-Object system.net.mail.mailmessage
 $SmtpClient.Host = "xxx" # Dns name or IP of cas server
 $mailmessage.from = "xxx" # your email address
 $mailmessage.To.add("xx@xx.xx") # email address to send to
 $mailmessage.Subject = "xxx" # subject
 $MailMessage.IsBodyHtml = $False
 $mailmessage.Body = $body 
 $attachment = New-Object System.Net.Mail.Attachment($emailattachment, 'text/plain') # you may have to change the file type or encrypt file with 7zip to get around gmail file attachment restrictions
   $mailmessage.Attachments.Add($attachment)
 $smtp.Send($MailMessage)




  

Tuesday, July 31, 2012

Windows Server 2012 I hate your start button ...

Windows Server 2012 I hate your start button but I love your virtualization capabilities. I'm hoping my organization will be able to take advantage of your increased number of remote desktop connections, from the current OS we are using. I'm also totally stoked to use your virtualization failover services although I doubt my management will allow me to do that except for Sunday morning at 4am.

I tried [windowskey]+r and I did not get a run prompt, that better have been a fluke. There is no reason to take away my shortcut keys, it is just going to make more work for me to figure out how to put them back into the image. Edit, I just checked again and it was a fluke, but this lack of a my computer icon on the desktop is really throwing me. Hopefully the RTM has the ability to put a Computer icon and some other customizations that some of us admins have gotten used to, on the desktop. Fortunately all of the run commands such as mmc, services and calc are there, although I see you've taken my beloved charmap away. I see we are also back to a boxy, unasthetically pleasing look as a default, of which I can deal with because that graphic rendering is probably just additional overhead and it harkens back to my favorite OS of all time, Windows 2000.

All in all, I think you and I have a lot of potential Windows Server 2012. As long as you run my code and programs well, which I see no problem with because you are running .net 4.0, I'll be mostly happy. It make take a while to get used to your GUI changes, and I may never like them since I am much more efficient with a my computer desktop icon, but I'm willing to give it a chance if you are.


** UPDATE ** On a windows 8 laptop, I've installed http://www.classicshell.net/ . I'm not sure how keen management will be with having this on production boxes, but if you can sneak it into the default profile the Classic Shell is spectacular.

Tuesday, July 17, 2012

Microsoft Exchange Server 2013 Released!

Microsoft has recently released Exchange Server 2013 Preview as well as an Outlook 2013 preview. I cannot go into all the changes in the Exchange Server 2013 Preview release but some of the things you can expect are:
  • Smart Search that learns from your communication and collaboration interactions.
  • Social integration of contact data from multiple sources to provide a single contact view.
  • A new look for Outlook and OWA with A touch aware streamlined UI for OWA and Offline Access in OWA 
  • Improved integration with SharePoint 2013 and Lync 2013
  • Improved E-Discovery searching across Exchange Server 2013, SharePoint 2013, Lync 2013 and Windows File Share
  • A redesigned resilient deployment.
Prerequisites for deploying Microsoft Exchange Server 2013 include:
  1. First join the computer to the appropriate internal Active Directory forest and domain.
  2. Make sure that the functional level of your forest is at least Windows Server 2003, and that the schema master is running Windows Server 2003 with SP1 or later
  3. The full installation option of Windows Server 2012 and Windows Server 2008 R2 SP1 must be used for all servers running Exchange 2013 Preview server roles or management tools.
  4. You should also uninstall 64-bit version of Microsoft Visual C++ 11 Beta Redistributable.
Please note that Mailbox and Client Access Server (CAS) Roles are the only choices. The transport pipeline in Exchange 2013 Preview is now made up of several different services: the Front End Transport service on Client Access servers, the Hub Transport service on the Mailbox servers, and the Mailbox Transport service on the Mailbox servers.

RPC is no longer a supported direct access protocol. Outlook connectivity uses RPC over HTTPS.

There are also standalone Help Files for Microsoft Exchange Server 2013 Preview, Microsoft Exchange Online Preview, and Microsoft Exchange Server 2013 Preview Hybrid Deployments release as well as a Resource Page that has more information.

You are encouraged to send feedback to Microsoft using the Exchange Server 2013 Feedback option.

More information will be revealed at the upcoming Microsoft Exchange Conference (MEC) in Florida from September 23rd to 26th 2012. I hope to be in attendance at my first MEC.

You can engage in the discussions at the forums. I will be reading and maybe posting there also.

Please note due to the nature of this product information and links can be changed without warning.

Wednesday, June 20, 2012

Windows Phone Summit Highlights



This information is hot off the Windows Phone 8 Summit held on June 20th 2012 in San Francisco. The show was kicked of by the same DJ using the transparent touchscreen seen before the opening keynote at TechEd North America 2102 in Orlando last week. The major highlights of the event are:
  1. No device upgrade to Windows Phone 8 OS(Apollo)
  2. Hardware Multicore Processor support
  3. A new Start Screen with different Tile Sizes
  4. Mobile Wallet Hub
  5. New "Shared" Kernel
Here is a bit more about the major highlights I listed above:

No device upgrade to Windows Phone 8 OS(Apollo)
This one hurt me the most.  There will be a Windows Phone 7.8 OS upgrade for devices running Windows Phone 7.5 (Mango) that cannot take advantage of all the new features due to hardware requirements. It seems that all devices will get this upgrade independent of carrier and over the air (3G, 4G or WiFi) instead of being forced through Zune. Windows Phone 8 is expected to be available by fall 2012.

Hardware Multicore Processor support
Windows Phone 8 will support for multi-core processors including dual core initially and quad core and more in the future. The first devices are expected to be dual core processors.

A new Start Screen  with different Tile Sizes
Microsoft introduced three sizes of Live tiles, small, medium, and large. Please note that existing Windows Phone devices have the medium and large Live tiles but are not resizable. Windows Phone 7.8 and Windows Phone 8 should support three resolutions in total: WVGA, WXGA,(both 15:9) and 720p (16:9). The new screen also offers more color customization and personalization options. The arrow on the right side of the screen is gone and all tiles now take up the whole screen with a smaller tile layout.

Mobile Wallet Hub
The Mobile Wallet in Windows Phone 8 will support Near Field Communication (NFC) payments as well as the Passbook type of e-wallet offered by Apple on their iOS Devices. Microsoft promises the “most complete” mobile wallet solution, because they are working directly with the carriers.

New "Shared" Kernel
Windows Phone 8 will share the same kernel as Windows 8. This will allow the use of Micro SD cards as external storage which is a big change from how it was done in Windows Phone 7 and Windows Phone 7.5. Device Encryption, Secure Boot and Device management are another benefits gained via the new shared kernel. Developers will be able to use managed code developed for Windows 8 with Windows Phone 8. They will be able to use C, C++, C#, HTML 5 and Direct X in development of apps for both platforms.

Other fun things to note. Internet Explorer 10 is the new browser. Skype will take advantage of the deep VOIP integration.There will be new devices from Nokia, Samsung and HTC. There are now 100,000 apps in the Marketplace. Zynga has promised Draw Something and Words with Friends to come later this year. New Tap + Send app will allow content sharing. Nokia Maps will replace Bing Maps.

Is it enough to make you switch or wait? Your Thoughts and comments are welcomed.

Tuesday, June 19, 2012

How to Have a Daily Report of your Exchange 2007 backups sent to you everyday.

Have you ever needed a way to quickly tell what was going on with your Exchange 2007 backups at night when you are not in the office? I came up with this script back in 2010 that helps you do that using PowerShell combined with Scheduled tasks on a Windows Server. Tested on Exchange 2007 and PowerShell v1 and v2.

We do Full Backups daily but if you want to, you can add “LastIncrementalBackup”or “LastDifferentialBackup” to suit your needs.

Here is the script:
------------------------------------------------------------------------------------------------------------
#######################################
#Backup_report_vs1.ps1                #
#http://imjustanengineer.blogspot.com #
#Created by DJ 6/2/2010               #
#######################################

Add-PSSnapin Microsoft.Exchange.Management.powershell.admin;

Get-Mailboxserver | Get-MailboxDatabase -Status |FL Name,Server,lastfullbackup,backupinprogress,Mounted > c:\exch2007_backups.txt

start-sleep -s 120

$filename = “c:\exch2007_backups.txt”
$smtpServer = “your.smtpserver.com” #Enter FQDN of your SMTP server

$msg = new-object Net.Mail.MailMessage
$att = new-object Net.Mail.Attachment($filename)
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$msg.From = “BackupReportingScript@yourdomain.com” #Enter senders email address $msg.To.Add(”recipient1@yourdomain.com, recipient2@yourdomain.com,”) #Enter one or more recipient addresses
$msg.Subject = “Exchange 2007 Servers Backup Report" #Enter subject of message $msg.Body = “Attached is the Daily Exchange 2007 Servers Backup Report. Please note any servers that have not been backed up for more than a day.” $msg.Attachments.Add($att)

$smtp.Send($msg)
-----------------------------------------------------------------------------------------------------------

In the created text file on your C: drive you should output that looks like

Name             : EXCH-SERVER01_SG01DB01
Server           : EXCH-SERVER01
LastFullBackup   : 6/7/2010 2:33:10 AM
BackupInProgress : False
Mounted          : True



Please let us know if this is helpful to you.  

Wednesday, June 6, 2012

World IPv6 Day June 6th 2012



World IPv6 Day is today June 6th 2012. It is also called IPv6 Launch Day since it is the the day major websites and Internet Service Providers (ISPs) permanently enabled IPv6 and began the transition from IPv4.

What are IPv4 and IPv6?
IPv4 is the current version of the Internet Protocol, the identification system the Internet uses to send information between devices. This system assigns a series of four numbers (each ranging from 0 to 255) to each internet connected device. IPv4 only allows for about 4 billion addresses.

In 1998, the Internet Engineering Task Force (IETF) released standards for a new Internet Protocol, IPv6 under RFC2460. IPv6 is a 128-bit IP address space (each broken into hexadecimal groups), which means around 340 trillion trillion trillion addresses. An IPv4 address looks like 192.168.1.1 whereas an IPv6 address would look like 2001:0470:82a9:0007:f2de:f1ff:fe5b:b324 (Thanks to Ed Horley for the correction to my IPv6 address)
History
On June 8th 2011, World IPv6 Day was held for the first time organized by The Internet Society. The aim last year was to test the public deployment of the IPv6 protocol by a few hundred sites including Akamai Technologies,Microsoft,Google,Facebook, Yahoo to name a few. Another goal was to get a sense of what it will take to transition to IPv6 addresses when addresses in the IPv4 space run out which actually happened in 2011.

Happening now
As Internet Service Providers(ISPs) enable IPv6, and support it, home users at home with modern operating systems and devices will start using IPv6 automatically. Windows Vista, Windows 7, and Mac OS X 10.7 support IPv6. You can check your home router’s documentation to see if it support’s IPv6, and contact your ISP to ask if IPv6 is deployed in your service area.

In the June issue of Microsoft's Springboard Insider newsletter, I see that attendees at TechEd North America 2012 can be a part of the IPv6 BootCamp: Get Up to Speed Quickly. I was happy to see that deploying IPv6 with Microsoft Exchange Server 2010, Windows 7, and Windows Server 2008 R2 will be covered.

There will also be a session entitled IPv6: HardCore Networking Services covering differences between IPv4/IPv6 and ARP, DHCP, DNS, DNSSEC and their new roles. This session will also cover common misconceptions about IPv6 and how you should avoid them.

I plan to be at both of these sessions at Teched North America 2012. If you get a chance to attend Teched North America 2012 I would hope you take the time to get the knowledge about IPv6.

Comments are welcomed.