Thanks Michael, this will help out.



On Fri, Jun 25, 2010 at 7:59 AM, Michael B. Smith <mich...@smithcons.com>wrote:

>  Here are the “guts” out of a minimal (very minimal) PowerShell host. Note
> that this code is not production quality (it doesn’t have any anti-injection
> protection). But it should get you started, and starts out with references.
>
>
>
> // references:
>
> //
>
> // [appdomain]::currentdomain.getassemblies() | sort -property fullname |
> format-table fullname -- for assemblies in web.config
>
> // http://blogs.msdn.com/powershell/Default.aspx?p=3 -- regarding
> impersonation
>
> // http://www.thescripts.com/forum/thread416915.html -- regarding
> assemblies
>
> // http://msdn2.microsoft.com/en-us/library/bfyb45k1.aspx -- assemblies
> element definition
>
> //
> http://forums.microsoft.com/TechNet/ShowPost.aspx?PostID=2097064&SiteID=17-- 
> embedded PowerShell command execution
>
> //
> http://knicksmith.blogspot.com/2007/03/managing-exchange-2007-recipients-with.html--
>  exchange management shell wrapper class
>
> // http://www.leastprivilege.com/HostingPowerShellInASPNET.aspx -- the
> original basic script
>
>
>
> protected void _btnInvoke_Click (object sender, EventArgs e)
>
> {
>
>                 bool processResults;
>
>                 PipelineReader<object> errorList;
>
>                 Runspace rs;
>
>                 Pipeline cmd;
>
>                 Collection<PSObject> results;
>
>                 StringBuilder sb;
>
>
>
>                 rs  = GetRunspace();
>
>                 cmd = rs.CreatePipeline(_txtCommand.Text);
>
>                 sb  = new StringBuilder();
>
>
>
>                 results        = null;
>
>                 processResults = true;
>
>
>
>                 try
>
>                 {
>
>                                 results = cmd.Invoke();
>
>                 }
>
>                 catch
> (System.Management.Automation.CommandNotFoundException)
>
>                 {
>
>                                 sb.AppendLine("The command you entered is
> not recognized as a cmdlet, function, operable program, or script file.
> Verify the command and try again.");
>
>                                 sb.AppendLine();
>
>                                 processResults = false;
>
>                 }
>
>                 catch
> (System.Management.Automation.ParameterBindingException)
>
>                 {
>
>                                 sb.AppendLine("An error exists in the
> parameters provided to the command you entered.");
>
>                                 sb.AppendLine();
>
>                                 processResults = false;
>
>                 }
>
>
>
>                 if (processResults)
>
>                 {
>
>                                 sb.AppendLine("Command: " +
> _txtCommand.Text);
>
>                                 sb.AppendLine();
>
>
>
>                                 foreach (PSObject ps in results)
>
>                                 {
>
>
> sb.AppendLine(ps.ToString());
>
>                                 }
>
>
>
>                                 errorList = cmd.Error;
>
>                                 if (errorList.Count > 0)
>
>                                 {
>
>                                                 sb.AppendLine();
>
>                                                 sb.AppendLine("Error(s):");
>
>                                                 sb.AppendLine();
>
>                                                 foreach (object error in
> errorList.ReadToEnd())
>
>                                                 {
>
>
> sb.AppendLine(error.ToString());
>
>                                                 }
>
>                                 }
>
>
>
>                                 sb.AppendLine();
>
>                 }
>
>
>
>                 _txtOutput.Text += sb.ToString();
>
>                 cmd = null;
>
> }
>
>
>
> protected Runspace GetRunspace()
>
> {
>
>                 if (Cache["rs"] == null)
>
>                 {
>
>                                 Runspace rs =
> RunspaceFactory.CreateRunspace();
>
>                                 rs.Open();
>
>                                 Cache["rs"] = rs;
>
>                 }
>
>
>
>                 return (Runspace)Cache["rs"];
>
> }
>
>
>
> Regards,
>
>
>
> Michael B. Smith
>
> Consultant and Exchange MVP
>
> http://TheEssentialExchange.com <http://theessentialexchange.com/>
>
>
>
> *From:* mck1012 [mailto:mck1...@gmail.com]
> *Sent:* Friday, June 25, 2010 12:09 AM
>
> *To:* MS-Exchange Admin Issues
> *Subject:* Re: .Net Programming for Exchange 2010
>
>
>
> Would someone be able to post some of their code so others an use as a
> reference. I am trying to learn c# for this exact reason and some samples
> would be great. The
>
>
>
>
>
>
>
> On Thu, Jun 24, 2010 at 4:40 PM, Michael B. Smith <mich...@smithcons.com>
> wrote:
>
> Just kind-of reinforcing what Rob said, with a bit more detail.
>
>
>
> Exchange System Objects (XSO) are the internal Exchange interfaces
> represented via Microsoft.Exchange.*. Except for a handful of documentation
> on data formats, XSO is undocumented. Given how reflection works in the CLR,
> obviously quite a bit is discoverable. Using that undocumented information
> isn’t a good idea. The interfaces change DRAMATICALLY from release to
> release and may change from service pack to service pack. Since they are
> undocumented, Microsoft doesn’t have to keep them compatible.
>
>
>
> There are three supported ways to interface to Exchange 2010: MAPI
> (challenging, not legally accessible from managed code, but very powerful),
> Exchange Web Services (EWS, very much about user mailboxes and address
> books, not about system management), and PowerShell (all about management).
>
>
>
> There are some exceptions, but basic MAPI is very consistent, ever since
> Exchange 5.5. EWS is somewhat new (Exchange 2007 sp1), but I think that all
> code written since then is compatible with the current implementation, and
> Exchange 2010 adds some new features. PowerShell had breaking changes going
> from 2007 -> 2010, but I don’t think anything broke between 2007 <-> 2007
> sp1 <-> 2007 sp2. There may be a breaking change in 2010 going to sp1 in one
> of the DAG cmdlets, but if so, it was necessary.
>
>
>
> Writing a PowerShell host is fairly simple. It only requires a few dozen
> lines of C#. You can, of course, also call complex Windows Forms and Windows
> Presentation Format windowing objects from within PowerShell, since it is a
> fairly well-behaved .NET environment (I’ve taught workshops in doing this
> and this is, I believe, what Rob did himself). From within the PowerShell
> host, you load the Exchange profile (just like the Exchange Management
> Shell) and off you go… This is exactly what the Exchange Management Console
> does.
>
>
>
> You can even have the PowerShell host as a web page (although that requires
> the application pool to have an Exchange administrator as an Identity – not
> something to be done lightly). This is what Remote PowerShell does (in
> combination with Windows Remote Management).
>
>
>
> Regards,
>
>
>
> Michael B. Smith
>
> Consultant and Exchange MVP
>
> http://TheEssentialExchange.com <http://theessentialexchange.com/>
>
>
>
> *From:* Paul Steele [mailto:paul.ste...@acadiau.ca]
> *Sent:* Thursday, June 24, 2010 3:01 PM
>
>
> *To:* MS-Exchange Admin Issues
> *Subject:* .Net Programming for Exchange 2010
>
>
>
> I like to write simple C#-based GUI utilities for my staff to simplify some
> of the repetitive tasks such as creating accounts. Now that we’ve upgraded
> to Exchange 2010 I have a few utilities that need updating. I’ve been doing
> some Google searches for sample programs and the examples refer to a class
> library Microsoft.Exchange. Unfortunately I haven’t been able to find where
> this class is located in order to add it to my Visual Studio Project. There
> are a lot of built-in Microsoft.* components in the reference library, but
> not Microsoft.Exchange. I’ve looked on the Exchange installation media and
> also checked on MSDN but don’t see anything there. Does anyone know where I
> can find the components needed for .Net programming for Exchange 2010?
>
>
> Thanks!
>
>
>
>
>

Reply via email to