PowerShell for Windows Admins


October 2, 2011  1:21 PM

PowerShell 3 and DHCP: scope options

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

In this post – http://msmvps.com/blogs/richardsiddaway/archive/2011/09/23/powershell-3-and-dhcp-2-scopes.aspx – we created a new DHCP scope.

Now we need to set some options on the scope. One of the main options we need to set is the DNS server

We can see the available options using

Get-DhcpServerv4OptionDefinition -ComputerName server02

This displays a list of the available options – remember that we can add our own so this isn’t necessarily a static list

The options that are set for the test scope are

PS> Get-DhcpServerv4OptionValue -ComputerName server02 -ScopeId 192.168.100.0

OptionId   Name            Type       Value                VendorClass     UserClass       PolicyName
——–   —-            —-       —–                ———–     ———       ———-
51         Lease           DWord      {86400}

The DNS server for this scope can be set like this

PS> Set-DhcpServerv4OptionValue -ComputerName server02 -ScopeId 192.168.100.0 `
-DnsServer 10.10.54.201

OptionId   Name            Type       Value                VendorClass     UserClass       PolicyName
——–   —-            —-       —–                ———–     ———       ———-
6          DNS Servers     IPv4Add… {10.10.54.201}

September 27, 2011  1:49 PM

WMI provider and MOF file

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

WMI is installed as a series of providers. The information on creating the classes comes from MOF files. I was recently asked about a problem with a specific class & could it be restored – in this case it was easier to rebuild WMI as the provider created a large part of the root\cimv2 namespace (namespaces can require multiple namespaces to complete their creation).

That got me thinking about how you discover the mof file associated with a class. Which leads to

$ns = "root\cimv2"            
$class = "Win32_Logicaldisk"            
            
            
$p = Get-WmiObject -Namespace $ns -Class $class |             
select -f 1 |             
select -ExpandProperty qualifiers |             
where {$_.Name -eq 'provider'}            
            
$class            
$p            
            
Get-ChildItem -Path C:\Windows\System32\wbem -Filter "*$($p.Value)*"

Get the first instance of a class, expand the qualifiers and select the qualifier with a name of provider.

Then perform a dir on the wbem folder to find the appropriate files. This isn’t infallible due to files names not necessarily being consistent but its a good starting point for the standard classes


September 25, 2011  1:35 PM

Proxy function for Get-WmiObject

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

There are many people who don’t like to see the WMI system properties

PS> Get-WmiObject -Class Win32_OperatingSystem | select __*

__GENUS          : 2
__CLASS          : Win32_OperatingSystem
__SUPERCLASS     : CIM_OperatingSystem
__DYNASTY        : CIM_ManagedSystemElement
__RELPATH        : Win32_OperatingSystem=@
__PROPERTY_COUNT : 63
__DERIVATION     : {CIM_OperatingSystem, CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER         : RSLAPTOP01
__NAMESPACE      : root\cimv2
__PATH           :
\\RSLAPTOP01\root\cimv2:Win32_OperatingSystem=@

Now one day we may get a version of Get-WmiObject that allows us to block their display but in the mean time we can create a proxy function.

Using the metaprogramming module from

http://blogs.msdn.com/powershell/archive/2009/01/04/extending-and-or-modifing-commands-with-proxies.aspx

I created a proxy function

New-ProxyCommand Get-WmiObject -CommandType All
-AddParameter NoSystemProperties > Get-WmiObject.ps1

This adds a parameter NoSystemProperties and outputs everything to a .ps1 file.

The details need to be added:

  1. turn the script into a function
  2. add the [switch] type to the property
  3. add the code to deal with the new parameter

 

if ($NoSystemProperties) {
[Void]$PSBoundParameters.Remove("NoSystemProperties")
$scriptCmd = {& $wrappedCmd @PSBoundParameters |
Select-Object -ExcludeProperty __*  -Property *|
Select-Object -ExcludeProperty Scope, Path, Options, ClassPath,
Properties, SystemProperties, Qualifiers, Site, Container -Property * }
}
else {
$scriptCmd = {& $wrappedCmd @PSBoundParameters }
}

If the NoSystemProperties parameter is given then remove it from the bound parameters and then run get-wmiobject, exclude the system properties and then exclude the other related properties

If the NoSystemProperties isn’t set then run as normal

function Get-WmiObject {            
            
[CmdletBinding(DefaultParameterSetName='query')]            
param(            
    [Parameter(ParameterSetName='query', Mandatory=$true, Position=0)]            
    [Parameter(ParameterSetName='list', Position=1)]            
    [System.String]            
    ${Class},            
            
    [Parameter(ParameterSetName='list')]            
    [Switch]            
    ${Recurse},            
            
    [Parameter(ParameterSetName='query', Position=1)]            
    [System.String[]]            
    ${Property},            
            
    [Parameter(ParameterSetName='query')]            
    [System.String]            
    ${Filter},            
            
    [Switch]            
    ${Amended},            
            
    [Parameter(ParameterSetName='query')]            
    [Parameter(ParameterSetName='WQLQuery')]            
    [Switch]            
    ${DirectRead},            
            
    [Parameter(ParameterSetName='list')]            
    [Switch]            
    ${List},            
            
    [Parameter(ParameterSetName='WQLQuery', Mandatory=$true)]            
    [System.String]            
    ${Query},            
            
    [Switch]            
    ${AsJob},            
            
    [Parameter(ParameterSetName='class')]            
    [Parameter(ParameterSetName='WQLQuery')]            
    [Parameter(ParameterSetName='query')]            
    [Parameter(ParameterSetName='list')]            
    [Parameter(ParameterSetName='path')]            
    [System.Management.ImpersonationLevel]            
    ${Impersonation},            
            
    [Parameter(ParameterSetName='WQLQuery')]            
    [Parameter(ParameterSetName='class')]            
    [Parameter(ParameterSetName='path')]            
    [Parameter(ParameterSetName='query')]            
    [Parameter(ParameterSetName='list')]            
    [System.Management.AuthenticationLevel]            
    ${Authentication},            
            
    [Parameter(ParameterSetName='class')]            
    [Parameter(ParameterSetName='list')]            
    [Parameter(ParameterSetName='path')]            
    [Parameter(ParameterSetName='WQLQuery')]            
    [Parameter(ParameterSetName='query')]            
    [System.String]            
    ${Locale},            
            
    [Parameter(ParameterSetName='query')]            
    [Parameter(ParameterSetName='WQLQuery')]            
    [Parameter(ParameterSetName='list')]            
    [Parameter(ParameterSetName='path')]            
    [Parameter(ParameterSetName='class')]            
    [Switch]            
    ${EnableAllPrivileges},            
            
    [Parameter(ParameterSetName='list')]            
    [Parameter(ParameterSetName='class')]            
    [Parameter(ParameterSetName='WQLQuery')]            
    [Parameter(ParameterSetName='path')]            
    [Parameter(ParameterSetName='query')]            
    [System.String]            
    ${Authority},            
            
    [Parameter(ParameterSetName='WQLQuery')]            
    [Parameter(ParameterSetName='path')]            
    [Parameter(ParameterSetName='class')]            
    [Parameter(ParameterSetName='query')]            
    [Parameter(ParameterSetName='list')]            
    [System.Management.Automation.PSCredential]            
    ${Credential},            
            
    [System.Int32]            
    ${ThrottleLimit},            
            
    [Parameter(ParameterSetName='list')]            
    [Parameter(ParameterSetName='WQLQuery')]            
    [Parameter(ParameterSetName='path')]            
    [Parameter(ParameterSetName='class')]            
    [Parameter(ParameterSetName='query')]            
    [Alias('Cn')]            
    [ValidateNotNullOrEmpty()]            
    [System.String[]]            
    ${ComputerName},            
            
    [Parameter(ParameterSetName='list')]            
    [Parameter(ParameterSetName='path')]            
    [Parameter(ParameterSetName='class')]            
    [Parameter(ParameterSetName='WQLQuery')]            
    [Parameter(ParameterSetName='query')]            
    [Alias('NS')]            
    [System.String]            
    ${Namespace},            
                
    [Switch]            
    ${NoSystemProperties})            
            
begin            
{            
    try {            
        $outBuffer = $null            
        if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer))            
        {            
            $PSBoundParameters['OutBuffer'] = 1            
        }            
        $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Get-WmiObject', [System.Management.Automation.CommandTypes]::Cmdlet)            
        if ($NoSystemProperties) {            
          [Void]$PSBoundParameters.Remove("NoSystemProperties")            
          $scriptCmd = {& $wrappedCmd @PSBoundParameters |             
             Select-Object -ExcludeProperty __*  -Property *|             
             Select-Object -ExcludeProperty Scope, Path, Options, ClassPath, Properties, SystemProperties, Qualifiers, Site, Container -Property * }            
        }            
        else {            
          $scriptCmd = {& $wrappedCmd @PSBoundParameters }            
        }              
        $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)            
        $steppablePipeline.Begin($PSCmdlet)            
    } catch {            
        throw            
    }            
}            
            
process            
{            
    try {            
        $steppablePipeline.Process($_)            
    } catch {            
        throw            
    }            
}            
            
end            
{            
    try {            
        $steppablePipeline.End()            
    } catch {            
        throw            
    }            
}            
            
<#

.ForwardHelpTargetName Get-WmiObject
.ForwardHelpCategory Cmdlet

#>            
            
}

The new function can be dot sourced or loaded from a module and because PowerShell runs functions before cmdlets it intercepts the cmdlet.

Get-WmiObject -Class Win32_OperatingSystem

Get-WmiObject -Class Win32_OperatingSystem –NoSystemProperties

then give us what we want.

The drawback is that using –NoSystemProperties we lose the methods but if you want them then you are either putting the results into an object or onto the pipeline in which case the system properties won’t be displayed.

Until we get a change to the cmdlet this will work.

Enjoy.


September 22, 2011  12:29 PM

PowerShell remoting and the customisation of remoting end points–recording

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

The recording of Aleksandar’s session for the UK user group

http://msmvps.com/blogs/richardsiddaway/archive/2011/09/08/powershell-user-group-20-september-2011.aspx

entitled

PowerShell remoting and the customisation of remoting end points

Is available from

https://skydrive.live.com/?cid=43cfa46a74cf3e96#!/?cid=43cfa46a74cf3e96&sc=documents&uc=1&id=43CFA46A74CF3E96%212927

 

The slides and demo scripts are included in the zip file.

The next meeting will be 25 Oct  2011 on WSMAN and WMI.  It is an extended version of the recent session I did for the pre-TechEd Australia PowerShell conference. As well as WMI and WSMAN we will have a look at the new remoting access methods in PowerShell v3. Details to follow.


September 21, 2011  2:20 PM

select-object quirk

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

I was working with the new CIM cmdlets in PowerShell 3 CTP and mistyped a command (as I thought)

Get-Cimclass win32_operatingsystem | select -ExpandProperty methods | select -f 1 select -ExpandProperty Qualifiers

 

My surprise was because of the two uses of select without a pipe between them.  It works, I don’t know why – but I don’t recommend it Smile


September 21, 2011  12:10 PM

PowerShell Deep Dive speakers

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

Some more sessions have been announced for the Deep Dive

http://www.theexpertsconference.com/europe/2011/powershell-deep-dive/session-abstracts/

The speaker line up includes:

Aleksandar Nikolic

Shay Levy

Kirk Munro

Dmitry Sotnikov

Jeffery Hicks

James Brundage

Tobias Weltner

Brandon Shell

James O’Neill

Ravi Chaganti

Me

 

There will also be a significant presence from the PowerShell team.

 

If you can’t get your PowerShell questions answered here – then you won’t get them answered


September 20, 2011  3:25 PM

PowerShell and DHCP: 1 – servers

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

Remember that yesterday I loaded the RSAT tools on to my Windows 8 server instance. This includes a PowerShell module that auto loads – like all Windows 8 modules on the PS module path

Start by looking at the GET commands

Get-Command -Module DhcpServer   get*

Get-DhcpServerAuditLog
Get-DhcpServerDatabase
Get-DhcpServerInDC
Get-DhcpServerSetting
Get-DhcpServerv4Binding
Get-DhcpServerv4Class
Get-DhcpServerv4DnsSetting
Get-DhcpServerv4ExclusionRange
Get-DhcpServerv4Failover
Get-DhcpServerv4Filter
Get-DhcpServerv4FilterList
Get-DhcpServerv4FreeIPAddress
Get-DhcpServerv4Lease
Get-DhcpServerv4OptionDefinition
Get-DhcpServerv4OptionValue
Get-DhcpServerv4Policy
Get-DhcpServerv4PolicyIPRange
Get-DhcpServerv4Reservation
Get-DhcpServerv4Scope
Get-DhcpServerv4ScopeStatistics
Get-DhcpServerv4Statistics
Get-DhcpServerv4Superscope
Get-DhcpServerv6Binding
Get-DhcpServerv6Class
Get-DhcpServerv6DnsSetting
Get-DhcpServerv6ExclusionRange
Get-DhcpServerv6FreeIPAddress
Get-DhcpServerv6Lease
Get-DhcpServerv6OptionDefinition
Get-DhcpServerv6OptionValue
Get-DhcpServerv6Reservation
Get-DhcpServerv6Scope
Get-DhcpServerv6ScopeStatistics
Get-DhcpServerv6StatelessStatis…
Get-DhcpServerv6StatelessStore
Get-DhcpServerv6Statistics
Get-DhcpServerVersion

 

This will keep us busy for a while and we haven’t looked at the other verbs!

Notice we don’t have a get-dhcpserver as such but we do have Get-DhcpServerVersion

 

PS> Get-DhcpServerVersion -ComputerName server02

MajorVersion : 6
MinorVersion : 1

 

PS> Get-WmiObject Win32_OperatingSystem -ComputerName server02 | fl Caption, version

Caption : Microsoft Windows Server 2008 R2 Datacenter
version : 6.1.7601

 

All we need is a bit of a wrapper function to decode the version numbers

 

also server settings

PS> Get-DhcpServerSetting -ComputerName server02

IsDomainJoined            : True
IsAuthorized              : True
DynamicBootp              : True
RestoreStatus             : False
ConflictDetectionAttempts : 0
NpsUnreachableAction      : Full
NapEnabled                : True
ActivatePolicies          :

 

Scopes are fairly important

 

PS> Get-DhcpServerv4Scope -ComputerName server02 | fl *

ScopeId          : 10.10.54.0
SubnetMask       : 255.255.255.0
StartRange       : 10.10.54.246
EndRange         : 10.10.54.250
ActivatePolicies :
Delay            : 0
Description      : Only used for new servers – before a static address is defined
LeaseDuration    : 04:00:00
MaxBootpClients  : 4294967295
Name             : NewServers
NapEnable        : True
NapProfile       :
State            : Active
SuperscopeName   :
Type             : Dhcp
ComputerName     :

 

There are IPv6 equivalent cmdlets as well

 

checking on free addresses

PS> Get-DhcpServerv4FreeIPAddress -ComputerName server02 -ScopeId "10.10.54.0"
10.10.54.246

 

PS> Get-DhcpServerv4FreeIPAddress -ComputerName server02 -ScopeId "10.10.54.0" -NumAddress 10
WARNING: The requested number of free IP addresses could not be found.
10.10.54.246
10.10.54.247
10.10.54.248
10.10.54.249
10.10.54.250

 

PS> Get-DhcpServerv4ScopeStatistics -ScopeId "10.10.54.0" -ComputerName server02 | fl *

ScopeId                       : 10.10.54.0
AddressesFree                 : 5
AddressesFreeOnPartnerServer  :
AddressesFreeOnThisServer     :
AddressesInUse                : 0
AddressesInUseOnPartnerServer :
AddressesInUseOnThisServer    :
PendingOffers                 : 0
PercentageInUse               : 0
ReservedAddress               : 0
SuperscopeName                :
ComputerName                  :

 

and finally

Get-DhcpServerv4Lease -ComputerName server02 -ScopeId "10.10.54.0"

will return the leases


September 20, 2011  12:34 PM

PowerShell 3 CTP1

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

Today’s big news is the release of CTP1 for PowerShell 3

http://www.microsoft.com/download/en/details.aspx?id=27548

It only runs on Windows 7 SP1 and Windows 2008 R2 SP1


September 19, 2011  12:54 PM

PowerShell 3 discovery

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

Having a quick look at the numbers of commands in PowerShell 3 on Windows 8 I get this

 

PS> (get-command -CommandType cmdlet).count
376
PS> (get-command -CommandType function).count
524

 

The numbers are even higher on Server 8 depending on what  features/roles you have loaded.

 

How do you keep track of all those commands – memorising 900 names is not going to happen never mind the reported 2000+ on the server.

The answer is to step up a level to the module. Remember the modules that are available or use

PS> Get-Module -ListAvailable

    Directory: C:\Scripts\Modules

ModuleType Name                      ExportedCommands
———- —-                      —————-
Manifest   SystemInfo                {Get-ComputerSystem, Get-OperatingSystem}

    Directory: C:\Windows\system32\WindowsPowerShell\v1.0\Modules

ModuleType Name                      ExportedCommands
———- —-                      —————-
Manifest   AppLocker                 {Set-AppLockerPolicy, Get-AppLockerPolicy, Test-AppLockerPolicy…
Manifest   Appx                      {Add-AppxPackage, Get-AppxPackageManifest, Get-AppxPackage…
Manifest   BitLocker                 {Get-EncryptableVolume, Get-EncryptableVolumes, Get-Protectors..
Manifest   BitsTransfer              {Add-BitsFile, Remove-BitsTransfer, Complete-BitsTransfer…
Manifest   BranchCache               {Add-BCDataCacheExtension, Clear-BCCache, Disable-BC…

 

Notice that the folder the module is contained is displayed – useful.

Alternatively refine the search

Get-Module -ListAvailable *dns*

One point to note is that Get-Module by default only shows the modules you’ve used!  A new PowerShell console shows

Microsoft.PowerShell.Core
Microsoft.PowerShell.Management

but

PS> get-module | select name

Name
—-
Microsoft.PowerShell.Core
Microsoft.PowerShell.Management
Microsoft.PowerShell.Utility

because we’ve used select-object


September 18, 2011  8:51 AM

DNS cmdlets in PowerShell 3

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

There are a number of modules related to DNS

ModuleType Name
———- —-
Manifest DnsClient
Manifest DnsConfig
Binary DnsLookup
Manifest DnsNrpt

If we start with the DnsClient module we get these functions and cmdlets

Add-DnsClientNrptRule
Clear-DNSClientCache
Get-DNSClient
Get-DNSClientCache
Get-DnsClientEffectiveNrptPolicy
Get-DnsClientNrptGlobal
Get-DnsClientNrptRule
Get-DNSGlobalSettings
Get-DNSServerAddress
Remove-DnsClientNrptRule
Set-DNSClient
Set-DnsClientNrptGlobal
Set-DnsClientNrptRule
Set-DNSGlobalSettings
Resolve-DnsName

Knowing which DNS server the client is using

PS> Get-DNSServerAddress | select ElementName, Name

ElementName Name
———– —-
Virtual Wireless 192.168.2.1
isatap.{E962BF88-1194-44A8-B30B-A65A4772C812} 192.168.2.1
Virtual LAN 10.10.54.201
isatap.{EA0AB201-1381-4643-A67D-72C9C8860860} 10.10.54.201
Loopback Pseudo-Interface 1 fec0:0:0:ffff::1
Loopback Pseudo-Interface 1 fec0:0:0:ffff::2
Loopback Pseudo-Interface 1 fec0:0:0:ffff::3

and what the client has cached

Get-DNSClientCache | select Name, data

Name data
—- —-
server02 192.168.2.1
server02 10.10.54.201
server02 192.168.1.6
server02.manticore.org 192.168.2.1
server02.manticore.org 10.10.54.201
server02.manticore.org 192.168.1.6
watson.telemetry.microsoft.com

final one for the moment – is a replacement for nslookup

PS> Resolve-DnsName exch07

IP4Address : 10.10.54.130
Name : exch07.Manticore.org
Type : A
CharacterSet : Unicode
Section : Answer
DataLength : 4
TTL : 1200


Forgot Password

No problem! Submit your e-mail address below. We'll send you an e-mail containing your password.

Your password has been sent to: