User login

Windows Powershell Team Blog

Syndicate content
Blog of Windows PowerShell team. Improving the world one-liner at a time.
Updated: 15 years 39 weeks ago

SQL Use of MiniShells

Mon, 06/23/2008 - 02:58

The SQL team has been receiving a lot of bashing lately over some of the decisions they made integrating PowerShell into SQL 2008.  I thought I would take a couple minutes to clarify a few things, eat some sin and talk about a constructive engagement model between the community and the feature teams implementing PowerShell cmdlets.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

First let me declare my long standing admiration for the SQL team.  Those superstars have consistently been one of the teams that really GOT what it meant to release software for production environments.  They have a great quality culture and process and they have top-shelf leadership that reinforces this across the board.  SQL has been the gold standard of great scripting because their GUIs produce scripts that you could harvest for reuse (yes it wasn't full coverage but they GOT IT years before anyone else).  They are a great team - full stop.

The majority of the heartburn has come from SQL's use of MiniShells.  A MiniShell is a non-extensible version of PowerShell with a set of baked in Cmdlets and providers.  Some of my best community friends have pointed to SQL's use of MiniShells as evidence that they "don't get it".  This is not correct.  I told the SQL team about MiniShells and recommended that they use them because I thought they were a good fit for the sort of production-oriented value proposition they provide their customers.  So direct your criticisms at me on this one.

First let's talk about MiniShells and why they exist.  During the Vista reset, there was a great deal of anxiety about .NET versioning and general angst about instability arising from plugin models where code coming from the various sources run in the same process.  Imagine the case where you load plugins from 10 different sources and then something goes wrong - who is responsible?  Who do you call for support?  MiniShells allow teams to address these issues by creating fixed execution environments that built in our labs and fully tested/verified before release.  If you have a problem with a SQL PowerShell and call PSS, the first thing they are going to do is to have you try to reproduce the problem using the SQL MiniShell.   (NOTE:  In my experience, 9 out of 10 times that you have a problem with multiple plugins in a process comes from bad memory management  - a problem largely [but not completely] managed out of existence by the CLR.)

The problem is not that SQL shipped a MiniShell but rather that there are SQL UX scenarios that use the MiniShell instead of a general purpose PowerShell.  The SQL Management Studio GUI has context menus which launch their MiniShell.  This is where we made a mistake.  By definition, this is an escape out to an environment to explore and/or perform ad hoc operations.  This environment does not benefit from the tight production promises that a MiniShell provides, in fact it is hampered by them.  Because the MiniShell is a closed environment, you can't even manually add snap-ins.  This is what sent people’s meters into the red - and understandably so. 

Sadly it is too late to make this change for SQL 2008 but the SQL team will change this at their next opportunity.  In the meantime, when you are at the MiniShell prompt, you can just launch regular PowerShell with a console file that contains whatever snapins you want to use (including the SQL snapins - they can be added to a PowerShell session).  Clearly this is less than optimal but it is not onerous either.  We are working with the SQL team on the PowerShel V2 designs to make sure that we can offer teams like SQL the safety/production quality they need while providing the customers the flexibility they want.

 

Let's take a minute and talk about the engagement model.  I've encouraged the community to complain loudly when we screw up and aren't giving you want you want/need.  No one benefits by you suffering in silence.  In that regard, I can say that the MiniShell firestorm has been a big success.  That said, for complaints to be actionable, they need to arrive in time to be acted upon.  I'm sure that someone can point to a blog or email somewhere that pointed this out a long time ago but the reality is that it didn't pop as a problem until recently and now it is going to have to wait until the next cycle to get fixed.  The good news is that the community feedback mechanism works, we just need to improve the timing.

One last note about tone.  I've often joked that complaints were critical and politeness was desirable but optional (in other words, I'd rather get a rude complaint than polite silence).  Let me take a moment to tweak that guidance a little.  PowerShell is our passion and our day jobs and we'll endure almost anything to get the information we need to make this the best product ever.  So that engagement model is totally applicable to the PowerShell team.  That said, PowerShell is not the feature teams day jobs.  In the case of the SQL team, it was a stretch goal pursued because of the passion of a small set of individuals (Michiel Wories in particular).  The bottom line is that it is still critical to complain but when you complain about the feature team's support of PowerShell, just double check the tone and try make it constructive.  Above all, let them know that you appreciate their efforts (just don’t get so wrapped up that you forget to include the complaint J)

