PowerShell for Windows Admins


June 23, 2013  5:57 AM

Opinion–automate or suffer

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

I was on a course last week and one attendee uttered words to this affect “I won’t automate – it takes to long to write the code. I’ll keep doing it manually”

You may be able to do it faster the first time by performing the task manually. I can guarantee that the second time my automation will be faster and by the third time I’ll have recovered the effort I made in automating.

IT is getting more complicated, with more dependencies and less time to set things up. If you want consistent, quick results – automate. if you don’t – you’re in the wrong business.

June 12, 2013  3:31 PM

Scripting Games – what’s wrong with this

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

I noticed code like this in quite a few entries in for Event 1

Get-ChildItem -path C:\Application\log -Recurse -Filter *.log | Where-Object{$_.LastWriteTime -lt [DateTime]::Now.Subtract([TimeSpan]::FromDays(90))} | ForEach-Object {…}

From the title it should be obvious that there’s something I don’t like.

The where-object re-calculates the date to test for EVERY object on the pipeline.

That’s not efficient.

Put the calculation outside your pipeline

$testdate = [DateTime]::Now.Subtract([TimeSpan]::FromDays(90))

or

$testdate = (get-date).AddDays(-90)

which I personally think is simpler

Your pipeline then becomes

Get-ChildItem -path C:\Application\log -Recurse -Filter *.log | Where-Object{$_.LastWriteTime –lt $testdate} | ForEach-Object {…}

Much simpler and more efficient.

I wonder if putting the calculation into the pipeline is part of the almost religious fervour surrounding the “one-liner”. if you can sensibly put your code into 1 line – read one pipeline because that’s what we’re really doing – then do so. But don’t make it more inefficient as a consequence.


June 10, 2013  3:13 PM

AD Management in a Month of Lunches–new MEAP

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

Chapters 12 and 13 have been added to the Manning Early Access Program

Chapter 12 shows you how to manage your domain controllers

Chapter 13 teaches how to protect the data in your Active Directory

You can order the MEAP from www.manning.com/siddaway3


June 8, 2013  5:49 AM

Creating DNS PTR records

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

When I was writing the DNS chapter of PowerShell in Practice I couldn’t get the CreateInstanceFromPropertyData method on the MicrosoftDNS_PTRType class to work. Revisiting DNS for AD management in a Month of lunches this time round I have access to the CIM cmdlets so can put the parameter names in. This gives usage like this. I’ve shown Invoke-WmiMethod and Invoke-CimMethod so you can see the parameter names:

Invoke-WmiMethod -Namespace root\MicrosoftDNS -Class MicrosoftDNS_PTRType `
-Name CreateInstanceFromPropertyData `
-ArgumentList “175.168.192.in-addr.arpa”, ‘server02′, ’55.175.168.192.in-addr.arpa’,
“ADMLServer02.admldns.test”

Invoke-CimMethod -Namespace root\MicrosoftDNS -ClassName MicrosoftDNS_PTRType `
-MethodName CreateInstanceFromPropertyData `
-Arguments @{Containername = “175.168.192.in-addr.arpa”;
DnsServerName = ‘server02′; OwnerName = ’55.175.168.192.in-addr.arpa’;
PTRDomainName =”ADMLServer02.admldns.test”}

If you have access to Windows 2012 then you are better off using the cmdlet

Add-DnsServerResourceRecordPtr –Name ‘54’ `
–ZoneName “175.168.192.in-addr.arpa” `
–PtrDomainName ‘ADMLServer01.admldns.test’ `
–ComputerName server02

Which ever method you use – you can easily create PTR records


May 26, 2013  3:32 AM

Scripting Games-Voting

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

Still time to vote on event 4 – the numbers of votes are falling off slightly – especially in the Advanced events. This is your opportunity to observe what other people are doing, comment and very possibly learn.


May 24, 2013  2:07 PM

PowerShell Deep Dive–MEAP now complete

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

The final chapters of PowerShell Deep Dive have been added to the MEAP

http://www.manning.com/hicks/

Enjoy


May 24, 2013  2:00 PM

AD Month of Lunches–Chapter 11 in MEAP

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

The MEAP for AD Management in a Month of Lunches has been extended with the inclusion of chapter 11 – Creating Domain Controllers.

www.manning.com/siddaway3

Enjoy


May 21, 2013  3:49 PM

Scripting Games – Filter early again

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

Grading the scripts in Event 4 and the one thing that jumps out is the amount of unnecessary data being carried through the scripts

You were asked for 7 properties off 20 random users

Get-ADUser has a –properties parameter. USE it to restrict the properties you return. You don’t NEED all the other properties

Next select you 20 users as soon as possible

get-aduser | get-random

will do that. You can then format just the few properties you need on the 20 objects you have left

FILTER EARLY


May 20, 2013  3:50 PM

Scripting Games – Win32_LogicalDisk or Win32_Volume

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

I have heard some discussions recently regarding whether Win32_LogicalDisk or Win32_Volume should be used in the answer to event 3 in the Scripting Games.

The problem requires you pull the drive letter, drive size and freespace for local disks on the server. Notice the emphasis – that will be important.

Looking at Win32_Volume

PS> Get-CimClass -ClassName Win32_Volume | select -ExpandProperty CimClassproperties | select Name

Name
—-
Caption
Description
InstallDate
Name
Status
Availability
ConfigManagerErrorCode
ConfigManagerUserConfig
CreationClassName
DeviceID
ErrorCleared
ErrorDescription
LastErrorCode
PNPDeviceID
PowerManagementCapabilities
PowerManagementSupported
StatusInfo
SystemCreationClassName
SystemName
Access
BlockSize
ErrorMethodology
NumberOfBlocks
Purpose
Automount
BootVolume
Capacity
Compressed
DirtyBitSet
DriveLetter
DriveType
FileSystem
FreeSpace
IndexingEnabled
Label
MaximumFileNameLength
PageFilePresent
QuotasEnabled
QuotasIncomplete
QuotasRebuilding
SerialNumber
SupportsDiskQuotas
SupportsFileBasedCompression
SystemVolume

You see 3 properties that might be of use

Get-CimInstance -ClassName Win32_Volume | select DriveLetter, Capacity, FreeSpace

is a start but I get two drives with no capacity & freespace – must by my DVD drives

I can filter those out using drive type. DriveType =3 gives me local disks

So the WMI call I need is

Get-CimInstance -ClassName Win32_Volume -Filter “DriveType=3″ | select DriveLetter, Capacity, FreeSpace

Get-WmiObject -Class Win32_Volume -Filter “DriveType=3″ | select DriveLetter, Capacity, FreeSpace

Now lets look at Win32_LogicalDisk

PS> Get-CimClass -ClassName Win32_Logicaldisk | select -ExpandProperty CimClassproperties | select Name

Name
—-
Caption
Description
InstallDate
Name
Status
Availability
ConfigManagerErrorCode
ConfigManagerUserConfig
CreationClassName
DeviceID
ErrorCleared
ErrorDescription
LastErrorCode
PNPDeviceID
PowerManagementCapabilities
PowerManagementSupported
StatusInfo
SystemCreationClassName
SystemName
Access
BlockSize
ErrorMethodology
NumberOfBlocks
Purpose
FreeSpace
Size
Compressed
DriveType
FileSystem
MaximumComponentLength
MediaType
ProviderName
QuotasDisabled
QuotasIncomplete
QuotasRebuilding
SupportsDiskQuotas
SupportsFileBasedCompression
VolumeDirty
VolumeName
VolumeSerialNumber

I can’t find a DriveLetter but I know that DeviceId supplies that information – if in doubt check by displaying all properties of one instance or do this

PS> Get-CimInstance -ClassName Win32_Logicaldisk | ft -a

DeviceID DriveType ProviderName VolumeName Size FreeSpace
——– ——— ———— ———- —- ———
C: 3 249951154176 146292559872
D: 3 System Reserved 104853504 69279744
E: 2
F: 5

Drivetype matches with Win32_Volume so we get

Get-CimInstance -ClassName Win32_Logicaldisk | Select Deviceid, Size, FreeSpace
Get-WmiObject -Class Win32_Logicaldisk | Select Deviceid, Size, FreeSpace

You’ll have noticed that D: has a volume name of System Reserved. This means its a system disk that you shouldn’t be touching. Technically the event asked for information on local disks so it should be included. I know that some purists will argue against this so to remove the system volume you can

PS> Get-CimInstance -ClassName Win32_Volume -Filter “DriveType=3 AND SystemVolume = $false” | select DriveLetter, Capacity, FreeSpace

or

PS> Get-CimInstance -ClassName Win32_Logicaldisk -Filter “DriveType = 3 AND VolumeName ‘System Reserved’” | select DeviceId, Size, FreeSpace

So either will give you the results you need. You just need to dig into the classes a bit.


May 16, 2013  12:56 PM

Scripting Games-Subfunctions

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

One of the principles of writing scripts (or any code) is the KISS principle – Keep It Simple Scripter.

That principle is being abused al lot in event 3

I am seeing numerous entries that define an advanced function as the solution and then inside the PROCESS block define one or more functions. You PROCESS block is executed once for EVERY object on your pipeline. For 1 object might not matter but for 100s of objects it will adversely affect performance.

The solutions are such that they sensibly fit in a single solution. If you must define additional functions make the solution a module so you only load them once.


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: