Skip to main content

Posts

Showing posts from 2017

How to Compress an NTFS Folder with PowerShell

Yes, I am actually taking a few minutes to write a blog entry.  I was taking a year off but I'm having to much fun teaching my 90th PowerShell class right now.  Here is a quick and easy question.  "How do I compress a folder with PowerShell?" We have a target of E:\Mod01 .  Here is the command. Get-CimInstance -Query "SELECT * FROM CIM_Directory WHERE Name = 'E:\\Mod01'" |     Invoke-CimMethod -MethodName Compress The CIM_Directory class has all that we need.  The filter of 'E:\\Mod01' is not a typo.  We need to escape the backslash with another backslash.  This isolate the target so we do not compress other folders.  This object is passed to Invoke-CimMethod   where we call the Compress  method.  Nice and easy.  Remember to always verify that you are executing methods only against your intended target or really bad things can happen.

Adding Header Data to CSV Files

Don’t you just hate it when you get partial information?  With information systems, you would think that you would get everything you need.  It is like when I ask one of my Sailors why they are late and I have to ask a half dozen more questions before I get the full story. (Insert rolling eyes). A neat thing that I do to demonstrate to my advance PowerShell classes is how to make a GUI using SAPIEN PowerShell Studio.  Yes, I know. PowerShell was not supposed to be ran in a GUI.  Try asking a non-technical user to execute something at the command line.  I would rather visit the dentist.  Placing a pretty GUI on top of the code fools them into wanting to use it. For our stock application, We download information from Yahoo Finance.  Go ahead and execute the code below. $Sym = "Msft" $URL = "http://finance.yahoo.com/d/quotes.csv?s= $Sym &f=snl1ghjkvw4P2" Invoke-RestMethod -Uri $URL "Msft","Microsoft Corporation",72.58,

New Syntax for Hash Tables with Select-Object

Wow!  I am actually getting around to blogging this year.  This has been an epic year in terms of how busy I have been.  Between speaking at both the PowerShell Conferences in Europe and Asia, but also expanding my client base in Asia and the Pacific islands, I have been busy.  Oh, let’s not forget adding Windows Server 2016 classes, Security+ and my work on the Azure platform.  OK, yes I have been busy.  At some point, what I have been learning does get spilled over into my classes and this blog. One of the sticky points with learning PowerShell has been the creation of calculated properties with Select-Object.  To do so you need to use a hash table, associative table, or dictionary.  What you call it depends on your background.   Just remember that most IT pros who take my PowerShell classes are not programmers and have never been trained as such.  Makes for an interesting week for me.   Below is an example of how we have been teaching calculated properties. Get-Process

“The system cannot find the file specified” when Creating a Server-to-Server Replica Group