Cheers!

Jeffrey Snover [MSFT]
Windows Management Partner Architect
Visit the Windows PowerShell Team blog at:    http://blogs.msdn.com/PowerShell
Visit the Windows PowerShell ScriptCenter at:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

 

Getting Credentials From The Command Line

Fri, 06/20/2008 - 21:09

When you use the Get-Credential cmdlet, you get a GUI dialog box to enter the credentials.  This is the "Common Criteria Certified" way of handling credentials.  It is also a pain in the butt at times.  If you are an admin, you can alter this and request credentials via the command line as follows:

 

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />PS> $key = "HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds"
PS> Set-ItemProperty $key ConsolePrompting True
PS> Get-Credential

cmdlet Get-Credential at command pipeline position 1
Supply values for the following parameters:
Credential
User: ntdev\jsnover
Password for user ntdev\jsnover: **************


UserName                                                           Password
--------                                                           --------
ntdev\jsnover                                  System.Security.SecureString

 

Enjoy!

 

Jeffrey Snover [MSFT]
Windows Management Partner Architect
Visit the Windows PowerShell Team blog at:    http://blogs.msdn.com/PowerShell
Visit the Windows PowerShell ScriptCenter at:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Group Policy Health Cmdlet

Fri, 06/20/2008 - 03:06

SDMSoftware has just released a Group Policy Health Cmdlet HERE.

They have a great, high-quality, 9 minute DEMO VIDEO showing what the cmdlet does and how to work it.

Nice stuff.

Jeffrey Snover [MSFT]
Windows Management Partner Architect
Visit the Windows PowerShell Team blog at:    http://blogs.msdn.com/PowerShell
Visit the Windows PowerShell ScriptCenter at:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Windows PowerShell Virtual User Group Meeting #6 - June 24th.

Thu, 06/19/2008 - 17:57

