Code 99 at the Plate department !!

I guess every industry, business and programming language has its own set of “codes” that define what users and developers can understand from the documentation or standing instructions that they issue. Without this information – its is nigh on impossible to get to the root of what is be done (or what can be done) in various situations. (For an explanation of the title see the end of the article).

When I approach a new problem, situation or language – the first question I have to ask is – Do I have enough information before starting to make decisions?

Normally when this affects a programming language or framework I look around to see what others have said about it and what resources are available. I have always found that doing something the first time when you are not under pressure to deliver and experimenting in a controlled environment – gives a much better result the “second” time when it is actually required in anger.

So when looking for an understanding of programming language constructs and foibles – I look for an O’Reilly Cookbook or something similar on the subject.

For the Sentry project – I found what on the surface looked like a good candidate in Microsoft Powershell for the “soft wiring” of the project but wanted a clearer understanding of the approach that Powershell takes since it appears to be quite a broad “framework”. So in comes the O’Reilly Windows Powershell Cookbook.

The details of the book are :

PowerShell Cookbook

Title: Windows PowerShell Cookbook
Subtitle: for Windows, Exchange 2007, and MOM V3
First Edition: October 2007
ISBN 10: 0-596-52849-3
ISBN 13: 9780596528492
Pages: 584

The content of the book is :

Part I. Tour
A Guided Tour of Windows PowerShell
An Interactive Shell
Structured Commands (Cmdlets)
Deep Integration of Objects
Administrators As First-Class Users
Composable Commands
Techniques to Protect You from Yourself
Common Discovery Commands
Ubiquitous Scripting
Ad Hoc Development
Bridging Technologies
Namespace Navigation Through Providers
Much, Much More
Part II. Fundamentals
1. The Windows PowerShell Interactive Shell
1.0 Introduction
1.1 Run Programs, Scripts, and Existing Tools
1.2 Run a PowerShell Command
1.3 Customize Your Shell, Profile, and Prompt
1.4 Find a Command to Accomplish a Task
1.5 Get Help on a Command
1.6 Program: Search Help for Text
1.7 Invoke a PowerShell Script From Outside PowerShell
1.8 Program: Retain Changes to Environment Variables Set by a Batch File
1.9 Get the System Date and Time
1.10 Determine the Status of the Last Command
1.11 Measure the Duration of a Command
1.12 Customize the Shell to Improve Your Productivity
1.13 Program: Learn Aliases for Common Commands
1.14 Access and Manage Your Console History
1.15 Store the Output of a Command into a File
1.16 Add Information to the End of a File
1.17 Record a Transcript of Your Shell Session
1.18 Display the Properties of an Item As a List
1.19 Display the Properties of an Item As a Table
1.20 Manage the Error Output of Commands
1.21 Configure Debug, Verbose, and Progress Output
1.22 Extend Your Shell with Additional Snapins
1.23 Use Console Files to Load and Save Sets of Snapins
2. Pipelines
2.0 Introduction
2.1 Filter Items in a List or Command Output
2.2 Program: Simplify Most Where-Object Filters
2.3 Program: Interactively Filter Lists of Objects
2.4 Work with Each Item in a List or Command Output
2.5 Automate Data-Intensive Tasks
3. Variables and Objects
3.0 Introduction
3.1 Store Information in Variables
3.2 Access Environment Variables
3.3 Control Access and Scope of Variables and Other Items
3.4 Work with .NET Objects
3.5 Create an Instance of a .NET Object
3.6 Program: Create Instances of Generic Objects
3.7 Reduce Typing for Long Class Names
3.8 Use a COM Object
3.9 Learn About Types and Objects
3.10 Get Detailed Documentation About Types and Objects
3.11 Add Custom Methods and Properties to Objects
3.12 Add Custom Methods and Properties to Types
4. Looping and Flow Control
4.0 Introduction
4.1 Make Decisions with Comparison and Logical Operators
4.2 Adjust Script Flow Using Conditional Statements
4.3 Manage Large Conditional Statements with Switches
4.4 Repeat Operations with Loops
4.5 Add a Pause or Delay
5. Strings and Unstructured Text
5.0 Introduction
5.1 Create a String
5.2 Create a Multiline or Formatted String
5.3 Place Special Characters in a String
5.4 Insert Dynamic Information in a String
5.5 Prevent a String from Including Dynamic Information
5.6 Place Formatted Information in a String
5.7 Search a String for Text or a Pattern
5.8 Replace Text in a String
5.9 Convert a String to Upper/Lowercase
5.10 Trim a String
5.11 Format a Date for Output
5.12 Program: Convert Text Streams to Objects
5.13 Generate Large Reports and Text Streams
6. Calculations and Math
6.0 Introduction
6.1 Perform Simple Arithmetic
6.2 Perform Complex Arithmetic
6.3 Measure Statistical Properties of a List
6.4 Work with Numbers As Binary
6.5 Simplify Math with Administrative Constants
6.6 Convert Numbers Between Bases
Part III. Common Tasks
7. Simple Files
7.0 Introduction
7.1 Get the Content of a File
7.2 Search a File for Text or a Pattern
7.3 Parse and Manage Text-Based Logfiles
7.4 Parse and Manage Binary Files
7.5 Create a Temporary File
7.6 Search and Replace Text in a File
8. Structured Files
8.0 Introduction
8.1 Access Information in an XML File
8.2 Perform an XPath Query Against an XML File
8.3 Modify Data in an XML File
8.4 Easily Import and Export Your Structured Data
8.5 Store the Output of a Command in a CSV File
8.6 Import Structured Data from a CSV File
8.7 Use Excel to Manage Command Output
9. Internet-Enabled Scripts
9.0 Introduction
9.1 Download a File from the Internet
9.2 Download a Web Page from the Internet
9.3 Program: Get-PageUrls
9.4 Program: Connect-WebService
9.5 Export Command Output As a Web Page
9.6 Program: Send an Email
9.7 Program: Interact with Internet Protocols
10. Code Reuse
10.0 Introduction
10.1 Write a Script
10.2 Write a Function
10.3 Write a Script Block
10.4 Return Data from a Script, Function, or Script Block
10.5 Place Common Functions in a Library
10.6 Access Arguments of a Script, Function, or Script Block
10.7 Access Pipeline Input
10.8 Write Pipeline-Oriented Scripts with Cmdlet Keywords
10.9 Write a Pipeline-Oriented Function
11. Lists, Arrays, and Hashtables
11.0 Introduction
11.1 Create an Array or List of Items
11.2 Create a Jagged or Multidimensional Array
11.3 Access Elements of an Array
11.4 Visit Each Element of an Array
11.5 Sort an Array or List of Items
11.6 Determine Whether an Array Contains an Item
11.7 Combine Two Arrays
11.8 Find Items in an Array That Match a Value
11.9 Remove Elements from an Array
11.10 Find Items in an Array Greater or Less Than a Value
11.11 Use the ArrayList Class for Advanced Array Tasks
11.12 Create a Hashtable or Associative Array
11.13 Sort a Hashtable by Key or Value
12. User Interaction
12.0 Introduction
12.1 Read a Line of User Input
12.2 Read a Key of User Input
12.3 Program: Display a Menu to the User
12.4 Display Messages and Output to the User
12.5 Provide Progress Updates on Long-Running Tasks
12.6 Write Culture-Aware Scripts
12.7 Program: Invoke a Script Block with Alternate Culture Settings
12.8 Access Features of the Host’s User Interface
12.9 Program: Add a Graphical User Interface to Your Script
13. Tracing and Error Management
13.0 Introduction
13.1 View the Errors Generated by a Command
13.2 Handle Warnings, Errors, and Terminating Errors
13.3 Output Warnings, Errors, and Terminating Errors
13.4 Debug a Script
13.5 Collect Detailed Traces of a Script or Command
13.6 Program: Analyze a Script’s Performance Profile
14. Environmental Awareness
14.0 Introduction
14.1 View and Modify Environment Variables
14.2 Access Information About Your Command’s Invocation
14.3 Program: Investigate the InvocationInfo Variable
14.4 Find Your Script’s Name
14.5 Find Your Script’s Location
14.6 Find the Location of Common System Paths
14.7 Program: Search the Windows Start Menu
14.8 Get the Current Location
14.9 Safely Build File Paths Out of Their Components
14.10 Interact with PowerShell’s Global Environment
15. Extend the Reach of Windows PowerShell
15.0 Introduction
15.1 Access Windows Management Instrumentation Data
15.2 Program: Determine Properties Available to WMI Filters
15.3 Program: Search for WMI Classes
15.4 Use .NET to Perform Advanced WMI Tasks
15.5 Convert a VBScript WMI Script to PowerShell
15.6 Automate Programs Using COM Scripting Interfaces
15.7 Program: Query a SQL Data Source
15.8 Access Windows Performance Counters
15.9 Program: Invoke Native Windows API Calls
15.10 Program: Add Inline C# to Your PowerShell Script
15.11 Access a .NET SDK Library
15.12 Create Your Own PowerShell Cmdlet
15.13 Add PowerShell Scripting to Your Own Program
16. Security and Script Signing
16.0 Introduction
16.1 Enable Scripting Through an Execution Policy
16.2 Sign a PowerShell Script or Formatting File
16.3 Program: Create a Self-Signed Certificate
16.4 Manage PowerShell Security in an Enterprise
16.5 Verify the Digital Signature of a PowerShell Script
16.6 Securely Handle Sensitive Information
16.7 Securely Request Usernames and Passwords
16.8 Program: Start a Process As Another User
16.9 Securely Store Credentials on Disk
16.10 Access User and Machine Certificates
16.11 Program: Search the Certificate Store
Part IV. Administrator Tasks
17. Files and Directories
17.0 Introduction
17.1 Find All Files Modified Before a Certain Date
17.2 Clear or Remove a File
17.3 Manage and Change the Attributes of a File
17.4 Get the Files in a Directory
17.5 Find Files That Match a Pattern
17.6 Manage Files That Include Special Characters
17.7 Program: Get Disk Usage Information
17.8 Determine the Current Location
17.9 Monitor a File for Changes
17.10 Program: Get the MD5 or SHA1 Hash of a File
17.11 Create a Directory
17.12 Remove a File or Directory
17.13 Rename a File or Directory
17.14 Move a File or Directory
17.15 Get the ACL of a File or Directory
17.16 Set the ACL of a File or Directory
17.17 Program: Add Extended File Properties to Files
17.18 Program: Create a Filesystem Hard Link
17.19 Program: Create a ZIP Archive
18. The Windows Registry
18.0 Introduction
18.1 Navigate the Registry
18.2 View a Registry Key
18.3 Modify or Remove a Registry Key Value
18.4 Create a Registry Key Value
18.5 Remove a Registry Key
18.6 Add a Site to an Internet Explorer Security Zone
18.7 Modify Internet Explorer Settings
18.8 Program: Search the Windows Registry
18.9 Get the ACL of a Registry Key
18.10 Set the ACL of a Registry Key
18.11 Work with the Registry of a Remote Computer
18.12 Program: Get Registry Items from Remote Machines
18.13 Program: Get Properties of Remote Registry Keys
18.14 Program: Set Properties of Remote Registry Keys
18.15 Discover Registry Settings for Programs
19. Comparing Data
19.0 Introduction
19.1 Compare the Output of Two Commands
19.2 Determine the Differences Between Two Files
19.3 Verify Integrity of File Sets
20. Event Logs
20.0 Introduction
20.1 List All Event Logs
20.2 Get the Newest Entries from an Event Log
20.3 Find Event Log Entries with Specific Text
20.4 Retrieve a Specific Event Log Entry
20.5 Find Event Log Entries by Their Frequency
20.6 Back Up an Event Log
20.7 Create or Remove an Event Log
20.8 Write to an Event Log
20.9 Access Event Logs of a Remote Machine
21. Processes
21.0 Introduction
21.1 List Currently Running Processes
21.2 Launch a Process
21.3 Stop a Process
21.4 Program: Invoke a PowerShell Expression on a Remote Machine
22. System Services
22.0 Introduction
22.1 List All Running Services
22.2 Manage a Running Service
22.3 Access Services on a Remote Machine
23. Active Directory
23.0 Introduction
23.1 Test Active Directory Scripts on a Local Installation
23.2 Create an Organizational Unit
23.3 Get the Properties of an Organizational Unit
23.4 Modify Properties of an Organizational Unit
23.5 Get the Children of an Active Directory Container
23.6 Create a User Account
23.7 Program: Import Users in Bulk to Active Directory
23.8 Search for a User Account
23.9 Get and List the Properties of a User Account
23.10 Modify Properties of a User Account
23.11 Create a Security or Distribution Group
23.12 Search for a Security or Distribution Group
23.13 Get the Properties of a Group
23.14 Find the Owner of a Group
23.15 Modify Properties of a Security or Distribution Group
23.16 Add a User to a Security or Distribution Group
23.17 Remove a User from a Security or Distribution Group
23.18 List a User’s Group Membership
23.19 List the Members of a Group
23.20 List the Users in an Organizational Unit
23.21 Search for a Computer Account
23.22 Get and List the Properties of a Computer Account
24. Enterprise Computer Management
24.0 Introduction
24.1 Program: List Logon or Logoff Scripts for a User
24.2 Program: List Startup or Shutdown Scripts for a Machine
24.3 Enable or Disable the Windows Firewall
24.4 Open or Close Ports in the Windows Firewall
24.5 Program: List All Installed Software
24.6 Uninstall an Application
24.7 Manage Scheduled Tasks on a Computer
24.8 Retrieve Printer Information
24.9 Retrieve Printer Queue Statistics
24.10 Manage Printers and Print Queues
24.11 Determine Whether a Hotfix Is Installed
24.12 Program: Summarize System Information
24.13 Renew a DHCP Lease
24.14 Assign a Static IP Address
24.15 List All IP Addresses for a Computer
24.16 List Network Adapter Properties
25. Manage an Exchange 2007 Server
25.0 Introduction
25.1 Experiment with Exchange Management Shell
25.2 Automate Wizard-Guided Tasks
25.3 Manage Exchange Users
25.4 Manage Mailboxes
25.5 Manage Distribution Groups
25.6 Manage Transport Rules
25.7 Manage Outlook Web Access
26. Manage an Operations Manager 2007 Server
26.0 Introduction
26.1 Experiment with the Command Shell
26.2 Manage Operations Manager Agents
26.3 Schedule a Maintenance Window
26.4 Get, Install, and Uninstall Management Packs
26.5 Enable or Disable Rules
26.6 List and Start Tasks
26.7 Manage Alerts
Part V. References
A. PowerShell Language and Environment
Commands and Expressions
Arrays and Lists
Hashtables (Associative Arrays)
Simple Operators
Comparison Operators
Conditional Statements
Looping Statements
Working with the .NET Framework
Writing Scripts, Reusing Functionality
Managing Errors
Formatting Output
Capturing Output
Tracing and Debugging
Common Customization Points
B. Regular Expression Reference
C. PowerShell Automatic Variables
D. Standard PowerShell Verbs
E. Selected .NET Classes and Their Uses
F. WMI Reference
G. Selected COM Objects and Their Uses
H. .NET String Formatting
Standard Numeric Format Strings
Custom Numeric Format Strings
I. .NET DateTime Formatting

Conclusion :

As you can see the content ranges all over the areas that Powershell currently covers and the examples of code given also lead you in directions that they may not have intentionally meant to but overall I would definitely recommend this to a programmer starting into Powershell work and wanting to get the range and depth that Powershell can be used for in simple and not so simple scripting.

PS – the title for the article came as a result of a visit to the furniture store IKEA recently opened in Belfast. Overheard on the tannoy was the announcement “Code 99 in the plate department” which resulted in two things – several staff scurrying off in the general direction of that department and several people smiling at the announcement and wondering what the heck it meant.

In the words of that announcer – “The Code 99 is terminated”.

PPS – I have been advised that the Code 99 is a lost child announcement !!