Today while doing a demonstration on deploying a server-to-server replica group on Windows Server 2016, I had a new error message pop up. New-SRPartnership : Unable to create replication group RG02, detailed reason: The system cannot find the file specified. What threw me off was the “ The system cannot find the file specified ”.  Well, here is the command that I used: New-SRPartnership `     -SourceComputerName LON-SVR1 `     -SourceRGName RG01 _`     -SourceVolumeName M: `     -SourceLogVolumeName N: `     -DestinationComputerName LON-SVR4 `     -DestinationRGName RG02 `     -DestinationVolumeName M: `     -DestinationLogVolumeName N: `     -Verbose I did not specify any file. I logged into LON-SVR4 and tried to look for the StorgeReplica log.  It was not present.  When I executed Get-WindowsFeature –Name Storage-Replica, it returned a state of InstallPending .  Problem solved. My code was executed from the other member of t

Change in Azure Cmdlets

I know.  Surprise!  I am actually sitting down to do some blogging.  It has been a very busy 2017.  Last week I just returned home from delivering 4 sessions at the PowerShell Conference in Europe.  The organizers did an outstanding job. We all had a great time.  I like to be prepared before speaking to an audience. A month before the conference, I had everything prepared.  Every line of code was thoroughly tested.  A week before the conference, I took a few days off in Venice, Italy and ran through everything one more time.  All the code worked.  24 hours prior to delivering one of my presentations, I ran through the code again and…. It broke. I started to receive errors like these two when trying to work with Azure. Save-AzureRmProfile : The term 'Save-AzureRmProfile' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. A

Determine which Nodes have UAC Enabled with PowerShell

Wow!  It has been a while since I last blogged.  This has been a very busy year. Between my Navy activities and all the classes that I’m bringing online for clients, I am burning the candle at both ends. As many of you know, my last day of a PowerShell class is “Project Day”.  One of the projects that I helped out with this week involved determining if UAC was enabled.  Utilizing the template we created in class and a check of the registry, we were able to:          Remote to each client.          Determine if the client was online.          Report back the state of UAC. I decided to advance the code just a little to make sure everything reports back as an object.  Below is that code.  Wish I had more time to explain it step by step, but I have to keep moving.  I only have 3 weeks to get everything done for PowerShell Conference Europe. ForEach ( $N in ( Get-ADComputer -filter * ) . Name) {     $Obj = New-Object -TypeName PSObject -Property @

Demonstrating Hashing a File

I’m spending the week in San Diego delivering a Security+ class as part of my Annual Training for the United States Navy.  It has been a few years since my last Security+ class that I delivered to the US Air Force.  Since then, PowerShell has undergone a few version updates.  I decided to leverage one of the new cmdlets to help use demonstrate file hashing. The group that we are working with this week is sharp and asking some really great questions.  There is a little confusion out there on what a hash is so I’m adding this to both my military and civilian Security+ classes.  Enjoy! <# Demonstration of using a hashing algorithm to verify file integrity. ITC J. Yoder NR SPAWAR 119 Creation Date: March 7, 2017 Slide: Symmetric Algorithms Notes: This code is designed to be ran inside of the PowerShell ISE. Select the code in each step and press F8. Tested on PowerShell 5.  Execute the command below to determine your PowerShell version. #&g

__error__ in PowerShell ISE

Wow, I finally got around to doing a little blogging.  This has thus far been a very busy year.  I’m actually writing this in the air heading to teach a PowerShell class in North Carolina and prepping my sessions for PowerShell Summit Europe in a few months.  When I start helping my students debug their issues in class, I often walk up to their monitors and see the error right away.  I am very cautious to point out at the beginning of class that the reason that I see their errors so fast is because I have made the same errors so often.  Here is one that left me scratching my head. While adding a valid parameter to a function that I was developing, I had this error in the ISE. I’ll be honest, this was a new one for me.  Looking at the message, I realized that there was a casting of string.  This pointed me to my param block. Sure enough, I placed a comma where I should not have. You can see it right after [String].  My bad.  Hey, all of us make mistakes.

Using functions with PowerShell Background Jobs Part 2 of 2

Yesterday we learned how to use the InitializationScript parameter of Start-Job . Today we are going to allow for further modularization of our code and send multiple functions to Start-Job .  We could very easily send multiple functions in the same script block, but I need to pick and choose which functions I will be working with for each process so I need to be able to send them separately.  Here is our code. $JobFunction1 = {   Function Beep  {     Param ( $Tone )     [ console ]::beep( $Tone , 200 )  } } $JobFunction2 = {   Function Beep2  {     Param ( $Tone , $Time )     [ console ]::beep( $Tone , $Time )  } } $InitializationScript = $executioncontext .invokecommand.NewScriptBlock( " $JobFunction1 $JobFunction2 " ) $JobSplat = @{     Name = "Test1"     InitializationScript = $InitializationScript     ArgumentList = 300 , 400 , 200 } Start-Job @JobSplat -ScriptBlock {             Para

Using functions with PowerShell Background Jobs Part 1 of 2

Happy New Year everyone!  I am spending my New Years’ day working on some code that I’ve been putting off while the family has been in town.  Something about shoveling sunshine as opposed to shoveling snow.  I’m working on expanding some Azure code that I have developed and I’m looking at ways to further modularize the code.  Since I use Background jobs with script blocks to speed the processes that I am running, I’m looking at using the InitializationScript parameter of Start-Job . The InitializationScript parameter allows you to run code before the ScriptBlock parameter runs.  When you include functions inside of it, you are able to place those functions in the same memory that the ScriptBlock will execute in.  Let’s take a look at our code to set this up. First we create a variable that will hold our function that we will call from the background job. $JobFunctions = {   Function Beep  {     Param ( $Tone )     [ console ]::beep( $Tone , 200 )  } }