<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.technet.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Evan Dodds - Microsoft Exchange Server Blog : Exchange 2007</title><link>http://blogs.technet.com/evand/archive/tags/Exchange+2007/default.aspx</link><description>Tags: Exchange 2007</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Using C# to get to MultiValuedProperty</title><link>http://blogs.technet.com/evand/archive/2008/04/01/using-c-to-get-to-multivaluedproperty.aspx</link><pubDate>Tue, 01 Apr 2008 22:24:57 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:3025596</guid><dc:creator>evand</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.technet.com/evand/comments/3025596.aspx</comments><wfw:commentRss>http://blogs.technet.com/evand/commentrss.aspx?PostID=3025596</wfw:commentRss><wfw:comment>http://blogs.technet.com/evand/rsscomments.aspx?PostID=3025596</wfw:comment><description>&lt;p&gt;Today's post is to address a question we dealt with fairly recently through a customer escalation. The customer was trying to figure out the best way to programmatically get access to the entries in a MultiValuedProperty collection returned as part of an Exchange object.&lt;/p&gt; &lt;p&gt;Specific example we'll use here: Read in one or more mailbox objects (using Get-Mailbox cmdlet) and then iterate across and output some properties. Since we're outputting "Name" and "EmailAddresses" properties here, one will be a singleton ("Name") and one will be a collection ("EmailAddresses"). &lt;/p&gt; &lt;p&gt;To accomplish extracting this data, immediately the customer had driven straight into the Exchange.Management namespaces looking for Mailbox. But that's not the right approach. Vivek &lt;a href="http://www.viveksharma.com/TECHLOG/archive/2006/07/27/sample-code-calling-exchange-cmdlets-from-net-code.aspx"&gt;talks about why in this blog post&lt;/a&gt;, but the short version is that there's nothing to be gained by tying your code directly into Exchange (no useful public methods and limited benefit from the property strong-types) and quite a bit to be lost (you become tied to the assembly version, etc).&lt;/p&gt; &lt;p&gt;So, how then do you do it? Well, you use PSObject and non-Exchange types everywhere. There's a pretty good starter example in Technet: &lt;a title="http://msdn2.microsoft.com/en-us/library/bb332449.aspx" href="http://msdn2.microsoft.com/en-us/library/bb332449.aspx"&gt;http://msdn2.microsoft.com/en-us/library/bb332449.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Which leads to the customer's real question -- "I can get the object, but how do I drill into the strong-type properties that are of types like MultiValuedProperty?"&lt;/p&gt; &lt;p&gt;Good news! MultiValuedProperty type implements ICollection, so it's actually pretty simple. When you extract the property value, just cast it as ICollection and you're golden!&lt;/p&gt; &lt;p&gt;Here's some sample code (based on the Technet code) with a few comments added:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PSSnapInException snapInException = null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PSSnapInInfo info = rsConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.Admin", out snapInException);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Runspace myRunSpace = RunspaceFactory.CreateRunspace(rsConfig);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myRunSpace.Open();  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pipeline pipeline = myRunSpace.CreatePipeline();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Command myCommand = new Command("Get-Mailbox");  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pipeline.Commands.Add(myCommand);  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Collection&amp;lt;PSObject&amp;gt; commandResults = pipeline.Invoke();  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Ok, now we've got a bunch of mailboxes, cycle through them&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (PSObject mailbox in commandResults)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //define which properties to get&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (String propName in new string[] { "Name", "EmailAddresses" })&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //grab the specified property of this mailbox&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Object objValue = mailbox.Properties[propName].Value;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // is it a collection? "Name" isn't, but "EmailAddresses" is in this example&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (objValue is ICollection)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ICollection collection = (ICollection)objValue;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Loop through each entry in the collection and output it&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (object value in collection)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(value.ToString());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(objValue.ToString());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myRunSpace.Close();&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font size="1"&gt;&lt;em&gt;Thanks to Mike Hamler for assistance with the generic solution!&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3025596" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/evand/archive/tags/Exchange+2007/default.aspx">Exchange 2007</category><category domain="http://blogs.technet.com/evand/archive/tags/Powershell/default.aspx">Powershell</category></item><item><title>Generating LDP Dumps from PowerShell</title><link>http://blogs.technet.com/evand/archive/2008/03/18/generating-ldp-dumps-from-powershell.aspx</link><pubDate>Wed, 19 Mar 2008 03:21:55 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:3014651</guid><dc:creator>evand</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.technet.com/evand/comments/3014651.aspx</comments><wfw:commentRss>http://blogs.technet.com/evand/commentrss.aspx?PostID=3014651</wfw:commentRss><wfw:comment>http://blogs.technet.com/evand/rsscomments.aspx?PostID=3014651</wfw:comment><description>&lt;p&gt;Back in my PSS days, it was a common data-gathering/troubleshooting technique to collect "LDP Dumps" (ie - full AD propertyname+value data for a given object) as a way of collecting data for a troubleshooting investigation. If you're a really long-time Exchange administrator, just pretend I said "raw mode dump" and know that it's effectively the same thing, but for an AD object.&lt;/p&gt; &lt;p&gt;Recently, a customer suggested that we (Exchange) should produce a built-in cmdlet which can, given a pipeline input of an Exchange object, connect to the AD and provide this sort of LDP dump data, so that they could replace their use of LDP.exe. The rationale is that this could be pretty useful to collect this data more rapidly (and with fewer clicks) when troubleshooting an issue. I thought about it for a bit, and realized that because of the directory support built into PowerShell (or, rather, .Net) this would be something possible to write with a fairly simple script... no new cmdlet required! &lt;/p&gt; &lt;p&gt;Note that in an effort to keep the output looking roughly like the LDP output, I'm writing out strings rather than objects. This is a little counter to the spirit of PowerShell, of course, but it's also easily overcome with some minor changes to the script below.&lt;/p&gt; &lt;p&gt;Behold, the outcome of this experiment - I hope it's useful to you!&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;#&lt;br&gt;# LDPDump.ps1 script&lt;br&gt;# This script is a PowerShell way to simulate the effects of the old-school "LDP Dump" used by Exchange PSS and other Exchange power-administrators&lt;br&gt;#&amp;nbsp; (ie - connecting with LDP.exe, navigating to an object, and double-clicking to get all of the property and value data onto the screen)&lt;br&gt;#  &lt;p&gt;#&lt;br&gt;# Discover whether the script is receiving piped input&lt;br&gt;#&lt;br&gt;if ( $input.movenext() )&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $inputExists = $true&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $input.reset()&lt;br&gt;}  &lt;p&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;# There is no piped input - provide some guidance and exit&lt;br&gt;#&lt;br&gt;if (!$inputExists ) &lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; write-error "You need to pipe in some object!"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit&lt;br&gt;}  &lt;p&gt;# Let's loop on each of the things piped into the script&lt;br&gt;foreach ($j in $input)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Grab out the distinguished name (this is a little bit Exchange-centric, but it's also sort of standard-ish)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $dn=$j.DistinguishedName&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Did we find a DistinguishedName property? If not, ABORT!&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if($dn -eq $null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write-error "THIS OBJECT DOES NOT HAVE A DN: $($j.ToString())"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write-host ""&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # OK, we found a DN... let's open a session to AD&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ldapdn = "[ADSI]'LDAP://$dn'"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ldpdump = invoke-expression "$ldapdn"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Print a header for this object&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write-host "$($ldpdump.psbase.path)"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($k in $ldpdump.psbase.properties.PropertyNames)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Make each count, propertyname and value output look pretty much like LDP does (ie - "#&amp;gt;Name:Value")&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write-host "$($ldpdump.psbase.properties[$k].count)&amp;gt;$($k):$($ldpdump.psbase.properties[$k])"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write-host ""&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;Thanks to Sebastian Bengochea for help getting at the ProxyCollection data!&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3014651" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/evand/archive/tags/Exchange+2007/default.aspx">Exchange 2007</category><category domain="http://blogs.technet.com/evand/archive/tags/Powershell/default.aspx">Powershell</category></item><item><title>Interact 2008 - April 8-10, 2008</title><link>http://blogs.technet.com/evand/archive/2008/03/16/interact-2008-april-8-10-2008.aspx</link><pubDate>Mon, 17 Mar 2008 00:47:01 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:3007000</guid><dc:creator>evand</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.technet.com/evand/comments/3007000.aspx</comments><wfw:commentRss>http://blogs.technet.com/evand/commentrss.aspx?PostID=3007000</wfw:commentRss><wfw:comment>http://blogs.technet.com/evand/rsscomments.aspx?PostID=3007000</wfw:comment><description>&lt;p&gt;I just heard that (Exchange VP) &lt;a href="http://msexchangeteam.com/archive/2008/03/12/448427.aspx"&gt;Terry's going to be giving the keynote&lt;/a&gt; at &lt;a href="https://www.interact08.com/main.aspx"&gt;Interact&lt;/a&gt; this year, and he's promised the first real public details about &lt;a href="http://msexchangeteam.com/archive/2007/10/08/447213.aspx"&gt;ExchangeLabs&lt;/a&gt;! Sweet... this is exciting stuff!&lt;/p&gt; &lt;p&gt;Plus -- Robert and Andrew will be presenting the &lt;a href="http://blogs.technet.com/evand/archive/2007/07/26/evan-s-teched-session-video-is-posted.aspx"&gt;PowerShell Automation&lt;/a&gt; talk, so that alone makes the conference worthwhile, of course. :)&lt;/p&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3007000" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/evand/archive/tags/Exchange+2007/default.aspx">Exchange 2007</category><category domain="http://blogs.technet.com/evand/archive/tags/Powershell/default.aspx">Powershell</category><category domain="http://blogs.technet.com/evand/archive/tags/Exchange14/default.aspx">Exchange14</category><category domain="http://blogs.technet.com/evand/archive/tags/ExchangeLabs/default.aspx">ExchangeLabs</category></item><item><title>Nested DL Membership in Exchange 2007</title><link>http://blogs.technet.com/evand/archive/2007/12/14/nested-dl-membership-in-exchange-2007.aspx</link><pubDate>Sat, 15 Dec 2007 01:34:01 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:2647686</guid><dc:creator>evand</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.technet.com/evand/comments/2647686.aspx</comments><wfw:commentRss>http://blogs.technet.com/evand/commentrss.aspx?PostID=2647686</wfw:commentRss><wfw:comment>http://blogs.technet.com/evand/rsscomments.aspx?PostID=2647686</wfw:comment><description>&lt;p&gt;Aeons ago, Vivek posted about how to &lt;a href="http://www.viveksharma.com/techlog/2006/10/22/how-to-get-dl-membership-in-exchange-2007/"&gt;get DL membership in Exchange 2007&lt;/a&gt;. He commented that "&lt;em&gt;This can be adapted to do nested membership as well—I’ll leave it to you to figure out how.&lt;/em&gt;"&lt;/p&gt; &lt;p&gt;At the time, I remember reading this and thinking briefly about how I'd do this, but never really sitting down and doing it to prove my idea was correct.&lt;/p&gt; &lt;p&gt;Well, my time finally ran out on not looking at this. The other day, someone sent me a semi-working PowerShell function to get DL membership (including recursion) and asked me how to make it detect looping recursion. It's been over a year since Vivek delegated this problem "&lt;em&gt;to you&lt;/em&gt;", so I guess that's about enough time and we should share an answer. Let's get to it! &lt;/p&gt; &lt;p&gt;Here's the function we started with:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;i&gt;function Get-DLMemberRecurse&lt;br&gt;&lt;/i&gt;&lt;i&gt;{&lt;br&gt;&lt;/i&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($varTemp in get-distributiongroupmember $args[0])&lt;br&gt;&lt;/i&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&lt;/i&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $varTemp&lt;br&gt;&lt;/i&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($varTemp.RecipientType -like "Mail*Group") { Get-DLMemberRecurse $varTemp.Identity }&lt;br&gt;&lt;/i&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;/i&gt;&lt;i&gt;}&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Key problem? If you have DG1 which has DG2 as a member which then has DG1 as a member (a looping membership hierarchy which is totally possible to set, but totally useless practically), it loops forever until it overflows the stack. Whoops, that's no good!&lt;/p&gt; &lt;p&gt;So we need to make a couple of changes to solve this problem. We need to do at least two things (which I've color coded in my updated function below to highlight the changes):&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;font color="#ff8000"&gt;Add some recursion protection, using PowerShell’s understanding of scope and recursion. This is useful to ensure we can effectively reset and subsequently build a list of DGs we’ve already traversed.&lt;/font&gt;  &lt;li&gt;&lt;font color="#008000"&gt;Build a list of DGs we’ve traversed, and update it each time we find a new one&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;function Get-DLMemberRecurse&lt;br&gt;{&lt;br&gt;&lt;/em&gt;&lt;em&gt;&lt;font color="#ff8000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ParentScriptBlock = (get-variable -scope 1 MyInvocation -value).MyCommand.ScriptBlock;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if($ParentScriptBlock -ne $MyInvocation.MyCommand.ScriptBlock)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # we're not recursing (we should only hit this once and we'll use it to reset the DGList)&lt;br&gt;&lt;/em&gt;&lt;em&gt;&lt;font color="#008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $global:DGList = @()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $global:DGList += (Get-DistributionGroup $args[0]).Identity&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff8000"&gt;&amp;nbsp; }&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($varTemp in get-distributiongroupmember $args[0])&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $varTemp &lt;/em&gt; &lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($varTemp.RecipientType -like "Mail*Group" &lt;font color="#008000"&gt;-and -not ($global:DGList -contains $varTemp.identity) &lt;/font&gt;) { &lt;font color="#008000"&gt;$global:DGList += $varTemp.Identity; &lt;/font&gt;Get-DLMemberRecurse $varTemp.Identity } &lt;/em&gt; &lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/em&gt; &lt;p&gt;&lt;em&gt;}&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font style="background-color: #fafaf0"&gt;Special thanks to my buds on the &lt;a href="http://blogs.msdn.com/powershell"&gt;PowerShell team&lt;/a&gt; for getting me going with the "how to know if I'm inside a recursion loop using MyInvocation variable" tip. &lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=2647686" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/evand/archive/tags/Exchange+2007/default.aspx">Exchange 2007</category><category domain="http://blogs.technet.com/evand/archive/tags/Powershell/default.aspx">Powershell</category></item><item><title>Using PowerShell + WMI to manage legacy Exchange</title><link>http://blogs.technet.com/evand/archive/2007/09/10/using-powershell-wmi-to-manage-legacy-exchange.aspx</link><pubDate>Mon, 10 Sep 2007 17:44:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:1930919</guid><dc:creator>evand</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.technet.com/evand/comments/1930919.aspx</comments><wfw:commentRss>http://blogs.technet.com/evand/commentrss.aspx?PostID=1930919</wfw:commentRss><wfw:comment>http://blogs.technet.com/evand/rsscomments.aspx?PostID=1930919</wfw:comment><description>&lt;P&gt;Dmitry blogs all about it &lt;A href="http://dmitrysotnikov.wordpress.com/2007/09/06/wmi-powershell-for-exchange-2003/" mce_href="http://dmitrysotnikov.wordpress.com/2007/09/06/wmi-powershell-for-exchange-2003/"&gt;here&lt;/A&gt;. I'd been meaning to write pretty much this very same post ever since I attended &lt;A href="http://blogs.3sharp.com/Blog/deving/" mce_href="http://blogs.3sharp.com/Blog/deving/"&gt;Devin&lt;/A&gt;'s talk on managing Legacy Exchange with PowerShell at ExchangeConnections &lt;STRIKE&gt;last November &lt;/STRIKE&gt;&lt;EM&gt;this past April&lt;/EM&gt;, so I'm glad to see Dmitry write it up! &lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=1930919" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/evand/archive/tags/Exchange+2003+SP1/default.aspx">Exchange 2003 SP1</category><category domain="http://blogs.technet.com/evand/archive/tags/Exchange+2003+SP2/default.aspx">Exchange 2003 SP2</category><category domain="http://blogs.technet.com/evand/archive/tags/Exchange+2007/default.aspx">Exchange 2007</category><category domain="http://blogs.technet.com/evand/archive/tags/Powershell/default.aspx">Powershell</category></item><item><title>Evan's TechEd session video is posted</title><link>http://blogs.technet.com/evand/archive/2007/07/26/evan-s-teched-session-video-is-posted.aspx</link><pubDate>Thu, 26 Jul 2007 20:49:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:1620387</guid><dc:creator>evand</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.technet.com/evand/comments/1620387.aspx</comments><wfw:commentRss>http://blogs.technet.com/evand/commentrss.aspx?PostID=1620387</wfw:commentRss><wfw:comment>http://blogs.technet.com/evand/rsscomments.aspx?PostID=1620387</wfw:comment><description>&lt;P&gt;&lt;EM&gt;It turns out that my TechEd Exchange Scripting with PowerShell session was recorded to video, and now it's available for all to download (no more having to provide TechEd credentials!). Link below on the session title to the video of my session and to the rest of the sessions they've just released!&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;IMG height=174 src="http://blogs.technet.com/blogfiles/evand/WindowsLiveWriter/EvansTechEdsessionvideo_950E/clip_image001.jpg" width=231 border=0 mce_src="http://blogs.technet.com/blogfiles/evand/WindowsLiveWriter/EvansTechEdsessionvideo_950E/clip_image001.jpg"&gt;&lt;IMG height=173 src="http://blogs.technet.com/blogfiles/evand/WindowsLiveWriter/EvansTechEdsessionvideo_950E/clip_image002.jpg" width=229 border=0 mce_src="http://blogs.technet.com/blogfiles/evand/WindowsLiveWriter/EvansTechEdsessionvideo_950E/clip_image002.jpg"&gt; 
&lt;P&gt;&lt;A href="http://www.microsoft.com/emea/itsshowtime/sessionh.aspx?videoid=542" mce_href="http://www.microsoft.com/emea/itsshowtime/sessionh.aspx?videoid=542"&gt;&lt;B&gt;Microsoft Windows PowerShell Scripting for Microsoft Exchange Server 2007&lt;/B&gt;&lt;/A&gt; 
&lt;P&gt;&lt;B&gt;Evan Dodds&lt;/B&gt;, Program Manager, Microsoft Corporation 
&lt;P&gt;&lt;B&gt;Level:&lt;/B&gt; 300 
&lt;P&gt;This session covers the new Windows PowerShell-based Exchange cmdline and scripting interface. Learn how to convert your multiple page Visual Basic and COM scripts to mere one-liners in Exchange 2007. We cover the basics of the management shell, as well as the underlying design and key concepts. Additionally, we go into more depth on how to build larger scripts that can be used to automate small, medium, as well as enterprise business scenarios. 
&lt;P&gt;&lt;B&gt;Link to list of all Tech Ed 2007 Recorded Sessions for ITs Showtime:&lt;/B&gt; 
&lt;P&gt;&lt;A href="http://www.microsoft.com/emea/itsshowtime/result_search.aspx?event=65&amp;amp;x=10&amp;amp;y=3" mce_href="http://www.microsoft.com/emea/itsshowtime/result_search.aspx?event=65&amp;amp;x=10&amp;amp;y=3"&gt;http://www.microsoft.com/emea/itsshowtime/result_search.aspx?event=65&amp;amp;x=10&amp;amp;y=3&lt;/A&gt;&lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=1620387" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/evand/archive/tags/Exchange+2007/default.aspx">Exchange 2007</category><category domain="http://blogs.technet.com/evand/archive/tags/Powershell/default.aspx">Powershell</category></item><item><title>DynamicDistributionGroup for all users in a particular storage group</title><link>http://blogs.technet.com/evand/archive/2007/07/05/dynamicdistributiongroup-for-all-users-in-a-particular-storage-group.aspx</link><pubDate>Fri, 06 Jul 2007 01:45:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:1449804</guid><dc:creator>evand</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.technet.com/evand/comments/1449804.aspx</comments><wfw:commentRss>http://blogs.technet.com/evand/commentrss.aspx?PostID=1449804</wfw:commentRss><wfw:comment>http://blogs.technet.com/evand/rsscomments.aspx?PostID=1449804</wfw:comment><description>&lt;P&gt;Lots of people are asking lots of questions at the &lt;A href="http://www.exchangeninjas.com/" mce_href="http://www.exchangeninjas.com/"&gt;ExchangeNinjas wiki&lt;/A&gt;! Glad to see so much participation both from within the Exchange team and also from the broad Exchange community!!&lt;/P&gt;
&lt;P&gt;This question struck me as pretty interesting, so I figured I'd surface it on the blog as well as answering it (a few weeks ago) on the wiki... From the wiki's &lt;A href="http://www.exchangeninjas.com/RecipientManagementFAQs" mce_href="http://www.exchangeninjas.com/RecipientManagementFAQs"&gt;Recipient Management FAQs&lt;/A&gt; page (originally was posted to the &lt;A href="http://www.exchangeninjas.com/askaquestion" mce_href="http://www.exchangeninjas.com/askaquestion"&gt;Ask a Question&lt;/A&gt; page) :&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;Q: I want to create a custom dynamic distribution group for all users in a storage group. I can get the user if I use: get-mailbox | where {$_.Database -like "*&amp;lt;SGName&amp;gt;*"} &lt;BR&gt;&lt;/STRONG&gt;&lt;STRONG&gt;BUT this doesn't work for a new DDG :&lt;BR&gt;new-DynamicDistributionGroup -alias test1a -name test1a -recipientfilter {Database -like "*SG01-SUKMSDMBX03*"} -org exchorg.local &lt;BR&gt;&lt;/STRONG&gt;&lt;STRONG&gt;I get no members!&amp;nbsp;&amp;nbsp; It will work on a per server basis, but this it no good for me.&amp;nbsp; Can you help?&amp;nbsp; Is this possible?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;BR&gt;A: The problem is that the "Database" filter can't do partial string matches, because underneath this property is actually a distinguished name value in the AD (which can't do substring matching). Building an infrastructure that allows you to direct email to mailboxes on a storage group is definitely possible -- just not like this. Instead, you need to ensure you're using the full distinguished name for each database you want to compare against, and not using wildcards (ie, asterisk *)&lt;/P&gt;
&lt;P&gt;There's an easy way to do this and a hard way. The hard way I'll just talk about, then I'll show you the easy way. The hard way would be to iterate through all of the MDBs in your selected storage group, concatenating a filter-parser string made up of their DNs... with appropriately placed "-or" operators between. Then pass this string into the New-DDG cmdlet as the RecipientFilter. Yuck. 
&lt;P&gt;The easy way is to create a DDG for each mailboxdatabase. Then create a DistributionGroup (doesn't have to be DDG) and add all of these per-MDB DDGs into the DG. Here's how that might look: 
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;new-distributiongroup DG-MySg1 -Type Distribution -SamAccountName DG-MySg1&lt;BR&gt;get-mailboxdatabase -Server Srv1 -StorageGroup MySG1 | % { New-DynamicDistributionGroup "DDG-$($_.Name)" -RecipientFilter "Database -eq '$($_.Identity.DistinguishedName)'"&amp;nbsp;} | % { Add-DistributionGroupMember DG-MySg1 -Member $_.Identity }&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;Updated July10: Added -Server switch to make it a more real-world syntax.&lt;/EM&gt;&lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=1449804" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/evand/archive/tags/Exchange+2007/default.aspx">Exchange 2007</category><category domain="http://blogs.technet.com/evand/archive/tags/Powershell/default.aspx">Powershell</category></item><item><title>Evan's TechEd 2007 Wrapup</title><link>http://blogs.technet.com/evand/archive/2007/06/25/evan-s-teched-2007-wrapup.aspx</link><pubDate>Mon, 25 Jun 2007 17:20:49 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:1334910</guid><dc:creator>evand</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.technet.com/evand/comments/1334910.aspx</comments><wfw:commentRss>http://blogs.technet.com/evand/commentrss.aspx?PostID=1334910</wfw:commentRss><wfw:comment>http://blogs.technet.com/evand/rsscomments.aspx?PostID=1334910</wfw:comment><description>&lt;p&gt;I realized this week that all of the sessions (and video recordings of each session -- I didn't even realize they were recording ALL of the sessions!) are available online. This means even if you ended up double-booked for two interesting sessions and had to choose just ONE in person, you can still review the deck and the video for the session you missed. Of course, that means you probably don't need to see &lt;em&gt;my&lt;/em&gt; sessions, since you &lt;em&gt;SURELY&lt;/em&gt; chose to see those in person and missed the OTHER, conflicting session. Right? :)&lt;/p&gt; &lt;p&gt;Anyway, here are the links to sessions I participated in this year. I think you may have to be signed in to the TechEd site to get through to these (and note that if you're signed in, you can get to these directly by selecting "Content Downloads &amp;amp; Recordings" in the left of the screen).&lt;/p&gt; &lt;ul&gt; &lt;li&gt;UNC200 - Exchange 2007 Overview (&lt;a href="https://www.msteched.com/viewrecordedsession.aspx?code=UNC200"&gt;Video&lt;/a&gt;). I did a short Exchange+PowerShell demo toward the end of Terry's overview talk.&lt;/li&gt; &lt;li&gt;UNC212R - Managing Exchange 2007&amp;nbsp; (&lt;a href="https://downloads.eventpoint.com/teched2007/slides/UNC212R_Dodds.pptx?ticket=36a87e9c-af17-4cb2-981d-f77d6cf9dc2b&amp;amp;id=3039ab8f-eeeb-4674-8093-65ad86b5b7cf"&gt;PPT&lt;/a&gt; and &lt;a href="https://www.msteched.com/viewrecordedsession.aspx?code=UNC212R"&gt;Video&lt;/a&gt;). I covered the Friday morning repeat of the GUI+PowerShell talk.&lt;/li&gt; &lt;li&gt;UNC309 - Exchange 2007 Automation (&lt;a href="https://downloads.eventpoint.com/teched2007/slides/UNC309_Dodds.pptx?ticket=a227e3bb-b610-482b-9b36-4b56a685a523&amp;amp;id=bb027257-3177-4050-b8fe-3ee729770838"&gt;PPT&lt;/a&gt; and &lt;a href="https://www.msteched.com/viewrecordedsession.aspx?code=UNC309"&gt;Video&lt;/a&gt;). This is the Exchange+PowerShell session. There was also a 75min Q&amp;amp;A "Interactive Theatre" afterward, which was not recorded.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Also, I think the PowerShell session is going to be on the ITSShowtime site at some point in the near future as well. I'll post the link when it is up.&lt;/p&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=1334910" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/evand/archive/tags/Exchange+2007/default.aspx">Exchange 2007</category><category domain="http://blogs.technet.com/evand/archive/tags/Powershell/default.aspx">Powershell</category></item><item><title>Validation (and DirectoryEntry) demo from TechEd 2007</title><link>http://blogs.technet.com/evand/archive/2007/06/18/validation-and-directoryentry-demo-from-teched-2007.aspx</link><pubDate>Mon, 18 Jun 2007 17:38:46 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:1268000</guid><dc:creator>evand</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.technet.com/evand/comments/1268000.aspx</comments><wfw:commentRss>http://blogs.technet.com/evand/commentrss.aspx?PostID=1268000</wfw:commentRss><wfw:comment>http://blogs.technet.com/evand/rsscomments.aspx?PostID=1268000</wfw:comment><description>&lt;p&gt;I didn't get a chance to do this demo in my Exchange Automation with PowerShell session at Teched 2007, mostly due to time. However, I had a conversation with someone prior to my talk and I said that I'd cover it at some point. Well, let's cover it here in the blog and call it done. :)&lt;/p&gt; &lt;p&gt;The point of this blog/demo is primarily to show how Exchange 2007 object validation works, and how to use the powerful validation programmatically. A secondary benefit of this demo is that in order to "hack up" the object to get validation to fail, the most effective way is to use an LDAP DirectoryEntry object... so you get a brief view into how to do this as well. Hopefully together or separate these things are useful to you!&lt;/p&gt; &lt;p&gt;Ok, let's set the stage. Here's a simple mailbox object:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;[PS] C:\&amp;gt;get-mailbox user1 | ft *quota* &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;ProhibitSendQuo ProhibitSendRec UseDatabaseQuot IssueWarningQuo RulesQuota&lt;br&gt;ta&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eiveQuota&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; aDefaults ta&lt;br&gt;--------------- --------------- --------------- --------------- ----------&lt;br&gt;unlimited&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unlimited&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; True 2GB&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 64KB&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Next, let's set some quota values on it so we have a baseline:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="courier new" size="2"&gt;[PS] C:\&amp;gt;set-mailbox user1 -UseDatabaseQuotaDefaults:$false&lt;br&gt;&lt;/font&gt; &lt;p&gt;&lt;font face="courier new" size="2"&gt;[PS] C:\&amp;gt;set-mailbox user1 -ProhibitSendQuota 800kb&lt;br&gt;Set-Mailbox : The value of property 'ProhibitSendQuota' must be greater than or&amp;nbsp;equal to that of property 'IssueWarningQuota'. ProhibitSendQuota: '800KB', IssueWarningQuota: '2GB'.&lt;br&gt;At line:1 char:12&lt;br&gt;+ set-mailbox&amp;nbsp; &amp;lt;&amp;lt;&amp;lt;&amp;lt; user1 -ProhibitSendQuota 800kb&lt;/font&gt; &lt;p&gt;&lt;font face="courier new" size="2"&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Oh yeah, that won't work. We have logic in place to ensure that ProhibitSendQuota is always the same size or larger than IssueWarningQuota. Set-mailbox won't let us violate this rule.&amp;nbsp;We still have a valid mailbox object at this point, because no ProhibitSendQuota value was written to the mailbox object (and we can easily confirm it's still valid):&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="courier new" size="2"&gt;[PS] C:\&amp;gt;(get-mailbox user1).IsValid&lt;br&gt;True&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;But this demo is about validation FAILING; let's hack it so it'll fail!&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;[PS] C:\&amp;gt;$a = new-object System.DirectoryServices.DirectoryEntry "LDAP://$((get-mailbox user1).DistinguishedName)"&lt;br&gt;[PS] C:\&amp;gt;$a.psbase.invokeset("mDBOverQuotaLimit",900*1024)&lt;br&gt;[PS] C:\&amp;gt;$a.psbase.CommitChanges()&lt;br&gt;[PS] C:\&amp;gt;Get-Mailbox user1 &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ServerName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProhibitSendQuo&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ta&lt;br&gt;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ----------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ---------------&lt;br&gt;user1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; user1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e12&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 900MB&lt;br&gt;WARNING: Object e12dom.local/Users/user1 has been corrupted and it is in an inconsistent state. The following validation errors have been encountered:&lt;br&gt;WARNING: The value of property 'ProhibitSendQuota' must be greater than or equal to that of property 'IssueWarningQuota'. ProhibitSendQuota: '900MB', IssueWarningQuota: '2GB'.&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Quick digression to talk about what we did here... we created a new LDAP DirectoryEntry object as $a. Then we updated one of the values (LDAP attribute mDBOverQuotaLimit) with the InvokeSet method. Finally, we saved the updated DirectoryEntry object with CommitChanges(). There are some useful references for how to use DirectoryEntry objects (including some explanation about psbase, etc) on the net. I blogged it &lt;a href="http://blogs.technet.com/evand/archive/2007/03/08/benp-s-guide-to-stuff-today-ad.aspx"&gt;here&lt;/a&gt;, pointing to &lt;a href="http://blogs.technet.com/benp/archive/2007/03/05/benp-s-basic-guide-to-managing-active-directory-objects-with-powershell.aspx"&gt;BenP's post&lt;/a&gt;... that's probably the best place to start.&lt;/p&gt; &lt;p&gt;Anyway, back to the demo. We've now, evidently, succeeded in "hacking" the mailbox object into an invalid state. We got an error back telling us just what's wrong. And as a person, we can read the error, slap our forehead, and fix it up with a proper Set-mailbox operation that resets the proper quota relationship (note, you won't be able to make any other writes to this object through Set-Mailbox cmdlet until you fixup the Quota values).&lt;/p&gt; &lt;p&gt;But, what if you want to do it programmatically? You're in a script or whatever. Surely there has to be a way to check if an object is valid during the processing of a script? Well, of course there is. We've already used it just above... let's try it again now:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;[PS] C:\&amp;gt;(Get-mailbox user1).IsValid&lt;br&gt;WARNING: Object e12dom.local/Users/user1 has been corrupted and it is in an inconsistent state. The following validation errors have been encountered:&lt;br&gt;WARNING: The value of property 'ProhibitSendQuota' must be greater than or equal to that of property 'IssueWarningQuota'. ProhibitSendQuota: '900MB', IssueWarningQuota: '2GB'.&lt;br&gt;False&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;And, since it's a boolean result, we can test it with if(), etc. Very powerful. &lt;p&gt;But we can go even one step further... what if I want to test if an object is valid before I even try to change the values? Great example of this one is now that I have an invalid object, I can't change any other properties on the object until I fix the invalid values (and make it valid again). So maybe my script should be super-smart and "test out" setting some value to see if it'll make the object valid before I try to write it back: &lt;blockquote&gt; &lt;p&gt;&lt;font face="courier new" size="2"&gt;[PS] C:\&amp;gt;$b = get-mailbox user1&lt;br&gt;WARNING: Object e12dom.local/Users/user1 has been corrupted and it is in an inconsistent state. The following validation errors have been encountered:&lt;br&gt;WARNING: The value of property 'ProhibitSendQuota' must be greater than or equal to that of property 'IssueWarningQuota'. ProhibitSendQuota: '900MB', IssueWarningQuota: '2GB'.&lt;br&gt;[PS] C:\&amp;gt;$b.validate() | fl description &lt;/font&gt; &lt;p&gt;&lt;font face="courier new" size="2"&gt;Description : The value of property 'ProhibitSendQuota' must be greater than or&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; equal to that of property 'IssueWarningQuota'. ProhibitSendQuota&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : '900MB', IssueWarningQuota: '2GB'. &lt;/font&gt; &lt;p&gt;&lt;font face="courier new" size="2"&gt;[PS] C:\&amp;gt;$b.ProhibitSendQuota = "unlimited"&lt;br&gt;[PS] C:\&amp;gt;$b.validate() | fl description&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;em&gt;&amp;lt;----- Note, nothing is returned here because the $b instance/object is valid now&lt;/em&gt;&lt;br&gt;[PS] C:\&amp;gt;$b.isvalid&lt;br&gt;True&lt;br&gt;[PS] C:\&amp;gt;set-mailbox -Instance $b&lt;br&gt;[PS] C:\&amp;gt;(get-mailbox user1).isvalid&lt;br&gt;True&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;So, you can see how this could be useful to "test the waters" in your scripts as you read/write/change objects. For instance, try the same sequence I used just above to set $b.ProhibitSendQuota back to "800kb" and you'll find it lets you do it... right up until you try to save the instance back with Set-Mailbox cmdlet. "Testing the water" with IsValid and Validate() can help you programmatically avoid this sort of error!&lt;/p&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=1268000" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/evand/archive/tags/Exchange+2007/default.aspx">Exchange 2007</category><category domain="http://blogs.technet.com/evand/archive/tags/Powershell/default.aspx">Powershell</category></item><item><title>SMTP .net object demo from my TechEd 2007 PowerShell session</title><link>http://blogs.technet.com/evand/archive/2007/06/11/smtp-net-object-demo-from-my-teched-2007-powershell-session.aspx</link><pubDate>Tue, 12 Jun 2007 02:38:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:1220140</guid><dc:creator>evand</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.technet.com/evand/comments/1220140.aspx</comments><wfw:commentRss>http://blogs.technet.com/evand/commentrss.aspx?PostID=1220140</wfw:commentRss><wfw:comment>http://blogs.technet.com/evand/rsscomments.aspx?PostID=1220140</wfw:comment><description>&lt;P&gt;&lt;A href="http://blogs.technet.com/evand/archive/2007/06/06/post-session-at-teched-2007.aspx#1203367" mce_href="http://blogs.technet.com/evand/archive/2007/06/06/post-session-at-teched-2007.aspx#1203367"&gt;Wolfgang requested a reprint&lt;/A&gt; of the details from the "SMTP Demo" part of my TechEd talk last week. Here is (roughly) the transcript of the steps, and my comments interspersed...&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;[PS] C:\&amp;gt;$dl = Get-DistributionGroup SomeGroup&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Ok, now we've got $dl variable&amp;nbsp;loaded up with a distribution group object.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;[PS] C:\&amp;gt;$dladdr = $dl.PrimarySmtpAddress.ToString()&lt;BR&gt;[PS] C:\&amp;gt;$dladdr&lt;BR&gt;SomeGroup@somedomain.com&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;And we've extracted the SMTP address from this group into the $dladdr variable.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;[PS] C:\&amp;gt;$smtpclient = new-object System.Net.Mail.SmtpClient E12Server1, 587&lt;BR&gt;[PS] C:\&amp;gt;$smtpclient 
&lt;P&gt;Host : E12Server1&lt;BR&gt;Port : 587&lt;BR&gt;UseDefaultCredentials : False&lt;BR&gt;Credentials : &lt;BR&gt;Timeout : 100000&lt;BR&gt;ServicePoint : System.Net.ServicePoint&lt;BR&gt;DeliveryMethod : Network&lt;BR&gt;PickupDirectoryLocation : &lt;BR&gt;EnableSsl : False&lt;BR&gt;ClientCertificates : {} &lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Created a DotNet object (thanks PowerShell!!) of &lt;A class="" href="http://msdn2.microsoft.com/en-us/library/system.net.mail.smtpclient.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/system.net.mail.smtpclient.aspx"&gt;System.Net.Mail.SmtpClient&lt;/A&gt; type. This sort of usability is a big part of why PowerShell is so wicked cool! 
&lt;BLOCKQUOTE&gt;
&lt;P&gt;[PS] C:\&amp;gt;$cred = get-credential domain\exadmin&lt;BR&gt;[PS] C:\&amp;gt;$cred 
&lt;P&gt;UserName Password&lt;BR&gt;-------- --------&lt;BR&gt;e12dom\exadmin System.Security.SecureString 
&lt;P&gt;[PS] C:\&amp;gt;$smtpclient.Credentials = $cred.GetNetworkCredential()&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Save off a credential variable we can use in a moment (we'll need to authenticate to the connector since it's configured for basic auth and no anonymous relay).&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;[PS] C:\&amp;gt;$smtpclient.Send("exadmin@somedomain.com", $dladdr, "Welcome", "New list created.")&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;And... voila! Email is sent! 
&lt;P&gt;&lt;EM&gt;Now, challenge for the reader -- can you take these steps and build out a "mail-storm" script? I'd love to see your results on this idea posted here in the comments or at &lt;/EM&gt;&lt;A href="http://www.exchangeninjas.com/" mce_href="http://www.exchangeninjas.com/"&gt;&lt;EM&gt;http://www.exchangeninjas.com/&lt;/EM&gt;&lt;/A&gt;&lt;EM&gt; wiki! Or any other cool variations or uses for this sort of functionality that you can come up with.&lt;/EM&gt;&lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=1220140" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/evand/archive/tags/Exchange+2007/default.aspx">Exchange 2007</category><category domain="http://blogs.technet.com/evand/archive/tags/Powershell/default.aspx">Powershell</category></item><item><title>Post-Session at TechEd 2007</title><link>http://blogs.technet.com/evand/archive/2007/06/06/post-session-at-teched-2007.aspx</link><pubDate>Wed, 06 Jun 2007 20:51:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:1164066</guid><dc:creator>evand</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.technet.com/evand/comments/1164066.aspx</comments><wfw:commentRss>http://blogs.technet.com/evand/commentrss.aspx?PostID=1164066</wfw:commentRss><wfw:comment>http://blogs.technet.com/evand/rsscomments.aspx?PostID=1164066</wfw:comment><description>&lt;P&gt;Thanks to all those die-hards who attended UNC309 session&amp;nbsp;this morning at 8:30am, and to those who spent some time at the "Interactive Theatre" (ie - chalk-talk) session afterward for Q&amp;amp;A, much appreciated!&lt;/P&gt;
&lt;P&gt;The session seemed to go fairly well, although even with placing a clock up on the presenter station to keep me on pace, I still ended up running a little long (and had to drop a couple of the more involved demos). 75 minutes just isn't enough time to demo the entirety of the greatness that is PowerShell+Exchange! At least not without talking &lt;EM&gt;EVEN FASTER&lt;/EM&gt; than I already, naturally do! &lt;/P&gt;
&lt;P&gt;So, in any case, sorry to the folks who I'd talked with before hand about the validation demo and using DirectoryEntry objects... I'll plan to post something up here on this topic in the near future since we didn't get to the demo in the breakout session.&lt;/P&gt;
&lt;P&gt;After the primary session (PPT+Demos), we ended up back in the TLC area at "Green Threatre #5" for another 75 mins or so which we used directly for Q&amp;amp;A. Sorry to anyone who didn't find space in the theatre area - we ended up with quite a big crowd for this session, spilling out of the theatre, so I suspect it might have been hard to hear/see what was going on!&amp;nbsp;Thanks to all for the great questions asked, and also to &lt;A href="http://www.nsoftware.com/" mce_href="http://www.nsoftware.com/"&gt;/n Software&lt;/A&gt; (Booth 1149 - check out their NetCmdlets product!) for the &lt;FONT color=#0000ff&gt;&amp;gt;_&lt;/FONT&gt; stickers we handed out as freebies for asking questions during this session!&lt;/P&gt;
&lt;P&gt;I'm going to step back and strategize what are the best couple of posts I can draw from the questions asked, demos skipped, etc. I'll try to post some good stuff here over the next week or so to wrap up.&amp;nbsp;If you have any suggestions -- questions you didn't get to ask, things you thought of during lunch, whatever... please feel free to post here in the comments or send me an email!&lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=1164066" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/evand/archive/tags/Exchange+2007/default.aspx">Exchange 2007</category><category domain="http://blogs.technet.com/evand/archive/tags/Powershell/default.aspx">Powershell</category></item><item><title>TechEd 2007, Day 1: Exchange 2007 Overview</title><link>http://blogs.technet.com/evand/archive/2007/06/04/teched-2007-day-1-exchange-2007-overview.aspx</link><pubDate>Mon, 04 Jun 2007 23:55:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:1145163</guid><dc:creator>evand</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/evand/comments/1145163.aspx</comments><wfw:commentRss>http://blogs.technet.com/evand/commentrss.aspx?PostID=1145163</wfw:commentRss><wfw:comment>http://blogs.technet.com/evand/rsscomments.aspx?PostID=1145163</wfw:comment><description>&lt;P&gt;The first Exchange breakout session this morning served as a bit of an "Exchange 2007 Keynote" talk, with our General Manager &lt;A href="http://msexchangeteam.com/archive/2005/06/07/405992.aspx" mce_href="http://msexchangeteam.com/archive/2005/06/07/405992.aspx"&gt;Terry Myerson&lt;/A&gt; doing the delivery. He covered E2k7's features and characteristics end-to-end in 75 mins, and had a couple of us help out with demos to dig in on a few areas (Unified Messaging, OWA, SysMgmt/PowerShell).&lt;/P&gt;
&lt;P&gt;I covered the last of these three demos with a slimmed down version of my PowerShell opener demo that I'll be doing in my &lt;A href="http://blogs.technet.com/evand/archive/2007/05/29/teched-2007.aspx" mce_href="http://blogs.technet.com/evand/archive/2007/05/29/teched-2007.aspx"&gt;Wednesday Session&lt;/A&gt;. Now I'm super jazzed about the Wednesday talk; It's a shame it's not until Wednesday!&lt;/P&gt;
&lt;P&gt;Here are the details for those of you who are here in Orlando:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;UNC309: Microsoft Windows PowerShell Scripting for Microsoft Exchange Server 2007&lt;/STRONG&gt;&lt;BR&gt;Wednesday, June 6th&lt;BR&gt;&lt;EM&gt;Bright-and-early &lt;/EM&gt;AM (ie - 8:30-9:45am)&lt;BR&gt;Location: &lt;STRONG&gt;&lt;FONT color=#0000ff&gt;S220 D&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Some emails and comments on the previous post asking whether the outcome of the session will be posted afterward. I'll probably post some debrief from the session, and I know that the TechEd A/V staff are also planning to record the session. That said, I'm not sure what they'll do with the recording...? If it turns up online or somewhere I can link to, I'll be sure to do so.&lt;/P&gt;
&lt;P&gt;Thanks everyone for your interest and hope you can make it on Wednesday (there's still time to get your plane ticket). :)&lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=1145163" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/evand/archive/tags/Exchange+2007/default.aspx">Exchange 2007</category><category domain="http://blogs.technet.com/evand/archive/tags/Powershell/default.aspx">Powershell</category></item><item><title>TechEd 2007</title><link>http://blogs.technet.com/evand/archive/2007/05/29/teched-2007.aspx</link><pubDate>Tue, 29 May 2007 17:22:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:1080052</guid><dc:creator>evand</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.technet.com/evand/comments/1080052.aspx</comments><wfw:commentRss>http://blogs.technet.com/evand/commentrss.aspx?PostID=1080052</wfw:commentRss><wfw:comment>http://blogs.technet.com/evand/rsscomments.aspx?PostID=1080052</wfw:comment><description>&lt;p&gt;Wow, time sure flies. No posts since end of April; sorry about that! I'm (more or less) caught back up at work from these crazy few weeks (months?) just passed, and I'm even just returning from a week vacation... raring to go!&lt;/p&gt;&lt;a href="http://go.microsoft.com/?linkid=6369334"&gt;&lt;img src="http://techedbloggers.net/Images/Flair/teched07_180x200_v2k.jpg" align="left" border="0"&gt;&lt;/a&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;So what's next? Well... this is a short week, and then next week (June 4-8)&amp;nbsp;is &lt;a href="http://www.microsoft.com/events/teched2007/default.mspx" mce_href="http://www.microsoft.com/events/teched2007/default.mspx"&gt;TECHED&lt;/a&gt; in Orlando!&lt;/p&gt; &lt;p&gt;&lt;a href="http://go.microsoft.com/?linkid=6369334"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;I'll be down there to spend some time at the Exchange booth ("Technical Learning Center") and meet some of you folks, and also to present a breakout session and chalk talk on Exchange automation/scripting with PowerShell!&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Here are&amp;nbsp;the &lt;a href="http://www.msteched.com/public/sessions.aspx?categories=Exchange%20Server" mce_href="http://www.msteched.com/public/sessions.aspx?categories=Exchange%20Server"&gt;session details&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;UNC309 - Microsoft Windows PowerShell Scripting for Microsoft Exchange Server 2007&lt;br&gt;Track(s)&lt;/strong&gt;: Unified Communications&lt;br&gt;&lt;strong&gt;Level&lt;/strong&gt;: 300&lt;br&gt;&lt;strong&gt;Speaker(s)&lt;/strong&gt;: Evan Dodds  &lt;p&gt;This session covers the new Windows PowerShell-based Exchange cmdline and scripting interface. Learn how to convert your multiple page Visual Basic and COM scripts to mere one-liners in Exchange 2007. We cover the basics of the management shell, as well as the underlying design and key concepts. Additionally, we go into more depth on how to build larger scripts that can be used to automate small, medium, as well as enterprise business scenarios.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;This is a great deck/presentation with great demos, so it should definitely be fun! Hope to see you there!&lt;/p&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=1080052" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/evand/archive/tags/Exchange+2007/default.aspx">Exchange 2007</category><category domain="http://blogs.technet.com/evand/archive/tags/Powershell/default.aspx">Powershell</category></item><item><title>Exchange cmdlets from C#</title><link>http://blogs.technet.com/evand/archive/2007/04/03/exchange-cmdlets-from-c.aspx</link><pubDate>Wed, 04 Apr 2007 02:57:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:724514</guid><dc:creator>evand</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.technet.com/evand/comments/724514.aspx</comments><wfw:commentRss>http://blogs.technet.com/evand/commentrss.aspx?PostID=724514</wfw:commentRss><wfw:comment>http://blogs.technet.com/evand/rsscomments.aspx?PostID=724514</wfw:comment><description>&lt;P&gt;Vivek had originally posted about how to do some basic Exchange cmdlet access&amp;nbsp;from C# -- several months before E2k7 released: &lt;A class="" href="http://www.viveksharma.com/TECHLOG/archive/2006/07/27/sample-code-calling-exchange-cmdlets-from-net-code.aspx" mce_href="http://www.viveksharma.com/TECHLOG/archive/2006/07/27/sample-code-calling-exchange-cmdlets-from-net-code.aspx"&gt;Calling Exchange Cmdlets from .Net Code&lt;/A&gt;.&amp;nbsp;However, by the time we released, some things had changed in the technique and Vivek's examples were out of date.&lt;/P&gt;
&lt;P&gt;Recently, someone pointed me to the updated UE docs that explain how to do this sort of process: &lt;A href="http://msdn2.microsoft.com/en-us/library/bb332449.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/bb332449.aspx"&gt;Using Exchange Management Shell Commands With Managed Code&lt;/A&gt;. Good stuff, everyone likes UE documentation that's officially out on Technet.&lt;/P&gt;
&lt;P&gt;But then, best of all, the other day &lt;A href="http://knicksmith.blogspot.com/" mce_href="http://knicksmith.blogspot.com/"&gt;Nick&lt;/A&gt; posted his analysis of doing recipient management wrappers in C#: &lt;A title="Managing Exchange 2007 Recipients with C#" href="http://knicksmith.blogspot.com/2007/03/managing-exchange-2007-recipients-with.html" mce_href="http://knicksmith.blogspot.com/2007/03/managing-exchange-2007-recipients-with.html"&gt;Managing Exchange 2007 Recipients with C#&lt;/A&gt;. This post is a great roll-up of all the stuff you need to know to get this working properly with Exchange 2007 RTM and a bunch of usage examples. Sweet!&lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=724514" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/evand/archive/tags/Exchange+2007/default.aspx">Exchange 2007</category><category domain="http://blogs.technet.com/evand/archive/tags/Powershell/default.aspx">Powershell</category></item><item><title>Exchange Connections Spring 2007</title><link>http://blogs.technet.com/evand/archive/2007/03/28/exchange-connections-spring-2007.aspx</link><pubDate>Wed, 28 Mar 2007 17:45:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:705656</guid><dc:creator>evand</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/evand/comments/705656.aspx</comments><wfw:commentRss>http://blogs.technet.com/evand/commentrss.aspx?PostID=705656</wfw:commentRss><wfw:comment>http://blogs.technet.com/evand/rsscomments.aspx?PostID=705656</wfw:comment><description>&lt;P&gt;I'll be presenting at Exchange Connections (Spring/April 2007) conference at 9:30am on&amp;nbsp;&lt;A href="http://www.devconnections.com/shows/images/brochurepdfs/Sp07_Exch_Schedv1.pdf" mce_href="http://www.devconnections.com/shows/images/brochurepdfs/Sp07_Exch_Schedv1.pdf"&gt;Monday, April 2nd, during "Microsoft Day"&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Here's the session abstract:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;B&gt;EMS05:&amp;nbsp;Managing Exchange Server 2007: The New Exchange Management Console and Shell&lt;/B&gt;&lt;BR&gt;&lt;A href="http://www.devconnections.com/default.asp?c=2&amp;amp;s=94&amp;amp;i=1853" mce_href="http://www.devconnections.com/default.asp?c=2&amp;amp;s=94&amp;amp;i=1853"&gt;&lt;B&gt;Evan&amp;nbsp;Dodds&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;Imagine having a toolset that is flexible enough to easily deploy and administer a single Exchange server and yet powerful enough to completely automate those same actions for hundreds of servers. Yes, you heard right, Exchange Server 2007 will deliver a new intuitive GUI experience allowing you to quickly provision Exchange functionality while the new command-line experience will allow you to automate your world. This session is loaded with demonstrations showing off the new Exchange 2007 toolset and also highlights the underpinnings of this new revolutionary architecture which is built on the groundbreaking Windows PowerShell technology.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;This is an Exchange 2007&amp;nbsp;"system management" session (covering both Console GUI and the Management Shell) so there'll be some good demos and views into the Exchange 2007 sysmgmt changes from both perspectives. &lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Added bonus&lt;/EM&gt;: I'm going to be using a beta SP1 machine for my demos, so you'll get a chance to see some of the cool, new SP1 GUI too. &lt;/P&gt;
&lt;P&gt;Hope to see you there!&lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=705656" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/evand/archive/tags/Exchange+2007/default.aspx">Exchange 2007</category><category domain="http://blogs.technet.com/evand/archive/tags/Powershell/default.aspx">Powershell</category></item></channel></rss>