<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://itbloggen.se/cs/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Björn Österman&amp;#39;s Infrastructural Programming?</title><subtitle type="html" /><id>http://itbloggen.se/cs/blogs/bjrn_stermans_blog/atom.aspx</id><link rel="alternate" type="text/html" href="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/default.aspx" /><link rel="self" type="application/atom+xml" href="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/atom.aspx" /><generator uri="http://communityserver.org" version="4.1.31106.3070">Community Server</generator><updated>2007-06-30T13:43:00Z</updated><entry><title>New CmdLets: New-BOList, Join-BOList</title><link rel="alternate" type="text/html" href="/cs/blogs/bjrn_stermans_blog/archive/2007/08/30/CmdLet-Join-BOList.aspx" /><id>/cs/blogs/bjrn_stermans_blog/archive/2007/08/30/CmdLet-Join-BOList.aspx</id><published>2007-08-30T20:47:00Z</published><updated>2007-08-30T20:47:00Z</updated><content type="html">&lt;p&gt;Hi&lt;/p&gt; &lt;p&gt;PowerShell has a lot of the things one might find i SQL; select, where, group, sum. But one thing it lacks i "JOIN". So I've created 2 new CmdLets, New-BOList and Join-BOList to try to fill that void.&lt;/p&gt; &lt;p&gt;New-BOList is to used place a arbitrary list inside a BOList-object&amp;nbsp;and give it a name.&lt;/p&gt; &lt;p&gt;Join-BOList&amp;nbsp;takes two BOList-objects and joins&amp;nbsp;it's list's based on a script-block which is added as a parameter. The output will be a list of PSObjects, each with 2 properties named after the names of the 2 BOLists.&lt;/p&gt; &lt;p&gt;Join-BOList can be used&amp;nbsp;with the parameters -left, -right, -inner and -outer in the same way SQL works.&lt;/p&gt; &lt;p&gt;"BO" in BOList stands for &lt;strong&gt;B&lt;/strong&gt;jörn &lt;strong&gt;Ö&lt;/strong&gt;sterman and is more an effect of poor imagination than an act of hybris. =). &lt;strong&gt;I would love some feedback about a better name for it.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;You can download&amp;nbsp;BOListCommands from &lt;a href="http://itbloggen.se/cs/files/23/bjorn/entry633.aspx"&gt;here&lt;/a&gt;  &lt;p&gt;&lt;i&gt;Disclaimer: This software is provided "AS IS" with no warranties of any kind. The entire risk arising out of the use or performance of the software is with you.&lt;/i&gt;  &lt;p&gt;Installation:  &lt;ol&gt; &lt;li&gt;&lt;a href="http://itbloggen.se/cs/files/23/bjorn/entry633.aspx"&gt;Download&lt;/a&gt;&amp;nbsp;and install the MSI-packet  &lt;li&gt;Add the CmdLet to the Powershell environment by running:&lt;br&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp; Add-PSSnapIn BOList&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;You need to do the last step everytime you start PowerShell if you don't add it to your PowerShell profile.  &lt;p&gt;So, how can we use it? &lt;/p&gt; &lt;p&gt;One example is comparing 2 directories. The setup is as shown in the picture below:&lt;/p&gt; &lt;p&gt;&lt;img src="http://itbloggen.se/cs/photos/screenshots/images/original/Join_BOList_Example_1.aspx"&gt; &lt;/p&gt; &lt;p&gt;The 2 directories differ both in the names of the files, and in one case the size.&lt;/p&gt; &lt;p&gt;First we use "dir" on each directory to get&amp;nbsp;the list of files and put it inside a BOList-object&lt;/p&gt; &lt;p&gt;&lt;img src="http://itbloggen.se/cs/photos/screenshots/images/original/Join_BOList_Example_2.aspx"&gt;&lt;/p&gt; &lt;p&gt;The next step is&amp;nbsp;to&amp;nbsp;join the two lists, but first I want to explain why we need the BOList-object at all.&lt;/p&gt; &lt;p&gt;Actually, I could have created Join-BOList as Join-List and skipped the the BOList-objects, but I really wanted to give the lists a name, this is because it's going to be used several times, and without the names i would have been forced to use generic names like "a" and "b", or "first" and "second".&lt;/p&gt; &lt;p&gt;Now, this is how we join the lists:&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;img src="http://itbloggen.se/cs/photos/screenshots/images/628/original.aspx"&gt; &amp;nbsp;&lt;/p&gt; &lt;p&gt;Let's start by explaining the command.&lt;/p&gt; &lt;p&gt;The 2 lists are specified as the 2 first arguments. And as the "-where"-argument there's a scriptblock. The scriptblock is executed once for each combination of one row from each list and needs to return a bool&amp;nbsp;indicating&amp;nbsp;whether the&amp;nbsp;2 rows should be joined. Inside the scriptblock there will be 2 variables with the same names as the names we specified for the BOLists.&lt;/p&gt; &lt;p&gt;In the example above, join-bolist returns the files that match each other (by name at least). But it would also be interresting to show that are NOT in both directories.&lt;/p&gt; &lt;p&gt;There are a couple of switches we can use.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;-inner (default)  &lt;li&gt;-left  &lt;li&gt;-right  &lt;li&gt;-outer&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;These work the same way as in SQL. Here's some examples:&lt;/p&gt; &lt;p&gt;&lt;img src="http://itbloggen.se/cs/photos/screenshots/images/original/Join_BOList_Example_4.aspx"&gt;&lt;/p&gt; &lt;p&gt;Here we see all the files missing from&amp;nbsp;the compared directories and also the files existing in both directories. If we want to concentrate on the missing files we can filter them out like this:&lt;/p&gt; &lt;p&gt;&lt;img src="http://itbloggen.se/cs/photos/screenshots/images/original/Join_BOList_Example_5.aspx"&gt; &lt;/p&gt; &lt;p&gt;Now we see the files missing from each directory.&lt;/p&gt; &lt;p&gt;But if&amp;nbsp;we remeber correctly, there are 2 files with the same name but different sizes. Lets change the scriptblock to take that into account:&lt;/p&gt; &lt;p&gt;&lt;img src="http://itbloggen.se/cs/photos/screenshots/images/original/Join_BOList_Example_6.aspx"&gt; &lt;/p&gt; &lt;p&gt;Ah, and there's the file "Pic 064"!&lt;/p&gt; &lt;p&gt;I'll try to get you another example of how you can use it in my next post&lt;/p&gt;&lt;img src="http://itbloggen.se/cs/aggbug.aspx?PostID=634" width="1" height="1"&gt;</content><author><name>bjorn.osterman</name><uri>http://itbloggen.se/cs/members/bjorn.osterman/default.aspx</uri></author></entry><entry><title>PowerShell-pipes and Chunky vs Chatty</title><link rel="alternate" type="text/html" href="/cs/blogs/bjrn_stermans_blog/archive/2007/08/16/604.aspx" /><id>/cs/blogs/bjrn_stermans_blog/archive/2007/08/16/604.aspx</id><published>2007-08-15T23:14:01Z</published><updated>2007-08-15T23:14:01Z</updated><content type="html">&lt;p&gt;Oneliners! I do like them, but no matter how nice those oneliners might look, they sometimes just isn't the best solution.&lt;/p&gt; &lt;p&gt;I'll give you an example:&lt;/p&gt; &lt;p&gt;In my &lt;a href="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/2007/08/15/599.aspx"&gt;last post&lt;/a&gt; where I wrote of using the &lt;a href="http://itbloggen.se/cs/files/23/bjorn/entry597.aspx"&gt;Convert-Username&lt;/a&gt; CmdLet, I decided to put 2 lists of information in separate variables. $adUsers and $qUsers, like this:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&amp;nbsp; $qUsers = get-quota c:\homefolders\* | where { $_.usage -gt .8 }&lt;br&gt;&amp;nbsp; $adUsers = $qUsers |&amp;nbsp;foreach { "MYDOMAIN\$(split-path $_.quotapath -leaf)" } | &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; convert-username -i nt4account -o dn |&amp;nbsp;foreach { [adsi]"LDAP://$($_.Name)" } &lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&amp;nbsp; 0..($qUsers.length-1) |&amp;nbsp;foreach {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $qUser = $qUsers[$_]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $adUser = $adUsers[$_]&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ....&amp;nbsp;&amp;lt;"send an email"-code was here&amp;gt; ....&lt;br&gt;&amp;nbsp; } &lt;/strong&gt; &lt;p&gt;One alternativ to this could have been:  &lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;get-quota c:\homefolders\* | &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where { $_.usage -gt .8 } |&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach { &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; add-member&amp;nbsp;NoteProperty User ([ADSI](convert-username "MYDOMAIN\$(split-path $_.quotapath -leaf)"&amp;nbsp;-i nt4account -o dn)) -pass &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&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;lt;"send an email"-code was here&amp;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;&amp;nbsp; }&lt;/strong&gt;&amp;nbsp; &lt;em&gt;(Disclaimer: I haven't actually tested the code above, but it should work)&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Even though the last example is shorter (I'm not saying easier) and doesn't use any variables, it does come with a performance-penalty.&lt;/p&gt; &lt;p&gt;Before I tell you what that is, I need to explain a few things:&lt;/p&gt; &lt;p&gt;In programming-world there's a&amp;nbsp;notion about Chunky and Chatty code. &lt;/p&gt; &lt;p&gt;The thing is that as soon as you go on to the wire (ie the network) things take time.&amp;nbsp;A Chatty application sends many small requests, paying the performance-penalty many time (no matter how small the requests are). A Chunky application on the other hand builds&amp;nbsp;one big meaty request, paying the penalty only once.&lt;/p&gt; &lt;p&gt;Convert-Username uses the Microsoft API &lt;a href="http://msdn2.microsoft.com/en-us/library/ms675970.aspx"&gt;DsCrackNames&lt;/a&gt; which&amp;nbsp;has the possibility to send a whole bunch of names to the DC/GC and get all those names converted in a single operation. When I created &lt;a href="http://itbloggen.se/cs/files/23/bjorn/entry597.aspx"&gt;Convert-Username&lt;/a&gt;, I wanted to utilize that feature, so when the strings (names) are piped to Convert-Username, it just collects all of them first and then sends&amp;nbsp;one request, thus making Convert-Username a Chunky CmdLet.&lt;/p&gt; &lt;p&gt;The problem&amp;nbsp;with the second code-segment above is that instead of piping all the names to Convert-Username directly, it's used inside a foreach-loop and&amp;nbsp;executed once for every name and by that forcing it to be Chatty.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;So, next time you have a slow running oneliner; think about when things go on the wire and see if you can eliminate some of them.&lt;/p&gt;&lt;img src="http://itbloggen.se/cs/aggbug.aspx?PostID=604" width="1" height="1"&gt;</content><author><name>bjorn.osterman</name><uri>http://itbloggen.se/cs/members/bjorn.osterman/default.aspx</uri></author><category term="PowerShell" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/PowerShell/default.aspx" /><category term="English" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/English/default.aspx" /></entry><entry><title>Fun with Convert-Username</title><link rel="alternate" type="text/html" href="/cs/blogs/bjrn_stermans_blog/archive/2007/08/15/599.aspx" /><id>/cs/blogs/bjrn_stermans_blog/archive/2007/08/15/599.aspx</id><published>2007-08-14T23:28:53Z</published><updated>2007-08-14T23:28:53Z</updated><content type="html">&lt;p&gt;In&amp;nbsp;my &lt;a href="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/2007/08/13/598.aspx"&gt;last blog&lt;/a&gt; I promised&amp;nbsp;that I would do a little more fun example for using the &lt;a href="http://itbloggen.se/cs/files/23/bjorn/entry597.aspx"&gt;Convert-Username CmdLet&lt;/a&gt;. So here goes.  &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Example: How you send a mail to everyone who's homedirectory's FSRM-directory-quota is over 80% &lt;/font&gt;&lt;/strong&gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;First we need to get all the Windows Server 2003 FSRM Directory Quota from the homedirectories. I have an earlier blog about this &lt;a href="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/2007/07/18/536.aspx"&gt;here&lt;/a&gt;.  &lt;p&gt;From the information in that post we can construct a little function that returns the Quota-objects for a specific path  &lt;p&gt;&lt;strong&gt;&amp;nbsp; function Get-Quota ([string] $path) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (New-Object -com "srmsvc.srmquotamanager").EnumQuotas($path) |&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;foreach { add-member -pass -input $_ NoteProperty Usage ($_.QuotaUsed/$_.QuotaLimit) } &lt;br&gt;&amp;nbsp; }&lt;/strong&gt;  &lt;p&gt;To get the quotas where the percentage is over 80% and put that in a variable:  &lt;p&gt;&lt;strong&gt;&amp;nbsp; $qUsers = get-quota c:\homefolders\* | where { $_.usage -gt .8 }&lt;/strong&gt;  &lt;p&gt;Change "C:\homefolders" to where you have your home-directories. If you want to access FSRM Directory Quotas on an other computer look att the bottom of the post I mentioned earlier. &lt;p&gt;The next step is where the Convert-Username magic happens.  &lt;p&gt;&lt;strong&gt;&amp;nbsp; $adUsers = $qUsers |&amp;nbsp;foreach { "MYDOMAIN\$(split-path $_.quotapath -leaf)" } | &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; convert-username -i nt4account -o dn |&amp;nbsp;foreach { [adsi]"LDAP://$($_.Name)" }&lt;/strong&gt;  &lt;p&gt;Lets analyse the command above a little.  &lt;p&gt;First we take the $qUsers-variable and pipe all those to a foreach-command. Inside that command&amp;nbsp;we construct a new string starting with MYDOMAIN. MYDOMAIN have to be replace with the domain-name where&amp;nbsp;your accounts are. Next we use split-path to extract the&amp;nbsp;last part of the path. I am assuming here that the names of the homedirectories is the same as&amp;nbsp;the SAM Account Names of&amp;nbsp;your users.  &lt;p&gt;Next we pipe it to Convert-Username, telling it that the strings (names)&amp;nbsp;that are&amp;nbsp;coming in is of the&amp;nbsp;format "NT4Account" (ie DOMAIN\SAM) and the result we want is the distinguished name of the&amp;nbsp;accounts. And&amp;nbsp;finally we pipe it to a foreach-command that uses the&amp;nbsp;distinguished names to create ADSI-objects.  &lt;p&gt;Here I want to make a little detour:  &lt;p&gt;I really like that part of Convert-Username; that you can get the DN of the user(s). So if want to get a ADSI-object for a specific user and don't want to write a long LDAP-path, you can write this instead:  &lt;p&gt;&lt;strong&gt;$aduser = [ADSI]"LDAP://$((convert-username 'Björn Österman' -o dn).name)"&lt;/strong&gt;  &lt;p&gt;Okey, back to the example...  &lt;p&gt;So far we have 2 arrays. One with quota-information ($qUsers)&amp;nbsp;and one with DirectoryEntries pointing to users ($adUsers). These&amp;nbsp;two arrays will be ordered in the same way. Next we want to iterate through the 2 arrays, fetching the quota and the user that "owns" the directory.  &lt;p&gt;&lt;strong&gt;&amp;nbsp; 0..($qUsers.length-1) |&amp;nbsp;foreach {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $qUser = $qUsers[$_]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $adUser = $adUsers[$_]&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br&gt;&amp;nbsp; }&lt;/strong&gt;  &lt;p&gt;Now inside that foreach-command&amp;nbsp;we have the 2 objects. Lets send some mails.  &lt;p&gt;First create a message object:  &lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $message = new-object "net.mail.mailmessage"&lt;/strong&gt;  &lt;p&gt;Then we add the user as a recipient.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $message.To.Add( (new-object "net.mail.mailaddress" $adUser.mail,$adUser.displayname) )&lt;/strong&gt;  &lt;p&gt;"$adUser.mail" will return the email-address and "$adUser.displayname" will&amp;nbsp;return the&amp;nbsp;fullname.&lt;/p&gt; &lt;p&gt;Next we add a nice subject to the email:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $message.Subject = "Warning: Youre using $($qUser.Usage.ToString('###%')) of your home directory space"&lt;/strong&gt;  &lt;p&gt;The format string '###%' tells ToString() to multiply the number with 100, strip any decimals and place a '%' at the end.&lt;/p&gt; &lt;p&gt;Now add the sender to the message:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $message.From = new-object "net.mail.mailaddress" "admin@company.com","Administrator from Hell"&lt;/strong&gt;  &lt;p&gt;And then send the message:  &lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (new-object "net.mail.smtpclient" "mymailserver").send($message)&lt;/strong&gt;  &lt;p&gt;"mymailserver" has to be changed to mail-server of your choice.  &lt;p&gt;Thats it!, just put it all together in function like this:  &lt;p&gt;&amp;nbsp; &lt;/p&gt; &lt;table cellspacing="0" cellpadding="2"&gt;  &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;font face="Courier New"&gt;function Warn-WastingUsers { &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&amp;nbsp; function Get-Quota ([string] $path) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (New-Object -com "srmsvc.srmquotamanager").EnumQuotas($path) |&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;foreach { add-member -pass -input $_ NoteProperty Usage ($_.QuotaUsed/$_.QuotaLimit) } &lt;br&gt;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&amp;nbsp; $qUsers = get-quota c:\homefolders\* | where { $_.usage -gt .8 }&lt;br&gt;&amp;nbsp; $adUsers = $qUsers |&amp;nbsp;foreach { "MYDOMAIN\$(split-path $_.quotapath -leaf)" } | &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; convert-username -i nt4account -o dn |&amp;nbsp;foreach { [adsi]"LDAP://$($_.Name)" } &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&amp;nbsp; 0..($qUsers.length-1) |&amp;nbsp;foreach {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $qUser = $qUsers[$_]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $adUser = $adUsers[$_] &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $message = new-object "net.mail.mailmessage"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $message.To.Add( (new-object "net.mail.mailaddress" $adUser.mail,$adUser.displayname) )&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $message.Subject = "Warning: Youre using $($qUser.Usage.ToString('##%')) of your home directory space"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $message.From = new-object "net.mail.mailaddress" "admin@company.com","Administrator from Hell"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (new-object "net.mail.smtpclient" "mymailserver").send($message)&lt;br&gt;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;img src="http://itbloggen.se/cs/aggbug.aspx?PostID=599" width="1" height="1"&gt;</content><author><name>bjorn.osterman</name><uri>http://itbloggen.se/cs/members/bjorn.osterman/default.aspx</uri></author><category term="PowerShell" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/PowerShell/default.aspx" /><category term="English" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/English/default.aspx" /></entry><entry><title>New CmdLet: Convert-Username</title><link rel="alternate" type="text/html" href="/cs/blogs/bjrn_stermans_blog/archive/2007/08/13/598.aspx" /><id>/cs/blogs/bjrn_stermans_blog/archive/2007/08/13/598.aspx</id><published>2007-08-13T09:28:31Z</published><updated>2007-08-13T09:28:31Z</updated><content type="html">&lt;p&gt;Hi&lt;/p&gt; &lt;p&gt;I've created a CmdLet called Convert-Username. It's a wrapper around the Microsoft API DsCrackNames, that can be used to translate between different username formats by sending the request to a DC or GC. &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.chrisse.se/"&gt;Chrisse Andersson&lt;/a&gt; uses the API in his &lt;a href="http://blogs.chrisse.se/blogs/chrisse/pages/fine-grain-password-policy-tool.aspx"&gt;MMC-Console for Fine Grained Password Policies&lt;/a&gt;&amp;nbsp;and I thougth it could be very useful having as an CmdLet.&lt;/p&gt; &lt;p&gt;The list of Formats you can convert between is:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;DN  &lt;li&gt;NT4Account  &lt;li&gt;DisplayName  &lt;li&gt;Guid  &lt;li&gt;CanonicalName  &lt;li&gt;Upn  &lt;li&gt;CanonicalNameEx&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;li&gt;Spn  &lt;li&gt;Sid&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;You can download&amp;nbsp;Convert-Username from &lt;a href="http://itbloggen.se/cs/files/23/bjorn/entry597.aspx"&gt;here&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;i&gt;Disclaimer: This software is provided "AS IS" with no warranties of any kind. The entire risk arising out of the use or performance of the software is with you.&lt;/i&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;I haven't created any Setup program yet but the installation is easy:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;a href="http://itbloggen.se/cs/files/23/bjorn/entry597.aspx"&gt;Download&lt;/a&gt; the CmdLet  &lt;li&gt;Unzip the 2 files and put them in a directory of your chioce  &lt;li&gt;Start PowerShell and run the following:&lt;br&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp; cd &amp;lt;path where you put the files&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;amp;"$env:systemroot\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe" Convert-Username.dll&lt;/strong&gt;  &lt;li&gt;Add the CmdLet to the Powershell environment by running:&lt;br&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp; Add-PSSnapIn Convert-Username&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;You need to do the last step everytime you start PowerShell if you don't add it to your PowerShell profile.&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;&lt;i&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/i&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;&lt;i&gt;&lt;strong&gt;Example:&lt;br&gt;&lt;/strong&gt;&lt;/i&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;_______________________________________________________________________________________________________&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;C:\PS&amp;gt;Convert-Username "John Doe" Upn&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;QueriedName&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; Domain&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; 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Status&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; ------&lt;br&gt;John Doe&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;somewhere.local&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;/font&gt;&lt;a href="mailto:john.doe@somewhere.local"&gt;&lt;font face="Courier New"&gt;john.doe@somewhere.local&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NoError&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;_______________________________________________________________________________________________________&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="ver" size="2"&gt;In my next blog I'll give you a longer and more fun example of what you can do with Convert-Username&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;-----------------------------------------------------------------------------------------------------------------------&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;PS#&amp;gt; Get-Help Convert-Username -Full&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;-----------------------------------------------------------------------------------------------------------------------&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;NAME&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Convert-Username&lt;br&gt;SYNOPSIS&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Converts usernames to other formats.&lt;br&gt;SYNTAX&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Convert-Username [-name] &amp;lt;String[]&amp;gt; [-outFormat] {&amp;lt;DN&amp;gt; | &amp;lt;NT4Account&amp;gt; | &amp;lt;DisplayName&amp;gt; | &amp;lt;Guid&amp;gt; | &amp;lt;CanonicalName&amp;gt; | &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Upn&amp;gt; | &amp;lt;CanonicalNameEx&amp;gt; | &amp;lt;Spn&amp;gt; | &amp;lt;Sid&amp;gt; | &amp;lt;DnsDomain&amp;gt;} -inFormat {&amp;lt;DN&amp;gt; | &amp;lt;NT4Account&amp;gt; | &amp;lt;DisplayName&amp;gt; | &amp;lt;Guid&amp;gt; | &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;CanonicalName&amp;gt; | &amp;lt;Upn&amp;gt; | &amp;lt;CanonicalNameEx&amp;gt; | &amp;lt;Spn&amp;gt; | &amp;lt;Sid&amp;gt; | &amp;lt;DnsDomain&amp;gt; | &amp;lt;Unknown&amp;gt;} [-credential &amp;lt;PSCredential&amp;gt;]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [-noBatching &amp;lt;SwitchParameter&amp;gt;] [-domainController &amp;lt;String&amp;gt;] [-dnsDomain &amp;lt;String&amp;gt;] [&amp;lt;CommonParameters&amp;gt;]&lt;br&gt;DETAILED DESCRIPTION&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The Convert-Username cmdlet uses the Active Directory to convert usernames from one format to an other.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;PARAMETERS&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -name &amp;lt;String[]&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Specifies the names for conversion is to be made.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -outFormat&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Is used to specify in what format the converted usernames will be. Valid values for &amp;lt;CommandTypes&amp;gt; are:&lt;br&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DN&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; NT4Account&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; DisplayName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Guid&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; CanonicalName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Upn&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; CanonicalNameEx&amp;nbsp;&amp;nbsp;&amp;nbsp; Spn&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; Sid&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; DnsDomain&lt;br&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; You can use OutFormat or its alias, o.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -inFormat&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Is used to specify in what format the names to be converted will be. Valid values for &amp;lt;InFormat&amp;gt; are:&lt;br&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DN&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; NT4Account&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; DisplayName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Guid&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; CanonicalName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Upn&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; CanonicalNameEx&amp;nbsp;&amp;nbsp;&amp;nbsp; Spn&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; Sid&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; DnsDomain&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; Unknown&lt;br&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; The default InFormat is Unknown&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; You can use InFormat or its alias, i.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -credential &amp;lt;PSCredential&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Specifies the credential used to validate access. If a PSCredential object obtained earlier using get-credentia&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; l is supplied, it will be used as is. If a user name is supplied,&amp;nbsp; there will be a prompt for a password.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -noBatching &amp;lt;SwitchParameter&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Forces conversion to take place directly when an item is recieved through the pipe instead of batching the name&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s for one large request to the Active Directory.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -domainController &amp;lt;String&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Forces the use of a specific DomainController.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -dnsDomain &amp;lt;String&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Forces the use of a specific DnsDomain.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;CommonParameters&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; This cmdlet supports the common parameters: -Verbose, -Debug,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -ErrorAction, -ErrorVariable, and -OutVariable. For more information,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type, "get-help about_commonparameters".&lt;br&gt;REMARKS&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; For more information, type: "get-help Convert-Username -detailed".&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; For technical information, type: "get-help Convert-Username -full". &lt;/font&gt;&lt;img src="http://itbloggen.se/cs/aggbug.aspx?PostID=598" width="1" height="1"&gt;</content><author><name>bjorn.osterman</name><uri>http://itbloggen.se/cs/members/bjorn.osterman/default.aspx</uri></author><category term="PowerShell" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/PowerShell/default.aspx" /><category term="English" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/English/default.aspx" /></entry><entry><title>Why "dir *.txt -recurse" doesn't work in PowerShell</title><link rel="alternate" type="text/html" href="/cs/blogs/bjrn_stermans_blog/archive/2007/08/07/588.aspx" /><id>/cs/blogs/bjrn_stermans_blog/archive/2007/08/07/588.aspx</id><published>2007-08-07T13:18:28Z</published><updated>2007-08-07T13:18:28Z</updated><content type="html">&lt;p&gt;The "dir"-command (alias for get-childitem) in PowerShell does have some differences from dir in cmd.exe. It's more powerful, but it also takes more typing. &lt;p&gt;One of the things that might strike some people as odd is that &lt;strong&gt;"dir *.txt -recurse"&lt;/strong&gt; doesn't work as &lt;strong&gt;"dir *.txt /s"&lt;/strong&gt; in cmd.exe. The reason to this is that in PowerShell you actually use 2 parameters for this type of command. &lt;ol&gt; &lt;li&gt;Where to look&lt;/li&gt; &lt;li&gt;What to look for&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;So, what you should write is: &lt;p&gt;&lt;strong&gt;PS#&amp;gt; dir . *.txt -recurse&amp;nbsp; &lt;/strong&gt;(noticed the lonely dot?) &lt;p&gt;What this is saying is: Look for all *.txt-files in the current (.) directory, and subdirectories. &lt;p&gt;But, hey! Then why does &lt;strong&gt;"dir *.txt"&lt;/strong&gt; (without -recurse) work the way you would think? Well "where to look" can include files.  &lt;p&gt;The thing is that the pattern&amp;nbsp;&lt;strong&gt;"*.txt"&lt;/strong&gt; doesn't very often include any directories. In fact, if you would have a directory named &lt;strong&gt;"mydirectory.txt"&lt;/strong&gt;; then &lt;strong&gt;"dir *.txt -r"&lt;/strong&gt; would return all files in that directory and subdirectories, not only .txt-files. (Because "what to look for" hasn't been specified) &lt;img src="http://itbloggen.se/cs/aggbug.aspx?PostID=588" width="1" height="1"&gt;</content><author><name>bjorn.osterman</name><uri>http://itbloggen.se/cs/members/bjorn.osterman/default.aspx</uri></author><category term="PowerShell" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/PowerShell/default.aspx" /><category term="English" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/English/default.aspx" /></entry><entry><title>Using PowerTab for NestedPrompt</title><link rel="alternate" type="text/html" href="/cs/blogs/bjrn_stermans_blog/archive/2007/08/04/582.aspx" /><id>/cs/blogs/bjrn_stermans_blog/archive/2007/08/04/582.aspx</id><published>2007-08-03T22:47:08Z</published><updated>2007-08-03T22:47:08Z</updated><content type="html">&lt;p&gt;&lt;font size="2"&gt;In my &lt;a href="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/2007/08/02/578.aspx"&gt;last post&lt;/a&gt;&amp;nbsp;I wrote about&amp;nbsp;using TabExpansion for entering a NestedPrompt.&lt;/font&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;a href="http://thepowershellguy.com/blogs/posh/"&gt;/\/\o\/\/&lt;/a&gt;, who's the (powershell) guy who&amp;nbsp;created &lt;a href="http://thepowershellguy.com/blogs/posh/archive/2007/07/19/powertab-0-95-rc1-beta-public.aspx"&gt;PowerTab&lt;/a&gt; commented about how to do the same in PowerTab.&lt;/font&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;add-tabExpansion nest '$host.enternestedprompt();cls;""' invoke&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font size="2"&gt;To invoke the nesting just type nest&amp;amp; and press the Tab-key. The &amp;amp;-character at the end of "nest",&amp;nbsp;is the default charactar in PowerTab for running added tabExpansions of type "Invoke".&lt;/font&gt; &lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;I mention in that post that I wasn't that happy with&amp;nbsp;my "cls"-solution for clearing up the text left over from the nested prompt, so I decided to enhance it a little.&lt;/font&gt;  &lt;p&gt;&lt;font size="2"&gt;Instead of ju clearing the whole screen I wanted to do the following:&lt;/font&gt;  &lt;ol&gt; &lt;li&gt;&lt;font size="2"&gt;Copy the last active row on the screen&lt;/font&gt;  &lt;li&gt;&lt;font size="2"&gt;Enter the nested Prompt&lt;/font&gt;  &lt;li&gt;&lt;font size="2"&gt;After the exiting from the nested prompt: Redraw the copied line&lt;/font&gt;  &lt;li&gt;&lt;font size="2"&gt;Clear the screenbuffer on all lines below&lt;/font&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;font size="2"&gt;Instead of squeezing all that into the add-tabExpansion-line I created a function:&lt;/font&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;function EnterNestedPrompt { &lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#808080"&gt;&amp;nbsp; #Add some shortcuts for typenames etc &lt;/font&gt;&lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&amp;nbsp; $rectangleType = "System.Management.Automation.Host.Rectangle" &lt;br&gt;&amp;nbsp; $coordinatesType = "System.Management.Automation.Host.Coordinates"&lt;br&gt;&amp;nbsp; $buffercellType = "System.Management.Automation.Host.BufferCell"&lt;br&gt;&amp;nbsp; $RawUI = $Host.UI.RawUI &lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&amp;nbsp; &lt;font color="#808080"&gt;#Get the current cursorposition and the current line &lt;/font&gt;&lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&amp;nbsp; $currentPosition = $RawUI.cursorposition&lt;br&gt;&amp;nbsp; $currentPosition.X = 0&lt;br&gt;&amp;nbsp; $currentPosition.Y--&lt;br&gt;&amp;nbsp; $currentRowIndex = $currentPosition.Y&lt;br&gt;&amp;nbsp; $currentLineRectangle = new-object $rectangleType 0,$currentRowIndex,($RawUI.WindowSize.width-1),$currentRowIndex &lt;br&gt;&amp;nbsp; $currentLineBuffer = $RawUI.getbuffercontents($currentLineRectangle) &lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#808080"&gt;&amp;nbsp; #Enter the nested prompt &lt;/font&gt;&lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&amp;nbsp; $Host.EnterNestedPrompt() &lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#808080"&gt;&amp;nbsp; #Redraw the original line &lt;/font&gt;&lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&amp;nbsp; $RawUI.SetBufferContents($currentPosition, $currentLineBuffer) &lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#808080"&gt;&amp;nbsp; #Create an empty space to redraw on the lower buffer to clear the garbage &lt;/font&gt;&lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&amp;nbsp; $EmptyBufferCell = new-object $buffercellType ' ',$RawUI.ForegroundColor,$RawUI.BackgroundColor, "Complete"&lt;br&gt;&amp;nbsp; $EmptySpace = $RawUI.NewBufferCellArray(($RawUI.BufferSize.Height-$currentRowIndex), $RawUI.BufferSize.Width, $EmptyBufferCell)&lt;br&gt;&amp;nbsp; $CurrentPosition.Y+=2&lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;font color="#808080"&gt;&amp;nbsp; #Clear lower screenbuffer&lt;/font&gt;&lt;/strong&gt;&lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&amp;nbsp; $RawUI.SetBufferContents($currentPosition, $EmptySpace) &lt;/strong&gt; &lt;p&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&amp;nbsp;Now, to add this to PowerTab&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;add-tabExpansion nest 'enternestedprompt;" `b"' invoke&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Notice that i've also changed the return-string from "" to " `b", this is because an empty string doesn't do anything for some reason. The result is that "nest&amp;amp;" just remains there after returning from the invoked command. By sending a space and then a backspace the desired effect is achieved.&lt;/p&gt;&lt;img src="http://itbloggen.se/cs/aggbug.aspx?PostID=582" width="1" height="1"&gt;</content><author><name>bjorn.osterman</name><uri>http://itbloggen.se/cs/members/bjorn.osterman/default.aspx</uri></author><category term="PowerShell" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/PowerShell/default.aspx" /><category term="English" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/English/default.aspx" /></entry><entry><title>Using PowerShell TabExpansion for PromptNesting</title><link rel="alternate" type="text/html" href="/cs/blogs/bjrn_stermans_blog/archive/2007/08/02/578.aspx" /><id>/cs/blogs/bjrn_stermans_blog/archive/2007/08/02/578.aspx</id><published>2007-08-02T00:32:00Z</published><updated>2007-08-02T00:32:00Z</updated><content type="html">&lt;P&gt;I've been thinking about extending PowerShell&amp;nbsp;to solve some of the dilemmas i've encountered while working in the console. I was looking into &lt;A href="http://thepowershellguy.com/blogs/posh/"&gt;MoW&lt;/A&gt;'s latest&amp;nbsp;version of &lt;A href="http://thepowershellguy.com/blogs/posh/archive/2007/07/19/powertab-0-95-rc1-beta-public.aspx"&gt;PowerTab&lt;/A&gt;&amp;nbsp;and was wondering how he was able to hook up the key-event. After som probing I found out that PowerShell implements a function called TabExpansion that's called when the TAB-key is pressed. 
&lt;P&gt;I was hoping for a real key-hooking mekanism so that I would be able to react to a key of my choice, but TabExpansion isn't that bad actually. 
&lt;P&gt;So what dilemmas can we&amp;nbsp;solve with with TabExpansion? Well imagine the following senario: 
&lt;P&gt;You're writing a long line in the PowerShell-console and after a lot of typing you find yourself wondering about some syntax for some command. Now you want to write and test some things but without discarding what you've written so far. You could start a whole new PowerShell Console, but perhaps you also want to inspect some variables that wont exist in a fresh Console. 
&lt;P&gt;Now, PowerShell does include a function called EnterNestedPrompt, that's used while debugging scripts. Wouldn't it be great to be able to call EnterNestedPrompt while writing that line? 
&lt;P&gt;The default "TabExpansion"-function is created automatically when the PowerShell Console is loading. &lt;A href="http://thepowershellguy.com/blogs/posh/archive/2007/07/19/powertab-0-95-rc1-beta-public.aspx"&gt;PowerTab&lt;/A&gt; and also &lt;A href="http://www.codeplex.com/PowerShellCX"&gt;PSCX&lt;/A&gt;&amp;nbsp;exchanges the function for their own implementations. We wish to insert some logic of our own before calling the real TabExpansion. 
&lt;P&gt;So first we&amp;nbsp;copy the existing TabExpansion to TabExpansionOld 
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;STRONG&gt;copy Function:\TabExpansion Function:\TabExpansionOld&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Next we create a new TabExpansion-function: 
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;function TabExpansion {&lt;BR&gt;&amp;nbsp; param($line, $lastWord) &lt;/STRONG&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;&amp;nbsp; if ($lastWord -eq "nest" ) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Check if the lastword on the commandline is "nest"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $host.enternestedprompt()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Enter the nested prompt&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cls&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; # When returning from the nested prompt; clear the screen&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; # Return an empty string, this will remove the word "nest"&lt;BR&gt;&amp;nbsp; } else {&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; TabExpansionOld $line $lastword&amp;nbsp; # If the word isn't "nest", to ordinary TabExpansion&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;} &lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;The "cls"-row in the script is there because the console doesn't handle the exiting from the nested prompt very well. A lot of garbled text. The "cls"-solution isn't very good either, but it's better. In the future i migth&amp;nbsp;extend the&amp;nbsp;function to do&amp;nbsp;a temporary copy of the whole screen-buffer before entering the prompt, and restoring it when returning.&lt;/P&gt;
&lt;P&gt;You can try the nesting like this:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT face="Courier New"&gt;PS C:\&amp;gt; dir | group Extension | select-string nest &amp;lt;-- PRESS TAB HERE&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;The prompt will look quite strange:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT face="Courier New"&gt;PS C:\&amp;gt; dir | group extension | select nestPS C:\&amp;gt;&amp;gt;&amp;gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;But now you can test things. When you're done, write Exit and press enter, and you're back on the original line.&lt;/P&gt;&lt;img src="http://itbloggen.se/cs/aggbug.aspx?PostID=578" width="1" height="1"&gt;</content><author><name>bjorn.osterman</name><uri>http://itbloggen.se/cs/members/bjorn.osterman/default.aspx</uri></author><category term="PowerShell" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/PowerShell/default.aspx" /><category term="English" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/English/default.aspx" /></entry><entry><title>How do I construct that object in PowerShell?</title><link rel="alternate" type="text/html" href="/cs/blogs/bjrn_stermans_blog/archive/2007/07/24/560.aspx" /><id>/cs/blogs/bjrn_stermans_blog/archive/2007/07/24/560.aspx</id><published>2007-07-24T20:58:00Z</published><updated>2007-07-24T20:58:00Z</updated><content type="html">&lt;P&gt;One of the things that make PowerShell soo powerful is that you have access to .Net Framework and all the objects that it includes. Quite often I use the Get-Member (gm) CmdLet to find out what Methods and Properties that can be used, however one of the methods on the object isn't exposed, and that's the constructor. 
&lt;P&gt;The constructor(s) is the method that is used when creating the object. Information about the constructor is interresting when using the New-Object (new) CmdLet. 
&lt;P&gt;Lets say that you want to know what arguments you could/should/must use when creating a&amp;nbsp;System.DateTime, then you can use the following line:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;1# &lt;FONT color=#008000&gt;([datetime]).GetConstructors() | foreach { $_.ToString() }&lt;BR&gt;&lt;/FONT&gt;Void .ctor(Int64)&lt;BR&gt;Void .ctor(Int64, System.DateTimeKind)&lt;BR&gt;Void .ctor(Int32, Int32, Int32)&lt;BR&gt;Void .ctor(Int32, Int32, Int32, System.Globalization.Calendar)&lt;BR&gt;Void .ctor(Int32, Int32, Int32, Int32, Int32, Int32)&lt;BR&gt;Void .ctor(Int32, Int32, Int32, Int32, Int32, Int32, System.DateTimeKind)&lt;BR&gt;Void .ctor(Int32, Int32, Int32, Int32, Int32, Int32, System.Globalization.Calendar)&lt;BR&gt;Void .ctor(Int32, Int32, Int32, Int32, Int32, Int32, Int32)&lt;BR&gt;Void .ctor(Int32, Int32, Int32, Int32, Int32, Int32, Int32, System.DateTimeKind)&lt;BR&gt;Void .ctor(Int32, Int32, Int32, Int32, Int32, Int32, Int32, System.Globalization.Calendar)&lt;BR&gt;Void .ctor(Int32, Int32, Int32, Int32, Int32, Int32, Int32, System.Globalization.Calendar, System.DateTimeKind)&lt;/STRONG&gt;&lt;/FONT&gt; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This gives you good information about the types you need to use, but it would be useful to see the names of the arguments too.&lt;/P&gt;
&lt;P&gt;The following function shows the constructors with the parameternames. I've tried to make look a little more PowerShellish than the example above.&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;function Get-Constructor ([type]$type) {&lt;BR&gt;&amp;nbsp; $type.getconstructors() | &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach -process { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $tmp = "[void] .ctor" + &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; ($_.GetParameters() | &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; foreach -begin {$s=@()} `&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; -process {$s+="[$($_.ParameterType.ToString().ToLower())] `$$($_.Name)"} `&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; -end {"(" + [string]::Join(', ',$s) + ")"}) &lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $tmp -replace "Boolean","bool" `&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -replace "Int32", "int" `&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -replace "System.IO." `&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -replace "System.Text." `&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -replace "System." `&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -replace "System.String", "string"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;} &lt;/STRONG&gt;&lt;/FONT&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;And the result looks like this:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT face="Courier New" size=2&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT face="Courier New" size=2&gt;59# &lt;FONT color=#008000&gt;get-constructor datetime&lt;/FONT&gt;&lt;BR&gt;[void] .ctor([int64] $ticks)&lt;BR&gt;[void] .ctor([int64] $ticks, [datetimekind] $kind)&lt;BR&gt;[void] .ctor([int] $year, [int] $month, [int] $day)&lt;BR&gt;[void] .ctor([int] $year, [int] $month, [int] $day, [globalization.calendar] $calendar)&lt;BR&gt;[void] .ctor([int] $year, [int] $month, [int] $day, [int] $hour, [int] $minute, [int] $second)&lt;BR&gt;[void] .ctor([int] $year, [int] $month, [int] $day, [int] $hour, [int] $minute, [int] $second, [datetimekind] $kind)&lt;BR&gt;[void] .ctor([int] $year, [int] $month, [int] $day, [int] $hour, [int] $minute, [int] $second, [globalization.calendar]&amp;nbsp;$calendar)&lt;BR&gt;[void] .ctor([int] $year, [int] $month, [int] $day, [int] $hour, [int] $minute, [int] $second, [int] $millisecond)&lt;BR&gt;[void] .ctor([int] $year, [int] $month, [int] $day, [int] $hour, [int] $minute, [int] $second, [int] $millisecond, [datetimekind] $kind)&lt;BR&gt;[void] .ctor([int] $year, [int] $month, [int] $day, [int] $hour, [int] $minute, [int] $second, [int] $millisecond, [globalization.calendar] $calendar)&lt;BR&gt;[void] .ctor([int] $year, [int] $month, [int] $day, [int] $hour, [int] $minute, [int] $second, [int] $millisecond, [globalization.calendar] $calendar, [datetimekind] $kind)&lt;BR&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;img src="http://itbloggen.se/cs/aggbug.aspx?PostID=560" width="1" height="1"&gt;</content><author><name>bjorn.osterman</name><uri>http://itbloggen.se/cs/members/bjorn.osterman/default.aspx</uri></author><category term="PowerShell" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/PowerShell/default.aspx" /><category term=".NET" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/.NET/default.aspx" /><category term="English" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/English/default.aspx" /></entry><entry><title>Accessing Windows Server 2003 R2 File Server Resource Manager in PowerShell</title><link rel="alternate" type="text/html" href="/cs/blogs/bjrn_stermans_blog/archive/2007/07/18/536.aspx" /><id>/cs/blogs/bjrn_stermans_blog/archive/2007/07/18/536.aspx</id><published>2007-07-18T17:40:00Z</published><updated>2007-07-18T17:40:00Z</updated><content type="html">&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Microsoft Windows Server 2003 R2 includes a new File Server Resource Manager for files, including directory-quota and file-screening.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;The APIs for accessing R2 FSRM hasn't been made official by Microsoft, but that doesn't mean that they can't be used.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;FSRM has a couple of COM-object you can use, one is "SrmSvr.SrmQuotaManager". Let's create it and see what methods we can use.&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000000&gt;&lt;STRONG&gt;&lt;FONT size=2&gt;PS C:\&amp;gt; &lt;/FONT&gt;&lt;/STRONG&gt;&lt;STRONG&gt;&lt;FONT size=2&gt;&lt;FONT color=#000080&gt;$qm = New-Object -com "srmsvc.srmquotamanager"&lt;BR&gt;&lt;/FONT&gt;PS C:\&amp;gt; &lt;FONT color=#000080&gt;$qm | get-member&lt;/FONT&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp; TypeName: System.__ComObject#{b6aa2c73-bb7c-432a-9d09-bae30eca29d4}&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&lt;STRONG&gt;&lt;FONT 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; MemberType Definition&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;CreateAutoQuota&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ISrmAutoQuota CreateAutoQuota (string)&lt;BR&gt;CreateQuota&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ISrmQuota CreateQuota (string)&lt;BR&gt;CreateQuotas&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SAFEARRAY(Variant) CreateQuotas (ISrmCollection)&lt;BR&gt;DeleteQuotas&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SAFEARRAY(Variant) DeleteQuotas (ISrmCollection)&lt;BR&gt;EnumAutoQuotas&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ISrmCollection EnumAutoQuotas (string)&lt;BR&gt;EnumEffectiveQuotas Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ISrmCollection EnumEffectiveQuotas (string)&lt;BR&gt;EnumQuotas&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ISrmCollection EnumQuotas (string)&lt;BR&gt;EnumQuotasByTag&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ISrmCollection EnumQuotasByTag (string)&lt;BR&gt;GetAutoQuota&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ISrmAutoQuota GetAutoQuota (string)&lt;BR&gt;GetQuota&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ISrmQuota GetQuota (string)&lt;BR&gt;GetRestrictiveQuota Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ISrmQuota GetRestrictiveQuota (string)&lt;BR&gt;ModifyQuotas&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SAFEARRAY(Variant) ModifyQuotas (ISrmCollection)&lt;BR&gt;NewCollection&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ISrmCollection NewCollection ()&lt;BR&gt;Scan&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; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void Scan (string)&lt;/FONT&gt;&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Lots of interresting methods there.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Let's create a new quota:&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;PS C:\&amp;gt; &lt;/STRONG&gt;&lt;STRONG&gt;&lt;FONT color=#000080&gt;$quota = $qm.CreateQuota("C:\TestQuota")&lt;BR&gt;&lt;/FONT&gt;PS C:\&amp;gt; &lt;FONT color=#000080&gt;$quota | get-member&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp; TypeName: System.__ComObject#{ac042e22-0db4-4a90-be5a-54513a3631de}&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&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; MemberType Definition&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; ---------- ----------&lt;BR&gt;AddThreshold&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void AddThreshold (int)&lt;BR&gt;ApplyTemplate&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void ApplyTemplate (string)&lt;BR&gt;Commit&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; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void Commit ()&lt;BR&gt;CreateLimitAction&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ISrmAction CreateLimitAction (_SrmActionType)&lt;BR&gt;CreateThresholdAction&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ISrmAction CreateThresholdAction (int, _SrmActionType)&lt;BR&gt;Delete&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; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void Delete ()&lt;BR&gt;DeleteThreshold&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void DeleteThreshold (int)&lt;BR&gt;EnumLimitActions&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ISrmCollection EnumLimitActions ()&lt;BR&gt;EnumThresholdActions&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ISrmCollection EnumThresholdActions (int)&lt;BR&gt;GetLimitAction&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ISrmAction GetLimitAction (string)&lt;BR&gt;GetSourceTemplateName&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void GetSourceTemplateName (string, bool)&lt;BR&gt;GetThresholdAction&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ISrmAction GetThresholdAction (int, string)&lt;BR&gt;ModifyThreshold&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void ModifyThreshold (int, int)&lt;BR&gt;RefreshUsageProperties&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void RefreshUsageProperties ()&lt;BR&gt;ResetHighWaterMark&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void ResetHighWaterMark ()&lt;BR&gt;QuotaFlags&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; Property&amp;nbsp;&amp;nbsp; int QuotaFlags () {get} {set}&lt;BR&gt;QuotaHighWaterMark&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property&amp;nbsp;&amp;nbsp; uint64 QuotaHighWaterMark () {get}&lt;BR&gt;QuotaHighWaterMarkString Property&amp;nbsp;&amp;nbsp; string QuotaHighWaterMarkString () {get}&lt;BR&gt;QuotaHighWaterTime&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property&amp;nbsp;&amp;nbsp; Date QuotaHighWaterTime () {get}&lt;BR&gt;QuotaLimit&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; Property&amp;nbsp;&amp;nbsp; uint64 QuotaLimit () {get} {set}&lt;BR&gt;QuotaLimitString&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property&amp;nbsp;&amp;nbsp; string QuotaLimitString () {get} {set}&lt;BR&gt;QuotaPath&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; Property&amp;nbsp;&amp;nbsp; string QuotaPath () {get}&lt;BR&gt;QuotaTags&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; Property&amp;nbsp;&amp;nbsp; SAFEARRAY(Variant) QuotaTags () {get} {set}&lt;BR&gt;QuotaUsed&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; Property&amp;nbsp;&amp;nbsp; uint64 QuotaUsed () {get}&lt;BR&gt;QuotaUsedString&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property&amp;nbsp;&amp;nbsp; string QuotaUsedString () {get}&lt;BR&gt;Thresholds&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; Property&amp;nbsp;&amp;nbsp; SAFEARRAY(Variant) Thresholds () {get}&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Okey, the quota isn't really created yet. So let's set a property and then "save" it.&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;PS C:\&amp;gt; &lt;/STRONG&gt;&lt;STRONG&gt;&lt;FONT color=#000080&gt;$quota.QuotaLimit = 200mb&lt;BR&gt;&lt;/FONT&gt;PS C:\&amp;gt; &lt;FONT color=#000080&gt;$quota.QuotaLimit&lt;/FONT&gt;&lt;BR&gt;209715200&lt;BR&gt;PS C:\&amp;gt; &lt;FONT color=#000080&gt;$quota.Commit()&lt;/FONT&gt;&lt;BR&gt;PS C:\&amp;gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Now the qouta is created. Observe PowerShells support for kb, mb, etc.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Let's see the usage information. I've put some files in C:\TestQuota&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;PS C:\&amp;gt; &lt;FONT color=#000080&gt;$qm.GetQuota("C:\TestQuota")&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;QuotaLimit&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; : 209715200&lt;BR&gt;QuotaLimitString&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 209715200&lt;BR&gt;QuotaFlags&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; : 256&lt;BR&gt;QuotaTags&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;Thresholds&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;QuotaPath&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; : C:\TestQuota&lt;BR&gt;QuotaUsed&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; : 101997568&lt;BR&gt;QuotaUsedString&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 101997568&lt;BR&gt;QuotaHighWaterMark&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 101997568&lt;BR&gt;QuotaHighWaterMarkString : 101997568&lt;BR&gt;QuotaHighWaterTime&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 2007-07-18 20:31:11&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;If we want to create a simple report of the disk usage in the homedirectories (given that qouta has been enabled for them).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;PS C:\&amp;gt; &lt;FONT color=#000080&gt;$qm.EnumQuotas("C:\HomeFolders\*") | format-table QuotaPath, QuotaLimit&lt;/FONT&gt;&lt;FONT color=#000080&gt;, QuotaUsed&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face="Courier New"&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;QuotaPath&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; QuotaLimit QuotaUsed&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; ---------- ---------&lt;BR&gt;C:\TestQuota&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; 209715200 101997568&lt;BR&gt;C:\HomeFolders\arthur.dent&amp;nbsp; 104857600&amp;nbsp; 33999872&lt;BR&gt;C:\HomeFolders\dilbert&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 104857600 101997568&lt;BR&gt;C:\HomeFolders\jane.doe&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 104857600 100689920&lt;BR&gt;C:\HomeFolders\john.doe&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 104857600&amp;nbsp; 90228736&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;And now a little more fun report:&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;PS C:\&amp;gt; &lt;/STRONG&gt;&lt;STRONG&gt;&lt;FONT color=#000080&gt;$qm.EnumQuotas("C:\HomeFolders\*") |&lt;BR&gt;&lt;/FONT&gt;&amp;gt;&amp;gt; &lt;FONT color=#000080&gt;foreach { add-member -pass -input $_ NoteProperty Usage &lt;/FONT&gt;&lt;FONT color=#000080&gt;($_.QuotaUsed/$_.QuotaLimit) } |&lt;/FONT&gt;&lt;BR&gt;&amp;gt;&amp;gt; &lt;/STRONG&gt;&lt;STRONG&gt;&lt;FONT color=#000080&gt;where { $_.usage -gt .8 } |&lt;BR&gt;&lt;/FONT&gt;&amp;gt;&amp;gt; &lt;FONT color=#000080&gt;sort Usage -desc |&lt;/FONT&gt;&lt;BR&gt;&amp;gt;&amp;gt; &lt;/STRONG&gt;&lt;STRONG&gt;&lt;FONT color=#000080&gt;select -first 3 |&lt;BR&gt;&lt;/FONT&gt;&amp;gt;&amp;gt; &lt;FONT color=#000080&gt;format-table QuotaPath, QuotaLimit, QuotaUsed, @{Label="Usage";expression={$_.Usage.ToString("00.00%")}}&lt;/FONT&gt;&lt;BR&gt;&amp;gt;&amp;gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;QuotaPath&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; QuotaLimit&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; QuotaUsed Usage&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; --------- -----&lt;BR&gt;C:\HomeFolders\dilbert&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; 104857600&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; 101997568 97,27%&lt;BR&gt;C:\HomeFolders\jane.doe&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; 104857600&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; 100689920 96,03%&lt;BR&gt;C:\HomeFolders\john.doe&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; 104857600&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; 90228736 86,05%&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;The previous commands&amp;nbsp;was executed on local machine. How&amp;nbsp;can we do this on a remote machine? Well it&amp;nbsp;requires some wacky .NET-functions.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;This is actually a pretty useful technique, so lets create a nice general function for it:&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000080 size=2&gt;&lt;STRONG&gt;function New-RemoteComObject {&lt;BR&gt;&amp;nbsp; param(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [string] $progID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $(throw "Must specify ProgID for remote objekt"),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [string] $remoteComputername = $(throw "Must specify remote computername")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) &lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000080 size=2&gt;&lt;STRONG&gt;&amp;nbsp; $remoteType = [Type]::GetTypeFromProgID($progID, $remoteComputername, $true)&lt;BR&gt;&amp;nbsp; $remoteInstance = [Activator]::CreateInstance($remoteType)&lt;BR&gt;&amp;nbsp; $remoteInstance&lt;BR&gt;}&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;For this to work, you have to have the same COM-object registered on your local computer, and the COM-object have to support remote instanciation. (hmm... wonder if that word was spelled correctly?)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;If your running from an other W2K3R2-machine and your don't have FSRM installed, then you have to run "regs&lt;/FONT&gt;&lt;FONT face=Verdana&gt;vr32 %WINDIR%\system32\srm.dll"&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;I don't know if your can make&amp;nbsp;FSRM work from a XP-machine.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Lets see how to use it:&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;PS C:\&amp;gt; &lt;/STRONG&gt;&lt;STRONG&gt;&lt;FONT color=#000080&gt;$qm = new-remotecomobject srmsvc.srmquotamanager rnd-exch-01&lt;BR&gt;&lt;/FONT&gt;PS C:\&amp;gt; &lt;FONT color=#000080&gt;$qm.EnumQuotas() | format-table QuotaPath, QuotaLimit, QuotaUsed&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;QuotaPath&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; QuotaLimit QuotaUsed&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; ---------- ---------&lt;BR&gt;C:\TestQuota&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; 209715200 101997568&lt;BR&gt;C:\HomeFolders\arthur.dent&amp;nbsp; 104857600&amp;nbsp; 33999872&lt;BR&gt;C:\HomeFolders\dilbert&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 104857600 101997568&lt;BR&gt;C:\HomeFolders\jane.doe&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 104857600 100689920&lt;BR&gt;C:\HomeFolders\john.doe&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 104857600&amp;nbsp; 90228736&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;As you can see it's almost the same.&amp;nbsp;You just have to&amp;nbsp;use the New-RemoteComObject-function instead of the New-Object-cmdlet.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;If you want some more examples please add a comment.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://itbloggen.se/cs/aggbug.aspx?PostID=536" width="1" height="1"&gt;</content><author><name>bjorn.osterman</name><uri>http://itbloggen.se/cs/members/bjorn.osterman/default.aspx</uri></author><category term="PowerShell" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/PowerShell/default.aspx" /><category term="English" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/English/default.aspx" /></entry><entry><title>Chrisse's FGPP Beta 1 släppt</title><link rel="alternate" type="text/html" href="/cs/blogs/bjrn_stermans_blog/archive/2007/07/15/532.aspx" /><id>/cs/blogs/bjrn_stermans_blog/archive/2007/07/15/532.aspx</id><published>2007-07-15T21:55:00Z</published><updated>2007-07-15T21:55:00Z</updated><content type="html">&lt;P&gt;&lt;FONT face=Verdana size=2&gt;I Windows Server 2008 kommer en ny funktion som heter "Fine-grained Password Policy" (FGPP) som innebär att man till skillnad från förrut får möjligheten att specificera olika lösenordskrav för olika användare och grupper.&amp;nbsp;Innan kunde man bara specificera en uppsättning lösenordskrav för varje domän.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Tillägget av funktionen kom dock så pass sent i utvecklingsprocessen hos Microsoft så att de inte har lagt in något GUI för att administrera funktionen.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Jag har dock haft möjligheten att hjälpa Chrisse Andersson på TrueSec att utveckla en MMC-Console och en PowerShell-SnapIn&amp;nbsp;för att administrera FGPP.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Chrisse&amp;nbsp;har&amp;nbsp;nu släppt Beta 1 av programmet. Ni kan läsa om funktionerna och ladda ner programmet från &lt;/FONT&gt;&lt;A href="http://blogs.chrisse.se/blogs/chrisse/pages/fine-grain-password-policy-tool.aspx"&gt;&lt;FONT face=Verdana size=2&gt;http://blogs.chrisse.se/blogs/chrisse/pages/fine-grain-password-policy-tool.aspx&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Jag tycker att det är kul att han har släppt en PowerShell SnapIn. Det ger oss tekniker möjlighet&amp;nbsp;att&amp;nbsp;jobba med FGPPs utanför begräsningarna av de GUI:n som ofta presenteras för oss.&lt;/P&gt;
&lt;P&gt;De CmdLets som följer med är:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Get-PasswordPolicy 
&lt;LI&gt;New-PasswordPolicy 
&lt;LI&gt;Modify-PasswordPolicy 
&lt;LI&gt;Rename-PasswordPolicy&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;Exempel 1: Visa alla FGPPs som har MaximumPasswordAge satt till 9 dagar eller mer:&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;PS C:\Program Files\FGPP&amp;gt; &lt;FONT color=#000080&gt;&lt;STRONG&gt;Get-PasswordPolicy | ? { $_.Maximumpasswordage.totaldays -ge 9 }&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;DN&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; : CN=testelitest,CN=Password Settings Container,CN=System,DC=slumsoft2,DC=local&lt;BR&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : testelitest&lt;BR&gt;CN&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; : CN=testelitest&lt;BR&gt;PasswordSettingsPrecendence&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 1&lt;BR&gt;PasswordReversibleEncryptionEnabled : True&lt;BR&gt;PasswordHistoryLength&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; : 2&lt;BR&gt;PasswordComplexityEnabled&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : True&lt;BR&gt;MinimumPasswordLength&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; : 2&lt;BR&gt;MinimumPasswordAge&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; : 7.00:00:00&lt;BR&gt;MaximumPasswordAge&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; : 1000.00:00:00&lt;BR&gt;LockoutThreshold&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; : 1&lt;BR&gt;LockoutObservationWindow&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 00:18:00&lt;BR&gt;LockoutDuration&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; : 00:18:00&lt;BR&gt;PSOAppliesTo&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;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;Exempel 2: Ändra MaximumPasswordAge utan att använda Modify-PasswordPolicy&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;PS C:\Program Files\FGPP&amp;gt; &lt;FONT color=#000080&gt;&lt;STRONG&gt;$pp = Get-PasswordPolicy gurka2&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;PS C:\Program Files\FGPP&amp;gt; &lt;STRONG&gt;&lt;FONT color=#000080&gt;$pp.maximumpasswordage.totaldays&lt;/FONT&gt;&lt;/STRONG&gt;&lt;BR&gt;8&lt;BR&gt;PS C:\Program Files\FGPP&amp;gt; &lt;FONT color=#000080&gt;&lt;STRONG&gt;$pp.maximumpasswordage = [timespan]::fromdays(15)&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;PS C:\Program Files\FGPP&amp;gt; &lt;FONT color=#000080&gt;&lt;STRONG&gt;$pp.CommitChanges()&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;PS C:\Program Files\FGPP&amp;gt; &lt;STRONG&gt;&lt;FONT color=#000080&gt;(Get-PasswordPolicy gurka2).maximumpasswordage&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;Days&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; : 15&lt;BR&gt;Hours&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0&lt;BR&gt;Minutes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0&lt;BR&gt;Seconds&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0&lt;BR&gt;Milliseconds&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0&lt;BR&gt;Ticks&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 12960000000000&lt;BR&gt;TotalDays&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 15&lt;BR&gt;TotalHours&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 360&lt;BR&gt;TotalMinutes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 21600&lt;BR&gt;TotalSeconds&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 1296000&lt;BR&gt;TotalMilliseconds : 1296000000&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;PS C:\Program Files\FGPP&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Chrisse&amp;nbsp;vill gärna ha feedback angående buggar, och vilka önskade funktioner ni skulle vilja se till nästa version. Skriv och berätta i forum-tråden på ITProffs:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.itproffs.se/forumv2/tm.aspx?m=108699&amp;amp;mpage=1&amp;amp;key=&amp;amp;#108930"&gt;&lt;FONT face=Verdana size=2&gt;http://www.itproffs.se/forumv2/tm.aspx?m=108699&amp;amp;mpage=1&amp;amp;key=&amp;amp;#108930&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://itbloggen.se/cs/aggbug.aspx?PostID=532" width="1" height="1"&gt;</content><author><name>bjorn.osterman</name><uri>http://itbloggen.se/cs/members/bjorn.osterman/default.aspx</uri></author><category term="PowerShell" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/PowerShell/default.aspx" /><category term="Svenska" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/Svenska/default.aspx" /></entry><entry><title>Peeking inside the PowerShell Pipe</title><link rel="alternate" type="text/html" href="/cs/blogs/bjrn_stermans_blog/archive/2007/07/06/523.aspx" /><id>/cs/blogs/bjrn_stermans_blog/archive/2007/07/06/523.aspx</id><published>2007-07-06T20:55:00Z</published><updated>2007-07-06T20:55:00Z</updated><content type="html">&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Pipe (|) i PowerShell används för att skriva objekt från ett kommando till ett annat. Det är en nyhet från t ex cmd.exe eller även Linux:s olika shell där det alltid är ren text som skickas.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;När jag skrev min blog om &lt;A href="/cs/blogs/bjrn_stermans_blog/archive/2007/07/02/507.aspx"&gt;gruppering och summering av filer baserat på Extension&lt;/A&gt; så blev jag då och då osäker på vad det var för typ av objekt som olika CmdLets skickade vidare.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;För att se vad som skickades i pipe:n skrev jag en liten funktion:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;FONT face="Courier New"&gt;function peek-pipe {&lt;BR&gt;&amp;nbsp; process {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Skriv ut namnet på det aktuella objektets typ till skärmen i grönt&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; write-host $_.GetType() -foregroundcolor Green&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Skicka vidare objektet&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $_&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Så ifall ni vill köra ett kommando som t ex "dir | format-table" och vill se vilka objekt som skickas igenom pipe:n skriver ni istället "dir | peek-pipe | format-table"&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;IMG src="/cs/photos/screenshots/images/522/original.aspx" border=0&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;En interresant detalj som man kan se är att format-table-kommandot börjar skriva ut listan redan vid första objektet och sedan fyller på listan allt eftersom dir-kommandot skickar vidare fler objekt.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://itbloggen.se/cs/aggbug.aspx?PostID=523" width="1" height="1"&gt;</content><author><name>bjorn.osterman</name><uri>http://itbloggen.se/cs/members/bjorn.osterman/default.aspx</uri></author><category term="PowerShell" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/PowerShell/default.aspx" /><category term="Svenska" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/Svenska/default.aspx" /></entry><entry><title>Ett litet PowerShell ADSI-tips</title><link rel="alternate" type="text/html" href="/cs/blogs/bjrn_stermans_blog/archive/2007/07/05/520.aspx" /><id>/cs/blogs/bjrn_stermans_blog/archive/2007/07/05/520.aspx</id><published>2007-07-05T12:18:00Z</published><updated>2007-07-05T12:18:00Z</updated><content type="html">&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Ifall man vill&amp;nbsp;hämta ett DirectoryEntry i PowerShell kan man skriva på följande sätt:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;$ou = new-object System.DirectoryServices.DirectoryEntry("&lt;/FONT&gt;&lt;A&gt;&lt;FONT face="Courier New" size=2&gt;&lt;/FONT&gt;&lt;A&gt;&lt;FONT face="Courier New" size=2&gt;&lt;A&gt;LDAP://OU=Company,DC=slumsoft,DC=&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face="Courier New" size=2&gt;local"&lt;/A&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face="Courier New" size=2&gt;)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Ett enklare sätt är att använda PowerShell-klassen ADSI&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;$ou = [ADSI]"&lt;/FONT&gt;&lt;A&gt;&lt;FONT face="Courier New" size=2&gt;LDAP://OU=Company,DC=slumsoft,DC=local&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face="Courier New" size=2&gt;"&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;/A&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://itbloggen.se/cs/aggbug.aspx?PostID=520" width="1" height="1"&gt;</content><author><name>bjorn.osterman</name><uri>http://itbloggen.se/cs/members/bjorn.osterman/default.aspx</uri></author><category term="PowerShell" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/PowerShell/default.aspx" /><category term="Svenska" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/Svenska/default.aspx" /></entry><entry><title>I huvet på en powershellare</title><link rel="alternate" type="text/html" href="/cs/blogs/bjrn_stermans_blog/archive/2007/07/02/507.aspx" /><id>/cs/blogs/bjrn_stermans_blog/archive/2007/07/02/507.aspx</id><published>2007-07-02T00:16:00Z</published><updated>2007-07-02T00:16:00Z</updated><content type="html">&lt;P&gt;&lt;FONT face=Verdana size=2&gt;När jag höll på och skriva mitt förra inlägg tänkte jag först använda ett lite längre skript som exempel, det scriptet&amp;nbsp;skrev jag i VB.NET och grupperar alla filer baserat på extension och summera ihop storlekarna. Det skriptet ser ut som nedan:&lt;/FONT&gt;&lt;/P&gt;&lt;PRE&gt;&lt;FONT color=#0000ff&gt;&lt;P&gt;&lt;FONT size=2&gt;Imports&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; System.IO&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;&lt;P&gt;&lt;FONT size=2&gt;Imports&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; System.Collections.Generic&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;&lt;P&gt;&lt;FONT size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;Module&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; GetFileSizesByExtension&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sub&lt;/FONT&gt; Main(&lt;FONT color=#0000ff&gt;ByVal&lt;/FONT&gt; args() &lt;FONT color=#0000ff&gt;As&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;String&lt;/FONT&gt;)&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color=#008000&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color=#008000&gt;&lt;FONT size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Check arguments&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;Not&lt;/FONT&gt; args.Length = 1 &lt;FONT color=#0000ff&gt;Then&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;P&gt;&lt;FONT size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;FONT color=#a31515&gt;"Syntax: getfilesizesbyextensions.exe &amp;lt;path&amp;gt;"&lt;/FONT&gt;)&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;FONT size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Return&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;If&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim&lt;/FONT&gt; dict &lt;FONT color=#0000ff&gt;As&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;New&lt;/FONT&gt; SortedDictionary(&lt;FONT color=#0000ff&gt;Of&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;String&lt;/FONT&gt;, &lt;FONT color=#0000ff&gt;Integer&lt;/FONT&gt;)&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color=#008000&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color=#008000&gt;&lt;FONT size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Iterate through the files&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;For&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;Each&lt;/FONT&gt; filename &lt;FONT color=#0000ff&gt;As&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;String&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;In&lt;/FONT&gt; Directory.GetFiles(args(1))&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim&lt;/FONT&gt; fi &lt;FONT color=#0000ff&gt;As&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;New&lt;/FONT&gt; FileInfo(filename)&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim&lt;/FONT&gt; extension &lt;FONT color=#0000ff&gt;As&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;String&lt;/FONT&gt; = fi.Extension.ToLower()&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If&lt;/FONT&gt; dict.ContainsKey(extension) &lt;FONT color=#0000ff&gt;Then&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;P&gt;&lt;FONT size=2&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;dict(extension) += fi.Length&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;FONT size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Else&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;P&gt;&lt;FONT size=2&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;dict.Add(extension, fi.Length)&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;If&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;FONT size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;P&gt;&lt;FONT color=#008000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color=#008000&gt;&lt;FONT size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Print results&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;For&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;Each&lt;/FONT&gt; extension &lt;FONT color=#0000ff&gt;As&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;String&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;In&lt;/FONT&gt; dict.Keys&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;FONT color=#a31515&gt;"{0,-5} - {1}"&lt;/FONT&gt;, extension, dict(extension))&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;FONT size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;End&lt;/FONT&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&lt;FONT size=2&gt;Sub&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;End&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;FONT color=#0000ff&gt;Module&lt;/P&gt;&lt;/FONT&gt; &lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;När jag satt och skrev programmet slog det mig att Powershell troligen skulle passa utmärkt för att göra motsvarande, så jag tänkte att vi skulle försöka oss på detta.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Första steget&amp;nbsp;är att få ut alla filerna, inga konstigheter där:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000080 size=2&gt;&lt;STRONG&gt;PS# &lt;FONT color=#008000&gt;dir C:\windows\system32&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Det finns ett en CmdLet med namnet Group-Object ("group") och -property används för att berätta vad man skall gruppera på. Vi testar:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000080 size=2&gt;&lt;STRONG&gt;PS# dir \windows\system32 | &lt;FONT color=#008000&gt;group Extension&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#808080 size=2&gt;&lt;STRONG&gt;Count 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; Group&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; -----&lt;BR&gt;&amp;nbsp;&amp;nbsp; 49&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; {1025, 1028, 1031, 1033...}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5 .inf&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; {$ncsp$.inf, $winnt$.inf, homepage.inf, ieuinit.inf...}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2 .cpx&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; {12520437.cpx, 12520850.cpx}&lt;BR&gt;&amp;nbsp;1283 .dll&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; {6to4svc.dll, aaaamon.dll, aaclient.dll, acctres.dll...}&lt;BR&gt;&amp;nbsp;&amp;nbsp; 24 .cpl&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; {access.cpl, appwiz.cpl, bthprops.cpl, desk.cpl...}&lt;BR&gt;&amp;nbsp; 304 .exe&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; {accwiz.exe, actmovie.exe, ahui.exe, alg.exe...}&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Kalas, vi är på rätt väg. Låt se, nu har vi en uppsättning objekt av type GroupInfo, där varje objekt innehåller namnet på extensionen, en lista med filerna som har den extensionen, samt antalet filer. &lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;Nu behöver vi ta reda på vad summan av storlekarna för filerna är.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Hmm... Alltså, för varje GroupInfo-objekt så vill vi ta listan (som finns i propertyn &lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;Group), och för varje objekt i listan vill vi ta ut storleken.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Det finns en CmdLet med namnet Measure-Object som kan summera och räkna på information i objekt:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000080 size=2&gt;&lt;STRONG&gt;&lt;FONT face="Courier New"&gt;PS# dir c:\windows\system32 | group Extension | &lt;FONT color=#008000&gt;% { ($_.Group | measure-object Length -sum).Sum }&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#ff0000&gt;Measure-Object : Property "Length" cannot be found in any object(s) input.&lt;BR&gt;At line:1 char:75&lt;BR&gt;+ dir c:\windows\system32 | group Extension | % { ($_.Group | measure-object&amp;nbsp; &amp;lt;&amp;lt;&amp;lt;&amp;lt; Length -sum).Sum }&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#808080&gt;59520&lt;BR&gt;4384&lt;BR&gt;295688942&lt;BR&gt;5656920&lt;BR&gt;43885527&lt;BR&gt;2947615&lt;BR&gt;1588512&lt;/FONT&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Okey, Det var en del på en gång, vi skall försöka dela upp det.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;%-tecknet är förkortning för "ForEach-Object"; den CmdLet:en kör efterföljande scriptdel en gång för varje objekt (i det här fallet GroupInfo-objekt). I scriptet representeras det aktuella objektet med $_.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Så för varje GroupInfo-objekt så tar&amp;nbsp;vi .Group och skickar in till Measure-Object. Där berättar&amp;nbsp;vi att det är propertyn Length (den innehåller filstorleken)&amp;nbsp;som&amp;nbsp;vi vill summera. Measure-Objekt kommer att&amp;nbsp;skicka tillbaka ett GenericMeasureInfo som bl a innehåller en Sum-property, vilken&amp;nbsp;vi vill använda.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;I ovanstående text&amp;nbsp;ger Measure-Object ett felmeddelande för den första listan. Anledningen till detta är att "dir" ger tillbaka både FileInfo-objekt och DirectoryInfo-objekt. Det senare innehåller ingen Length-property. Så för att få bort felmeddelandet kan vi lägga in ett filter lite tidigare i kommandosträngen:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000080 size=2&gt;&lt;STRONG&gt;PS# dir c:\windows\system32 | &lt;FONT color=#008000&gt;? { $_.GetType().Name -eq "FileInfo" }&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;? är förkortning&amp;nbsp;för "Where-Object".&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Nästa problem att lösa är att vi vill&amp;nbsp;inte bara ha en lista med summerade storlekar. Om inte annat så vill vi ju veta vilken extension som genererat varje summering. Ett alternativ är att utöka GroupInfo-objektet med den summerings-informationen som Measure-Object gav or.&amp;nbsp;Det vi kan göra är att använda "add-member":&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000080 size=2&gt;&lt;STRONG&gt;PS# dir c:\windows\system32 | ? { $_.GetType().Name -eq "FileInfo" } | group Extension | &lt;FONT color=#008000&gt;% { $_ | add-member NoteProperty Size ($_.Group | measure-object Length -sum).Sum -pass} &lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT face="Courier New" color=#000080 size=2&gt;&lt;STRONG&gt;&lt;FONT color=#808080&gt;Count 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; Group&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; -----&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5 .inf&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; {$ncsp$.inf, $winnt$.inf, homepage.inf, ieuinit.inf...}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2 .cpx&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; {12520437.cpx, 12520850.cpx}&lt;BR&gt;&amp;nbsp;1283 .dll&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; {6to4svc.dll, aaaamon.dll, aaclient.dll, acctres.dll...}&lt;BR&gt;&amp;nbsp;&amp;nbsp; 24 .cpl&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; {access.cpl, appwiz.cpl, bthprops.cpl, desk.cpl...}&lt;/FONT&gt;&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Så vi har använt add-member för att lägga till en NoteProperty med namnet Size och värdet av summeringen till GroupInfo-objektet. Vi har också lagt till "-passthru" för att berätta för add-member att objektet skall skickas vidare. De flesta andra CmdLets gör detta utan att man behöver säga åt dem.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Men i listan som skrivs ut så syns inte våran Size. För att se ifall den egentligen är där så testar vi att skicka vidare objekten till Get-Member (eller lite kortare "gm"). Get-Member kommer att&amp;nbsp;titta på det första av de objekten som den får, och skriva ut vilka properties och sånt som objektet har.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000080 size=2&gt;&lt;STRONG&gt;PS# dir c:\windows\system32 | ? { $_.GetType().Name -eq "FileInfo" } | group Extension | % { $_ | add-member NotePropert&lt;BR&gt;y Size ($_.Group | measure-object Length -sum).Sum -passthru} | &lt;FONT color=#008000&gt;gm&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT face="Courier New" color=#808080 size=2&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp; TypeName: Microsoft.PowerShell.Commands.GroupInfo&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000080 size=2&gt;&lt;STRONG&gt;&lt;FONT color=#808080&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MemberType&amp;nbsp;&amp;nbsp; Definition&lt;BR&gt;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ----------&amp;nbsp;&amp;nbsp; ----------&lt;BR&gt;Equals&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Boolean Equals(Object obj)&lt;BR&gt;GetHashCode Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32 GetHashCode()&lt;BR&gt;GetType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Type GetType()&lt;BR&gt;get_Count&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32 get_Count()&lt;BR&gt;get_Group&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Collections.ObjectModel.Collection`1[[System.Management.Automation.PSObject, System....&lt;BR&gt;get_Name&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String get_Name()&lt;BR&gt;get_Values&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Collections.ArrayList get_Values()&lt;BR&gt;ToString&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String ToString()&lt;BR&gt;Size&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NoteProperty System.Double Size=59520&lt;BR&gt;Count&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32 Count {get;}&lt;BR&gt;Group&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Collections.ObjectModel.Collection`1[[System.Management.Automation.PSObject, System....&lt;BR&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String Name {get;}&lt;BR&gt;Values&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Collections.ArrayList Values {get;}&lt;/FONT&gt;&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Där finns våran Size. Anledningen till att den inte syntes var att standard-output:en för GroupInfo inte innehåller Size, så vi får skicka vidare&amp;nbsp;objekten till Format-Table ("ft") och berätta vad vi vill se:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000080 size=2&gt;&lt;STRONG&gt;PS# dir c:\windows\system32 | ? { $_.GetType().Name -eq "FileInfo" } | group Extension | % { $_ | add-member NotePropert&lt;BR&gt;y Size ($_.Group | measure-object Length -sum).Sum -passthru} | &lt;FONT color=#008000&gt;ft Name, Count, Size -auto&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#808080 size=2&gt;&lt;STRONG&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Count&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size&lt;BR&gt;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ----&lt;BR&gt;.inf&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 59520&lt;BR&gt;.cpx&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4384&lt;BR&gt;.dll&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1283 295688942&lt;BR&gt;.cpl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 24&amp;nbsp;&amp;nbsp; 5656920&lt;BR&gt;.exe&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 304&amp;nbsp; 43885527&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Nästan klara. Det vi har kvar är att sortera informationen, och begränsa antalet rader&amp;nbsp;till 10 (så att listan&amp;nbsp;blir lite smidigare, texterna ovan har jag klippt för läsbarhet).&amp;nbsp;Vi skickar det till Sort-Object ("sort") och sedan till Select-Object ("select")&amp;nbsp;innan det skickas till Format-Table:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000080 size=2&gt;&lt;STRONG&gt;PS# dir c:\windows\system32 | ? { $_.GetType().Name -eq "FileInfo" } | group Extension | % { $_ | add-member NoteProperty Size ($_.Group | measure-object Length -sum).Sum -passthru} | &lt;FONT color=#008000&gt;sort Size -desc | select -first 10&lt;/FONT&gt; | ft Name, Count, Size -auto&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000080 size=2&gt;&lt;STRONG&gt;&lt;FONT color=#808080&gt;Name Count&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size&lt;BR&gt;---- -----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ----&lt;BR&gt;.dll&amp;nbsp; 1283 295688942&lt;BR&gt;.exe&amp;nbsp;&amp;nbsp; 304&amp;nbsp; 43885527&lt;BR&gt;.bin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp; 13196206&lt;BR&gt;.TMP&amp;nbsp;&amp;nbsp;&amp;nbsp; 17&amp;nbsp;&amp;nbsp; 7090705&lt;BR&gt;.ocx&amp;nbsp;&amp;nbsp;&amp;nbsp; 19&amp;nbsp;&amp;nbsp; 7074594&lt;BR&gt;.cpl&amp;nbsp;&amp;nbsp;&amp;nbsp; 24&amp;nbsp;&amp;nbsp; 5656920&lt;BR&gt;.nls&amp;nbsp;&amp;nbsp;&amp;nbsp; 68&amp;nbsp;&amp;nbsp; 5138370&lt;BR&gt;.dat&amp;nbsp;&amp;nbsp;&amp;nbsp; 13&amp;nbsp;&amp;nbsp; 4468086&lt;BR&gt;.scr&amp;nbsp;&amp;nbsp;&amp;nbsp; 11&amp;nbsp;&amp;nbsp; 2739200&lt;/FONT&gt;&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Så, vilka CmdLet:s har vi stött på nu:&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;Get-ChildItem (dir)&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;Where-Object (?)&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;Group-Object (group)&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;ForEach-Object (%)&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;Add-Member&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;Measure-Object&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;Sort-Object (sort)&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;Select-Object (select)&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;Format-Table (ft)&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;Get-Member (gm)&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Eftersom jag är ganska ny på blog-arenan så skulle jag gärna vilja ha feedback. Skriv och berätta huruvida ni finner ovanstående fullständigt ointerresant, felaktigt eller&amp;nbsp;förhoppningsvis lärorikt.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Skriv gärna ifall ni har några förbättringar på den resulterande kommando-raden.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://itbloggen.se/cs/aggbug.aspx?PostID=507" width="1" height="1"&gt;</content><author><name>bjorn.osterman</name><uri>http://itbloggen.se/cs/members/bjorn.osterman/default.aspx</uri></author><category term="PowerShell" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/PowerShell/default.aspx" /><category term="Svenska" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/Svenska/default.aspx" /></entry><entry><title>skripta.NET</title><link rel="alternate" type="text/html" href="/cs/blogs/bjrn_stermans_blog/archive/2007/06/30/506.aspx" /><id>/cs/blogs/bjrn_stermans_blog/archive/2007/06/30/506.aspx</id><published>2007-06-30T11:43:00Z</published><updated>2007-06-30T11:43:00Z</updated><content type="html">&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Hej alla&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Eftersom detta är mitt första blogg-inlägg så får jag väl börja med att introducera mig.&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Jag heter Björn Österman och är 30 år gammal. Jag har jobbat mycket både som tekniker och programmerare, nästan uteslutande med Microsoft-teknologier.&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;Mitt favorit-språk (förutom svenska) är C#.&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;De flesta tekniker som leker "programmering" använder idag VBScript som favorit-massförstörelsevapen. &lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;C# (och VB.NET) används ju inte, eftersom det är ett programmeringsspråk snarare än ett scriptspråk.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Själv delar jag inte den uppfattningen, då jag är förälskad i C# och använder det oavsett ifall det är vettigt eller inte.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Det jag tänkte skriva om är hur man som tekniker kan skriva sina script i .NET&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Den stora fördelen med att använda sig av .NET är den stora flora av objekt som .NET innehåller, samt styrkan i språket jämfört med VBScript.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Och nu när PowerShell har gjort sin intågan så kommer man att ha nytta av att känna till de objekten.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Några av skillnaderna mellan VBScript och VB.NET är:&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;VB.NET använder .vb som filextension istället för .vbs&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;VB.NET behöver kompileras innan det kan köras.&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;I VB.NET behöver man lägga in starten av programmet i en Sub med namnet Main&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;En stor fördel med att kompilera är att många fel kan hittas innan ni kör programmet, vilket är bättre än att scriptet beteer sig felaktigt under testning (mot produktionsmiljön)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Det många inte vet är att en VB.NET-kompilator följer med .NET Framework när det installeras, så man inte måste använda program som Visual Studio.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Step-by-step guide för att skriva ett "VB.NET-script"&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;1. Skapa en textfil med namnet hejsan.vb&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;2. Lägg in följande text i filen:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;Module MyModule&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp; Sub Main()&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Hejsan ITProffs")&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&amp;nbsp; End Sub&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;End Module&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;3. Kör c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\vbc.exe hejsan.vb&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Du har nu skapat en fil med namnet hejsan.exe&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://itbloggen.se/cs/aggbug.aspx?PostID=506" width="1" height="1"&gt;</content><author><name>bjorn.osterman</name><uri>http://itbloggen.se/cs/members/bjorn.osterman/default.aspx</uri></author><category term=".NET" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/.NET/default.aspx" /><category term="Svenska" scheme="http://itbloggen.se/cs/blogs/bjrn_stermans_blog/archive/tags/Svenska/default.aspx" /></entry></feed>