Finding and using .Net code to work with Powershell

This topic contains 9 replies, has 5 voices, and was last updated by  Graham Beer 2 years, 4 months ago.

  • Author
  • #34473

    Graham Beer

    I've been looking through Kent Agerlund SCCM tools module and came across this :

    Function Set-CMCollectionQueryRule
             [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site Server")]
             [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site code")]
             [Parameter(Mandatory=$True,HelpMessage="Please Enter the query for collection")]
             [Parameter(Mandatory=$True,HelpMessage="Please Enter the query name")]
             [Parameter(Mandatory=$True,HelpMessage="Please Enter the query type eg. User or Device")]
             [Parameter(Mandatory=$True,HelpMessage="Please Enter the collection name where do you want to set new rule")]
         $Class = "SMS_CollectionRuleQuery"
            "User" {$QueryTypeNumber = 1}
            "Device" {$QueryTypeNumber = 2}
         If(($RuleCollection = Get-CMCollection -SiteCode $SiteCode -SiteServer $SiteServer -Filter "Name='$CollectionName' and CollectionType='$QueryTypeNumber'") -eq $Null){
             Write-Host "There is no such $QueryType collection like: $CollectionName"
            If((Get-CMQueryValidation -SiteCode $SiteCode -SiteServer $SiteServer -Query $Query)){
                $ColRules += ([WMI]$RuleCollection.__PATH).CollectionRules
                    $NewRule = ([WMIClass]"\\$SiteServer\root\SMS\Site_$($SiteCode):$Class").CreateInstance()
                    $NewRule.QueryExpression = $Query
                    $NewRule.RuleName = $QueryName
                      $ColRules += [System.Management.ManagementBaseObject]$NewRule
                    $RuleCollection.CollectionRules = $ColRules
                    Write-Host "Error: $($_.Exception.Message)"
                Write-Host "Please check your query rule syntax"

    I saw the use of this command

    $ColRules += [System.Management.ManagementBaseObject]$NewRule

    How would you know to use this .net type ? I know people will say google and look at the MSDN documentation, but that can be confusing. How would I know that I need a .net type to over come a problem or enhance a script ? I see a lot of snippets of .net in peoples script and wonder how they work out how to use this sort of thing ? A .net background ?

  • #34474

    Tim Pringle

    Hi Graham,

    It's one of the classes used by WMI if i recall right.

    I don't have SCCM to hand, but I'm pretty certain that $newRule returns this type of object already. So it could literally just be that at one point he did.


    And saw the object type, and is forcing a cast.

    PowerShell's not a strongly typed language though, so it is not so often that you need to do casting, unless either you need to do a transformation of type that does not dynamically happen, or it is not supported by another method or property you need to use.

    The best way to check i think would be do use the code but without the


    cast. Put a breakpoint on the $ColRules += line, and then run the code.

    When it halts, enter

    $NewRule.GetType() | FL *

    into the console, and look for the FullName property.

  • #34478

    Dave Wyatt

    It's definitely a learning curve there. The .NET Framework is quite large, and you can always learn something more. However, you can tend to cheat a bit by searching the internet for examples of how to do something in C#, and then convert that code to PowerShell.

  • #34485

    Graham Beer

    Thanks Dave and Tim. It's certainly a big beast, just knowing when and how to use it to improve or do a function PowerShell can't natively do on its on.

  • #34490

    Thom Schumacher

    while we are on this topic of Dot net and using in powershell there are a few good posts on Using enumerations. That I really have found are useful for functions that you create in powershell especially for parameter validation.

    SEE these two posts:

    They are really cool when you are looking for something to help you with validating that you get the right data passed to your function.

  • #34528

    Graham Beer

    Thanks Thom. So trying to understand ENUM's.

    I found this description:

    "Enumerations are special sets of named values which all maps to a set of numbers, usually integers. They come in handy when you wish to be able to choose between a set of constant values, and with each possible value relating to a number, they can be used in a wide range of situations. As you will see in our example, enumerations are defined above classes, inside our namespace. This means we can use enumerations from all classes within the same namespace. "

    But can't quite get it to process in my head. Could anyone help simplify it? Also how is this useful?

    Thanks !

  • #34592

    Tim Pringle

    Probably the best way to summarise it is that you can have a piece of text that .NET actually translates into another type. It makes it easier to work with some items without having to remember specific values.

    A classic example of this would be colors. Instead of you having to specify RGB values for a lot of colours, you can use a name. Take Black, which has an RGB value of 0,0,0. Instead of having to provide those numbers, you can often refer to the color by name.

     $HOST.UI.RawUI.BackgroundColor= "Black"

    PowerShell handles finding out what Black actually represents and deals with the rest.

    A bit more advanced, but another use of Enums is for combining flags, where you can have a single object with multiple possibilities of values. Take mixing two well known colors together, red and blue. Without using enums, you'd need to look up the two RGB values and then run a function that performed this.

    Instead, with enums, you might be able to do something like this (ficticious example)

    $newcolor = [color]::red + [color]::blue

    SCCM uses enums quite a lot, so it's worthwhile looking into these like Thom said.

    Hope this helps!

  • #34594

    Graham Beer

    Sorry Tim, just getting my head around this. So if the enum [color] ? I thought this [ ] was the "type" ? Might have not processed this correctly.

  • #34599

    Tim Pringle

    No worries. I found a Scripting Guy article, which is a great read into enums and also has much better examples. Have a look at that.

  • #34612

    Graham Beer

    Thanks Tim, i'll have a read and play !
    Just wanted to add that i've looked at your website,, and how impressed i am, its great. It would be great to chat to you about Powershell and such. My e-mail is Thanks again for your help.

You must be logged in to reply to this topic.