Marco Shaw is hosting the 6th PowerShell Virtual User Group meeting on June 24th. (See http://marcoshaw.blogspot.com/2008/06/windows-powershell-virtual-user-group.html for details and sign-up). He has graciously allowed Wassim and I to present some of the new post-CTP2 things that the PowerShell team is working on. This should be an excellent opportunity to see the latest and greatest and also to provide us with feedback on these new features.

I'm going to be talking about the new Modules feature in PowerShell V2. Modules are essentially a replacement for the old V1 snap-in concept. We haven't talked a lot about modules in public yet so I asked Marco for a chance to remedy that.  JayKul had a blog posting http://huddledmasses.org/powershell-modules/ a while back that has pretty good coverage of what's in CTP2 so I'll be looking at what we expect to see in the final product.

Wassim Fayed will be presenting an update on remoting, including some new and advanced features that will be in the final product.

 

Hope to see you all there!

-bruce

-----------------------------------------------------

Bruce Payette, Principal Developer, Windows PowerShell Team

Push-Noun

Thu, 06/19/2008 - 12:34

We looked at a lot of CLI models when designing PowerShell.  One of them was netsh.  One of the things I had a love/hate relationship with was netsh's use of context.  In netsh, you can set context via navigation and then you don't need to provide that context on the command line.  For instance you navigate into the FIREWALL and then you perform a set of operations and you don't need to say that you are working on the firewall because it picks it up from the context.

I thought I would experiment with this a little this morning.  I don't know if this is useful or not but it shows a couple of interesting scripting techniques so I thought I would share it anyway.  This is PUSH-NOUN.PS1.  You can push a NOUN context and then you don't need to specify that noun for the first command in a command sequence - you just specify the verb.  You type "?" for help,  "exit" to exit and "! cmd" to escape and execute a command directly.  The examples will make it more clear. 

First the code:

# Push-Noun.ps1
# Sets a context which allows you to work on a noun similar to the way NETSH does
# WORKS WITH V1
param($noun)
while ($true)
{
    Write-Host "[$Noun]> " -NoNewLine
    $line = $host.UI.ReadLine().trim()
    switch ($line)
    {
    "exit"   {return}
    "quit"   {return}
    "?"      {Get-Command "*-$Noun" |ft Verb,Definition -Auto |out-host}
    {$_.StartsWith("!")}
             {
                $Cmd = $_.SubString(1)
                Invoke-Expression $cmd |out-host
             }
    default  {
                $Verb,$args = $Line.Split()
                $Cmd = "$verb-$Noun $args"
                Invoke-Expression $cmd |out-host
             }
    }
}

Now let's run it:


PS> .\push-noun service
[service]> ?

Verb    Definition
----    ----------
Get     Get-Service [[-Name] <String[]>] [-ComputerName <String[]>] [-Include <String
New     New-Service [-Name] <String> [-BinaryPathName] <String> [-DisplayName <String
Restart Restart-Service [-Name] <String[]> [-Force] [-PassThru] [-Include <String[]>]
Resume  Resume-Service [-Name] <String[]> [-PassThru] [-Include <String[]>] [-Exclude
Set     Set-Service [-Name] <String> [-DisplayName <String>] [-Description <String>]
Start   Start-Service [-Name] <String[]> [-PassThru] [-Include <String[]>] [-Exclude
Stop    Stop-Service [-Name] <String[]> [-Force] [-PassThru] [-Include <String[]>]
Suspend Suspend-Service [-Name] <String[]> [-PassThru] [-Include <String[]>]


[service]> get a*

Status   Name               DisplayName
------   ----               -----------
Running  AeLookupSvc        Application Experience
Running  ALG                Application Layer Gateway Service
Stopped  Appinfo            Application Information
Running  AppMgmt            Application Management
Running  AudioEndpointBu... Windows Audio Endpoint Builder
Running  Audiosrv           Windows Audio


[service]> get |where {$_.name -match "^A" -AND $_.Status -eq "stopped"}
Status   Name               DisplayName
------   ----               -----------
Stopped  Appinfo            Application Information


[service]> !gps *ss

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    673       8     2308       6636    70     6.75    492 csrss
    539       7    16044      21460   190   149.98    540 csrss
   1633      16    11040      17680    68    67.47    656 lsass
    866       5     3976       5720    33     2.56    548 psxss
     33       1      312        760     5     0.08    428 smss


[service]> exit
PS>

Note that given the mechanisms we have, this only really works with the first command in the sequence.  Image that you wanted to do something like:

PS> Get | where {$_.name -match $test} |STOP

Where STOP did not have to specify the NOUN.  You really can't do that today.  We have been thinking about exposing a TOKEN-NOT-RESOLVED event which would call a user-defined function which would allow you to do runtime fixups.  If we had that mechanism in place, you could do this.   Hmmmmmm.

Enjoy!

Jeffrey Snover [MSFT]
Windows Management Partner Architect
Visit the Windows PowerShell Team blog at:    http://blogs.msdn.com/PowerShell
Visit the Windows PowerShell ScriptCenter at:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

PowerShell V1 and V2 Running On WS08 Server Core

Wed, 06/18/2008 - 15:32

Yup- that's right.  Check it out at superstar Karl Prosser's blog HERE.  He even has a video of it working.

The blog is somewhat of a tease in that he is going to wait till tomorrow to tell us how he did it. 

I'm constantly amazed by what the community can do if you give them the right tools!

Thanks Karl!

Jeffrey Snover [MSFT]
Windows Management Partner Architect
Visit the Windows PowerShell Team blog at:    http://blogs.msdn.com/PowerShell
Visit the Windows PowerShell ScriptCenter at:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

When Will PowerShell V2 Ship?

Tue, 06/17/2008 - 15:53

By far, the most frequently asked question at TechEd 2008 was, "When will PowerShell V2 Ship?".  We are expressly prohibited from answering that question and I know that that can be frustrating.  I can say this:

We are now feature complete with V2.  History has shown that when we reach this stage of development, it takes us a year, plus or minus a quarter, before it is generally available.

Let me be quick to add that past performance is NOT an guarantee of future performance.  At the end of the day, we have an extensive quality process and the community lets us know when it is ready to ship.

The second most frequently asked question was, "When is the next CTP?".  We have not booked a plan for that yet.  That said, people have observed that we have often tried to coordinate important things with IT Forum in Nov.

Cheers!

Jeffrey Snover [MSFT]
Windows Management Partner Architect
Visit the Windows PowerShell Team blog at:    http://blogs.msdn.com/PowerShell
Visit the Windows PowerShell ScriptCenter at:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Windows, PowerShell and WMI - Unveiling Microsoft's Best Kept Secret

Tue, 06/17/2008 - 15:43

I mentioned that one of my favorite TechEd 2008 talks was Ben Pearce's talk, "Windows, PowerShell and WMI - Unveiling Microsoft's Best Kept Secret". 

Attached is Ben's presentation.  You can get his demos at the following locations:

http://blogs.technet.com/benp/archive/2008/06/12/tech-ed-2008-demo-1-administering-windows.aspx<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

http://blogs.technet.com/benp/archive/2008/06/12/tech-ed-2008-demo-2-administering-servers-in-bulk.aspx

http://blogs.technet.com/benp/archive/2008/06/12/tech-ed-2008-demo-3-how-do-i-know-which-classes-to-use.aspx

http://blogs.technet.com/benp/archive/2008/06/12/tech-ed-2008-demo-4-administering-hyper-v.aspx

http://blogs.technet.com/benp/archive/2008/06/12/tech-ed-2008-demo-5-administering-failover-clustering.aspx

Enjoy!

Jeffrey Snover [MSFT]
Windows Management Partner Architect
Visit the Windows PowerShell Team blog at:    http://blogs.msdn.com/PowerShell
Visit the Windows PowerShell ScriptCenter at:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Explaining Objects To Non-Programmers

Tue, 06/17/2008 - 13:13

One of my favorite TechEd 2008 talks was Ben Pearce's talk, "Windows, PowerShell and WMI - Unveiling Microsoft's Best Kept Secret".  It was a great talk all up but the one thing I walked away saying, "I've got to steal that", was Ben's explaining of Objects.

Anyone that has every tried to explain PowerShell to friends or co-workers will inevitably come across a look of fear and panic when you mention the word "Object".  I've seen it hundreds of times.  I explain how objects actually simplify the problem but after seeing Ben's talk, I realized that the problem might be that some people don't even know what an object IS.  Here are Ben's slides for how to explain objects (and arrays of objects) to people that don't understand them.

I've also attached the PPT slides so you can use them as well.

10,000 thanks to superstar Ben Pearce - you really moved the ball forward with this one!

Jeffrey Snover [MSFT]
Windows Management Partner Architect
Visit the Windows PowerShell Team blog at:    http://blogs.msdn.com/PowerShell
Visit the Windows PowerShell ScriptCenter at:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Working With Web Services (Post CTP2 V2 Feature)

Sat, 06/14/2008 - 18:55

Let me start by first apologizing for sharing some information that you are not going to be able to go out and try right away.  During one of the interactive Q&A sessions at TechEd, people asked about working with Web Services.  I referred to a feature that we were working on and then Hal Rottenberg asked me to blog about some of the details.  I'm not sure that this is a good idea because while we have it coded up and in the nightly builds, that is not a guarantee that it will make it into the next version (we often have to cut features in order to create bandwidth to increase the quality of other features).  That said, I'm going to go out on the limb a bit and share with you what we are working on.

First let's start with motivation (you should always start with motivation.  If you know WHY someone  is doing something, it is easier to get things in focus and provide meaningful feedback).  PowerShell is ALL about helping you get your job done with the minimal amount of effort (I've been thinking about calling this the "Cheap EATs" model where EAT stands for "Effort to Accomplish Task").   With that comes the observation that we live in an evolving world.  To accomplish your task, you need to easily access a wide range of technologies.  That is why we invest in giving you great access to WMI, ADSI, COM, XML, .NET, ADO, etc etc.  More and more things are now available as Web Services so we want to make it easy for you to get at them as well. 

As such, we have speced and implemented the cmdlet:  New-WebServiceProxy.    This command connects to a Web Service and generates a .NET proxy to that service.  Let me show you how it works using a web service which works with USZIP codes (http://www.webservicex.net/uszip.asmx ):

PS> $ws=New-WebServiceProxy -uri http://www.webservicex.net/uszip.asmx?WSDL
PS> # NOTE - the output of the next command was edited for clarity
PS> Get-Command New-WebServiceProxy -Syntax
New-WebServiceProxy [-Uri] <Uri> [[-Class] <String>] [[-Namespace] <String>]

New-WebServiceProxy [-Uri] <Uri> [[-Class] <String>] [[-Namespace] <String>]
[-Credential <PSCredential>]

New-WebServiceProxy [-Uri] <Uri> [[-Class] <String>] [[-Namespace] <String>]
[-UseDefaultCredential]


PS> $ws=New-WebServiceProxy -uri http://www.webservicex.net/uszip.asmx?WSDL
PS> $ws | get-Member


   TypeName: Microsoft.PowerShell.Commands.NewWebserviceProxy.Autogenerated
Types.WebServiceProxy4979207ebservicex_net_uszip_asmx_WSDL.USZip

Name                                 MemberType Definition
----                                 ---------- ----------
Disposed                             Event      System.EventHandler Disp...
Abort                                Method     System.Void Abort()
BeginGetInfoByAreaCode               Method     System.IAsyncResult Begi...
BeginGetInfoByCity                   Method     System.IAsyncResult Begi...
BeginGetInfoByState                  Method     System.IAsyncResult Begi...
BeginGetInfoByZIP                    Method     System.IAsyncResult Begi...
CreateObjRef                         Method     System.Runtime.Remoting....
Discover                             Method     System.Void Discover()
Dispose                              Method     System.Void Dispose()
EndGetInfoByAreaCode                 Method     System.Xml.XmlNode EndGe...
EndGetInfoByCity                     Method     System.Xml.XmlNode EndGe...
EndGetInfoByState                    Method     System.Xml.XmlNode EndGe...
EndGetInfoByZIP                      Method     System.Xml.XmlNode EndGe...
Equals                               Method     System.Boolean Equals(Ob...
GetHashCode                          Method     System.Int32 GetHashCode()
GetInfoByAreaCode                    Method     System.Xml.XmlNode GetIn...
GetInfoByCity                        Method     System.Xml.XmlNode GetIn...
GetInfoByState                       Method     System.Xml.XmlNode GetIn...
GetInfoByZIP                         Method     System.Xml.XmlNode GetIn...
GetLifetimeService                   Method     System.Object GetLifetim...
GetType                              Method     System.Type GetType()
InitializeLifetimeService            Method     System.Object Initialize...
ToString                             Method     System.String ToString()
AllowAutoRedirect                    Property   System.Boolean AllowAuto...
ClientCertificates                   Property   System.Security.Cryptogr...
ConnectionGroupName                  Property   System.String Connection...
Container                            Property   System.ComponentModel.IC...
CookieContainer                      Property   System.Net.CookieContain...
Credentials                          Property   System.Net.ICredentials ...
EnableDecompression                  Property   System.Boolean EnableDec...
PreAuthenticate                      Property   System.Boolean PreAuthen...
Proxy                                Property   System.Net.IWebProxy Pro...
RequestEncoding                      Property   System.Text.Encoding Req...
Site                                 Property   System.ComponentModel.IS...
SoapVersion                          Property   System.Web.Services.Prot...
Timeout                              Property   System.Int32 Timeout {ge...
UnsafeAuthenticatedConnectionSharing Property   System.Boolean UnsafeAut...
Url                                  Property   System.String Url {get;s...
UseDefaultCredentials                Property   System.Boolean UseDefaul...
UserAgent                            Property   System.String UserAgent ...


PS> $ws.GetInfoByZIP(98072)

xmlns                                 Table
-----                                 -----
                                      Table


PS> $ws.GetInfoByZIP(98072).Table


CITY      : Woodinville
STATE     : WA
ZIP       : 98072
AREA_CODE : 425
TIME_ZONE : P

 

PS> $ws.GetInfoByAreaCode(425).table |ft -auto

CITY              STATE ZIP   AREA_CODE TIME_ZONE
----              ----- ---   --------- ---------
Snoqualmie        WA    98065 425       P
Woodinville       WA    98072 425       P
Bellevue          WA    98004 425       P
Bellevue          WA    98005 425       P
Bellevue          WA    98006 425       P
Bellevue          WA    98007 425       P
Bellevue          WA    98008 425       P
Bellevue          WA    98009 425       P
Bellevue          WA    98015 425       P
Bothell           WA    98011 425       P
Bothell           WA    98012 425       P
Bothell           WA    98021 425       P
Bothell           WA    98041 425       P
Bothell           WA    98082 425       P
Carnation         WA    98014 425       P
Duvall            WA    98019 425       P
Edmonds           WA    98020 425       P
Edmonds           WA    98026 425       P
Everett           WA    98201 425       P
Everett           WA    98203 425       P
Everett           WA    98204 425       P
Everett           WA    98205 425       P
Everett           WA    98206 425       P
Everett           WA    98207 425       P
Everett           WA    98208 425       P
Hobart            WA    98025 425       P
Issaquah          WA    98027 425       P
Issaquah          WA    98029 425       P
Kirkland          WA    98033 425       P
Kirkland          WA    98034 425       P
Kirkland          WA    98083 425       P
Lake Stevens      WA    98258 425       P
Lynnwood          WA    98036 425       P
Lynnwood          WA    98037 425       P
Lynnwood          WA    98046 425       P
Maple Valley      WA    98038 425       P
Medina            WA    98039 425       P
Mountlake Terrace WA    98043 425       P
Mukilteo          WA    98275 425       P
North Bend        WA    98045 425       P
Preston           WA    98050 425       P
Ravensdale        WA    98051 425       P
Redmond           WA    98052 425       P
Redmond           WA    98053 425       P
Redmond           WA    98073 425       P
Renton            WA    98055 425       P
Renton            WA    98056 425       P
Renton            WA    98057 425       P
Renton            WA    98058 425       P
Renton            WA    98059 425       P


Enjoy!

Jeffrey Snover [MSFT]
Windows Management Partner Architect
Visit the Windows PowerShell Team blog at:    http://blogs.msdn.com/PowerShell
Visit the Windows PowerShell ScriptCenter at:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Block Comments in V2

Sat, 06/14/2008 - 14:29

Smith Catar was looking at my Tech Ed demos and noticed that I used block comments.  These are not in the CTP that you have so I guess I sorta let this one leak out.  Yes - V2 will have BLOCK COMMENTS!!!

Block comments start with "<# and end with "#>".  e.g.

<# 
This is
a
block comment
#>

Happy happy. 
Block comments - you asked for them, you'll get them. 

Jeffrey Snover [MSFT]
Windows Management Partner Architect
Visit the Windows PowerShell Team blog at:    http://blogs.msdn.com/PowerShell
Visit the Windows PowerShell ScriptCenter at:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Get-OSSku.ps1

Sat, 06/14/2008 - 03:56

Nitin Bhat the WMI PM recently pointed HERE to answer the question, how do know what OS SKU a machine is running?

You can run the expression $((gwmi win32_operatingsystem).OperatingSystemSKU) to the the value and then look it up on that table.

I decided to turn it into a script you can use.  It is rock-simple but it saves you the typing and there's some value in that.  I've included it below and attached it as well.

Jeffrey Snover [MSFT]
Windows Management Partner Architect
Visit the Windows PowerShell Team blog at:    http://blogs.msdn.com/PowerShell
Visit the Windows PowerShell ScriptCenter at:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

$sku = $((gwmi win32_operatingsystem).OperatingSystemSKU)
switch ($sku)
{
    0       {"Undefined";break}
    1       {"Ultimate Edition";break}
    2       {"Home Basic Edition";break}
    3       {"Home Basic Premium Edition";break}
    4       {"Enterprise Edition";break}
    5       {"Home Basic N Edition";break}
    6       {"Business Edition";break}
    7       {"Standard Server Edition";break}
    8       {"Datacenter Server Edition";break}
    9       {"Small Business Server Edition";break}
    10       {"Enterprise Server Edition";break}
    11       {"Starter Edition";break}
    12       {"Datacenter Server Core Edition";break}
    13       {"Standard Server Core Edition";break}
    14       {"Enterprise Server Core Edition";break}
    15       {"Enterprise Server Edition for Itanium-Based Systems";break}
    16       {"Business N Edition";break}
    17       {"Web Server Edition";break}
    18       {"Cluster Server Edition";break}
    19       {"Home Server Edition";break}
    20       {"Storage Express Server Edition";break}
    21       {"Storage Standard Server Edition";break}
    22       {"Storage Workgroup Server Edition";break}
    23       {"Storage Enterprise Server Edition";break}
    24       {"Server For Small Business Edition";break}
    25       {"Small Business Server Premium Edition";break}
    default {"<UNKNOWN:$SKU>"}
}

Best of Tech Ed: Breakthrough Product of the year => PowerGUI

Fri, 06/13/2008 - 23:29

The Best of Tech Ed 2008 were awarded and PowerGUI won Breakthrouth Product of the Year

WOW what an honor and acknowledgement of great work!

Congratulations to Dmitry, Kirk and the rest of that team!  You guys have brought a lot of great visibility to Quest Software.  Your bosses should be fetching you cups of coffee and getting you bigger offices  :-)

If you aren't already running PowerGUI - what are you waiting for?

Jeffrey Snover [MSFT]
Windows Management Partner Architect
Visit the Windows PowerShell Team blog at:    http://blogs.msdn.com/PowerShell
Visit the Windows PowerShell ScriptCenter at:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

PowerShell & OpenXML

Fri, 06/13/2008 - 19:53

Eric White just posted an amazing set of Cmdlets on CodePlex.  They allow you to use PowerShell to manipulate OpenXML documents to do all sorts of fun things, like create graphs from the output of PowerShell, automatically generate documents from XML, and extract comments from a document.  Below is an 8-minute video introducing you to the technology and a blog post with more details.


PowerTools for Open XML Introduction
(Video)

Blog:

http://blogs.msdn.com/ericwhite/archive/2008/06/11/processing-open-xml-documents-server-side-using-powershell.aspx

Get PowerTools For Open XML

 

Enjoy,

James Brundage [MSFT]

Yes, But What About The FLAVOR?

Fri, 06/13/2008 - 13:38

 Kirk Munro posted a blog entry HERE saying how thrilled he was at level of presence PowerShell had at TechEd 2008.

It was a VERY good TechEd for PowerShell.  There were lots of breakout sessions, lots of hands on labs and interactive Q&A, lots of vendor support in the exhibit, lots of books, quite a few mentions in keynote demos and presentations.  That was all great but what impressed me the most was the number of people that said how PowerShell had saved their butts, made them heros with their peers or allowed them to do things that they could never do.

It reminded me of this great Iron Chef America episode with Wolfgang Puck.  The show took 3 big name chefs and gave them a surprise ingredient (eggs) they then had 60 minutes to prepare a full course meal that highlighted that ingrediate.  The meals are then served to a panel of judges for comment and evaluation.  When it was Wolfgang's time to be judged, the judges were all raving about the presentation, the wonderful smell, the rainbow of colors.  Wolfgang in a quasi-irritated, quasi-exasperated voice said, "Yes, but what about the FLAVOR?!" 

At the end of the day, if PowerShell didn't save butts, enable heros, an empower new scenarios - it would have been a waste of time and resources.

Jeffrey Snover [MSFT]
Windows Management Partner Architect
Visit the Windows PowerShell Team blog at:    http://blogs.msdn.com/PowerShell
Visit the Windows PowerShell ScriptCenter at:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

 

PowerShell Plus is now official!

Fri, 03/14/2008 - 05:17

PowerShell Plus has now officially released V1.0.  Actually I'm late in my congratulations, they actually released it on March 6th. 

If you haven't checked out PowerShell Plus, you definitely should take advantage of their free 30 day trial and see what you are missing.  This is a really impressive piece of creative engineering.

You can learn more about it HERE.

Congratulations to Karl and Tobias on a job well done!

Jeffrey Snover [MSFT]
Windows Management Partner Architect
Visit the Windows PowerShell Team blog at:    http://blogs.msdn.com/PowerShell
Visit the Windows PowerShell ScriptCenter at:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

New PowerShell Training Options

Thu, 03/13/2008 - 03:48

  The creative guys at Sapien are thinking outside the box again.  They are offing a new hybrid approach to online training for PowerShell.  You sign up for a class and get some self-study materials but you also have an online class that meets twice a week for an hour (you have a choice of a couple of timeslots).  The course runs for 2 to 4 weeks depending upon the topic.  Very clever stuff.  You can find out more at the following links:

www.scriptinganswers.com/training/online
http://www.scriptinganswers.com/training/ilt/

BTW - you probably already know that BillG is a big fan of creative education delivery.  At last year's Technical Recognition Event (TRE), he invited George Lucas to discuss the topic (apparently George is a big fan of this as well). 

This year's TRE was in large part a going away party for Bill.  Bill gave a fantastic talk about his foundation, the challenges ahead both in the SW industry and the world in general.  At some point he started talking about batteries and got super excited saying that he was VERY optimistic about the future of batteries and if you want more you should go watch the MIT Solid State Chemistry lectures which are online on the web.  He even gave us the course # 3.091.  He said, "it's a 35 hour investment but well worth it".   (Professor Sadoway - Bill Gates loved your lectures!)

Now just step back a second and let that sink in.

Bill Gates.

(Once) the richest guy in the world.  Has a family.  Is SUPER hands on (often it feels like HEELS ON :-) ) when it comes to setting the technical direction for the company and keeping track of progress.  Runs one of the largest foundations and is hard core focused on SOLVING (NOT "improving") some of the biggest health problems facing mankind.  All that and he is investing 35 hours watching video lectures about solid state chemistry over the web. 

It blows my mind!

(BTW - I started watching those lectures and the guy is REALLY good.

Also - while we are on the topic of great internet lectures - I loved Lisa Pruitt's Structural Aspects of BioMaterials over at the Berkely site.)

 

Anyway the reason for that diversion is to point out that novel education and training delivery is a growing area and can be quite effective.  I'd love to hear from anyone that takes this training.

Cheers!

Jeffrey Snover [MSFT]
Windows Management Partner Architect
Visit the Windows PowerShell Team blog at:    http://blogs.msdn.com/PowerShell
Visit the Windows PowerShell ScriptCenter at:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Do you want a PowerShell based build environment?

Wed, 03/12/2008 - 01:50

If so SPEAK UP NOW.  The Windows SDK team is looking for feedback on whether this would be useful.  Check out their request for feedback at:  Influence the future of Windows sdk - Powershell based build environment

Jeffrey Snover [MSFT]
Windows Management Partner Architect
Visit the Windows PowerShell Team blog at:    http://blogs.msdn.com/PowerShell
Visit the Windows PowerShell ScriptCenter at:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Highway to PowerShell V2 - WOW

Fri, 03/07/2008 - 18:04

Ragnar Harper is a senior consultant and Advisor at Crayon AS in Norway.  Ragnar is also a big fan of PowerShell.  Recently he won a demo contest putting PowerShell through its paces.  At one point he did an import-csv of a large file and created Active Directory entries.   This took a while so while that was going, he used Guitar Hero and jammed to the following latest and greatest edition of Highway to PowerShell.  This is REALLY good stuff.  Check it out:

http://video.msn.com/video.aspx?mkt=en-us&vid=b75260ae-1736-4b15-8b86-aaef20644e52

10,000 thanks for sharing that Ragnar - you've made my day!

Just wait till you see V2!

Jeffrey Snover [MSFT]
Windows Management Partner Architect
Visit the Windows PowerShell Team blog at:    http://blogs.msdn.com/PowerShell
Visit the Windows PowerShell ScriptCenter at:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx