Difference between revisions of "Windows Server Scripting"

From csn
Jump to navigation Jump to search
 
(10 intermediate revisions by one other user not shown)
Line 11: Line 11:
 
The ISE will have 2 panes. The top pane is an editor for writing scripts,  and the bottom pane is simply a command shell. You can type commands directly into that pane in the same way that you would use a command line. Try the “get-help” command in this pane to see it in action.
 
The ISE will have 2 panes. The top pane is an editor for writing scripts,  and the bottom pane is simply a command shell. You can type commands directly into that pane in the same way that you would use a command line. Try the “get-help” command in this pane to see it in action.
 
   
 
   
PowerShell was designed for automating tasks in the Windows environment. Furthermore, as of 2016, Microsoft released PowerShell as open source, which means that you can run PowerShell on Linux as can you can see in the image to the right.
+
PowerShell was designed for automating tasks in the Windows environment. Furthermore, as of 2016, Microsoft released PowerShell as open source, which means that you can run PowerShell on Linux as can you can see in the image to the right
  
 
[[File:PowerShell_on_Linux.png|right|thumb|x300px|alt=Microsoft PowerShell on Linux| Microsoft PowerShell on Linux]]
 
[[File:PowerShell_on_Linux.png|right|thumb|x300px|alt=Microsoft PowerShell on Linux| Microsoft PowerShell on Linux]]
  
==== PowerShell “Hello World” ====  
+
== PowerShell “Hello World” ==
  
Start by opening Windows Powershell ISE. Remember to right-click and "Run as Administrator".
+
Any windows server machine, such as one that you access through: https://portal.azure.com/ will work for this activity. If you are running Windows natively then you can choose to use that, alternatively, you can load up a Windows Server image and the RDP in. After this, start by opening Windows Powershell ISE. Remember to right-click and "Run as Administrator".
  
 
Our very first PS script is a one liner. Using the write-host command create a script to write “Hello World” to the console. If you are unsure, you can first try “get-help write-host” in the command prompt pane.
 
Our very first PS script is a one liner. Using the write-host command create a script to write “Hello World” to the console. If you are unsure, you can first try “get-help write-host” in the command prompt pane.
Line 40: Line 40:
 
As you’ll see many of these have aliases that are identical to Linux, try things like rm, cp, mv, ps or kill
 
As you’ll see many of these have aliases that are identical to Linux, try things like rm, cp, mv, ps or kill
  
==== Powershell Basic Backup ====  
+
== Powershell Basic Backup ==
  
 
Before we get started let's install the iis webserver. Click this [https://csn.murdoch.edu.au/mediawiki/index.php/Windows_Server_in_EC2_Intro#Running_a_Webserver_on_Windows_.28IIS.29 link] to see the instructions.
 
Before we get started let's install the iis webserver. Click this [https://csn.murdoch.edu.au/mediawiki/index.php/Windows_Server_in_EC2_Intro#Running_a_Webserver_on_Windows_.28IIS.29 link] to see the instructions.
Line 49: Line 49:
 
  $destination = "C:\Users\User\Documents\"
 
  $destination = "C:\Users\User\Documents\"
 
  Copy-item $source $destination -Recurse
 
  Copy-item $source $destination -Recurse
 +
 +
If you get an error message about the server execution policy then you can rectify this by typing the following into the command line:
 +
 +
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
  
 
Take a look at the contents of
 
Take a look at the contents of
Line 54: Line 58:
 
   C:\Users\User\Documents
 
   C:\Users\User\Documents
  
==== Inserting dates and zipping ====
+
== Inserting dates and zipping ==
  
The following is a pretty good starting point. Lets just get PowerShell to dynamically insert a date and time and then we can schedule the backup. Run the following code snippet independently. I created in the Powershell editor and saved it as powershell_backup_script.ps1 and then executed it from the powershell command line by typing its name.
+
The following is a pretty good starting point. Lets just get PowerShell to dynamically insert a date and time and then we can schedule the backup. Run the following code snippet independently. I created in the Powershell editor and saved it as powershell_backup_script.ps1 and then executed it from the powershell command line by typing its name. Make sure that the username, in this case Administrator, is correct.
  
 
<pre>
 
<pre>
Line 68: Line 72:
 
  [io.compression.zipfile]::CreateFromDirectory($Source, $destination)
 
  [io.compression.zipfile]::CreateFromDirectory($Source, $destination)
 
</pre>
 
</pre>
 
If you get an error message about the server execution policy then you can rectify this by typing the following into the command line:
 
 
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
 
  
 
Try running the snippet below. Make sure you understand what it is doing before moving on.
 
Try running the snippet below. Make sure you understand what it is doing before moving on.
  
==== Naming a file dynamically with the date ====
+
== Naming a file dynamically with the date ==
  
 
<pre>
 
<pre>
Line 89: Line 89:
 
Hack the two code snippets together to create a powershell script that will create a zip file of a directory and copy this to another directory. Hint: When assigning values to a variable you can join strings and variables together using the "+" operator.
 
Hack the two code snippets together to create a powershell script that will create a zip file of a directory and copy this to another directory. Hint: When assigning values to a variable you can join strings and variables together using the "+" operator.
  
==== Schedule the task ====
+
== Schedule the task ==
  
 
Use the example commands below to schedule task to run every 10 minutes. The command-line tool to do this is schtasks. Try it out on the command line:
 
Use the example commands below to schedule task to run every 10 minutes. The command-line tool to do this is schtasks. Try it out on the command line:
Line 113: Line 113:
 
  schtasks | findstr Backup
 
  schtasks | findstr Backup
  
=== Listing and Killing a process ===
+
== Listing and Killing a process ==
 +
 
 +
Open notepad from the command line.
  
 
We can get a list of processes using the “Get-Process” command. This simply displays a list of all processes running. Since the output might be a bit hard to follow, we will sort it using the “Sort-Object ID” command. Use the pipe symbol for separation “|”.
 
We can get a list of processes using the “Get-Process” command. This simply displays a list of all processes running. Since the output might be a bit hard to follow, we will sort it using the “Sort-Object ID” command. Use the pipe symbol for separation “|”.
 +
 +
Get-Process | Sort-Object ID
  
 
That one liner will give us a list of all processes, sorted by process ID. But that’s still not helping us to find a specific process in the list. The “findstr” command is similar to “grep” from Linux.  
 
That one liner will give us a list of all processes, sorted by process ID. But that’s still not helping us to find a specific process in the list. The “findstr” command is similar to “grep” from Linux.  
  
'''Can you build up on the command to only list processes that have the name “explorer”?'''
+
'''Can you build up on the command to only list processes that have the name “notepad”?'''
  
 
''Hint: There are two different ways that you can accomplish this task.''
 
''Hint: There are two different ways that you can accomplish this task.''
Line 135: Line 139:
 
  taskkill /pid 1234 /f
 
  taskkill /pid 1234 /f
  
 
+
== Powershell Loops ==
=== Powershell Loops ===
 
  
 
As you can see from the big list of commands (“get-commands”), PowerShell supports "for" and "while" loops as well as conditional statements. We will try out a basic for loop below. Instead of hardcoding the parameters for the loop, we based it on the size of an array, so if the array was bigger, then we would have more iterations of the loop.  
 
As you can see from the big list of commands (“get-commands”), PowerShell supports "for" and "while" loops as well as conditional statements. We will try out a basic for loop below. Instead of hardcoding the parameters for the loop, we based it on the size of an array, so if the array was bigger, then we would have more iterations of the loop.  
Line 155: Line 158:
 
'''Extra-task: Change the line that says testing, such that the program counts every iteration'''
 
'''Extra-task: Change the line that says testing, such that the program counts every iteration'''
  
=== Final Example: Take a break ===
+
== Final Example: Take a break ==
  
 
In this example, we’ll use the code snippet below to display a message every 30 minutes asking you to take a break. We’ll do this by using the task scheduling feature in Windows.
 
In this example, we’ll use the code snippet below to display a message every 30 minutes asking you to take a break. We’ll do this by using the task scheduling feature in Windows.
Line 182: Line 185:
 
  Disable-ScheduledTask -TaskName "Pop Up"
 
  Disable-ScheduledTask -TaskName "Pop Up"
  
== Shutting down ==
+
== Shutting down & Saving Power ==
  
 
Public access computers or computers where we know that people will not be using them after a certain hour. We can shut them down.
 
Public access computers or computers where we know that people will not be using them after a certain hour. We can shut them down.
Line 200: Line 203:
 
  shutdown /s
 
  shutdown /s
  
Obviously, this might be useful to shutdown all library, department computers to save power after 6:00 pm.  
+
Obviously, this might be useful to shutdown all library, department computers to save power after 6:00 pm.
 
 
=== Running Linux on Windows===
 
 
 
[[File:Linux_on_Windows.png|right|thumb|x350px|alt=Bash on Windows|Bash on Windows]]
 
 
 
In addition to releasing Powershell as open source, Microsoft are allowing the Linux Bash environment to operate on Windows. This means that existing bash scripts should run on Windows with minimal modifications.
 
 
 
Open the powershell ise and run:
 
 
 
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
 
 
 
After running this you will need to restart.
 
 
 
After your machine has restarted and you have re-connected. Open powershell ISE and get your distro using curl
 
 
 
curl.exe -L -o ubuntu-1604.appx https://aka.ms/wsl-ubuntu-1604
 
 
 
You can then install it with:
 
 
 
Add-AppxPackage .\ubuntu-1604.appx
 
 
 
After this, go to the start menu and search for ubuntu. Click on it to complete the installation. You will be asked to create a user.
 
 
 
Reflect on what you have just done. How is installing the ubuntu environment different from a virtual machine? Why would a corporation like Microsoft embrace what has historically been a competitor?
 
 
 
If you have some spare time, it would be worth reading about this to try to understand the reasons. This shift has been occurring for a few years now.
 
 
 
*https://arstechnica.com/gadgets/2020/05/microsofts-romance-with-open-source-software-on-display-at-build-2020/
 
*https://www.phoronix.com/scan.php?page=news_item&px=Microsoft-2018-Surprises
 
 
 
=== Troubleshooting installing the Linux Subsystem ===
 
 
 
If you have problems installing the Linux subsystem, please check out the alternative instructions here: https://csn.murdoch.edu.au/mediawiki/index.php/Obtaining_a_Linux_Environment#Windows
 

Latest revision as of 05:57, 14 May 2024

PowerShell Introduction

PowerShell is the newest and most powerful offering from Microsoft providing a command shell and configuration toolkit built on the .NET framework. More interesting still, is the fact that PowerShell also supports the management of network devices and Linux machines, and also can be installed on Linux. As you will see at the end of this lab, Linux can also be installed on Windows too.

Windows has a long history of supporting command line and scripting tools. Even before PowerShell arrived on the scene, the Windows Scripting Host (WSH) provided support for power users to develop their own scripts and interact directly with operating system objects.

PowerShell is here to stay. The current attitude is that if a proposed Windows Server feature does not integrate with PowerShell, then they won’t release it. This assures administrators that they will be able to perform all manner of administrative scripting tasks with current and future iterations of Windows Server. Similar to Linux Bash scripting, Powershell will initially seem quite daunting.

Let’s look at a few small examples. We will use the PowerShell integrated scripting environment (ISE), to write, debug and test our PowerShell scripts in one place. This is purely for ease of use, you may wish to use notepad or the editor of your choice and the results will be the same. You can find the ISE by searching for Powershell ISE. On both Linux and Windows systems, I have moved away from using the cursor to find applications. I simply hit Start and search.

The ISE will have 2 panes. The top pane is an editor for writing scripts, and the bottom pane is simply a command shell. You can type commands directly into that pane in the same way that you would use a command line. Try the “get-help” command in this pane to see it in action.

PowerShell was designed for automating tasks in the Windows environment. Furthermore, as of 2016, Microsoft released PowerShell as open source, which means that you can run PowerShell on Linux as can you can see in the image to the right

Microsoft PowerShell on Linux
Microsoft PowerShell on Linux

PowerShell “Hello World”

Any windows server machine, such as one that you access through: https://portal.azure.com/ will work for this activity. If you are running Windows natively then you can choose to use that, alternatively, you can load up a Windows Server image and the RDP in. After this, start by opening Windows Powershell ISE. Remember to right-click and "Run as Administrator".

Our very first PS script is a one liner. Using the write-host command create a script to write “Hello World” to the console. If you are unsure, you can first try “get-help write-host” in the command prompt pane. Now let’s move onto using a variable in this script. We can create a variable using the below syntax:

$myVariable=”ISEA” 

Now try and display this variable in the same way that you displayed the “Hello World” text. Ask your tutor if you get stuck. It is likely that running scripts may be disabled on your system. See if you can work out how to enable the execution of powershell scripts. http://www.faqforge.com/windows/windows-powershell-running-scripts-is-disabled-on-this-system/

You should have an ISE window like this, if not then remember to click the script arrow near the top right.
You should have an ISE window like this, if not then remember to click the script arrow near the top right.

You may be able to add:

write-host $myVariable

There are many more commands that we can use. If we want to see a big list we can invoke the:

get-command

operation on the command prompt in the bottom pane. You may then get individual help on specific commands.

As you’ll see many of these have aliases that are identical to Linux, try things like rm, cp, mv, ps or kill

Powershell Basic Backup

Before we get started let's install the iis webserver. Click this link to see the instructions.

Now we will play with the following script. Make sure you change the username component then save it as unknown_script.ps1 and then execute it. What do you think it is doing?

$source = "C:\inetpub\wwwroot\"
$destination = "C:\Users\User\Documents\"
Copy-item $source $destination -Recurse

If you get an error message about the server execution policy then you can rectify this by typing the following into the command line:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

Take a look at the contents of

 C:\Users\User\Documents

Inserting dates and zipping

The following is a pretty good starting point. Lets just get PowerShell to dynamically insert a date and time and then we can schedule the backup. Run the following code snippet independently. I created in the Powershell editor and saved it as powershell_backup_script.ps1 and then executed it from the powershell command line by typing its name. Make sure that the username, in this case Administrator, is correct.

 $source = "C:\inetpub\wwwroot\"
 $destination = "C:\Users\Administrator\Date_Backup.zip"

 If(Test-path $destination) {Remove-item $destination}

 Add-Type -assembly "system.io.compression.filesystem"

 [io.compression.zipfile]::CreateFromDirectory($Source, $destination)

Try running the snippet below. Make sure you understand what it is doing before moving on.

Naming a file dynamically with the date

$a = Get-Date
echo $a

echo "this is a string"

$a = $(get-date -f yyyy-MM-dd)
echo $a

Hack the two code snippets together to create a powershell script that will create a zip file of a directory and copy this to another directory. Hint: When assigning values to a variable you can join strings and variables together using the "+" operator.

Schedule the task

Use the example commands below to schedule task to run every 10 minutes. The command-line tool to do this is schtasks. Try it out on the command line:

schtasks

The following command schedules, example.ps1, to run every 10 minutes. The command uses the /sc parameter to specify a minute schedule and the /mo parameter to specify an interval of 10 minutes. /tn is the name of the task and /tr is the task that will run.

schtasks /create /sc minute /mo 10 /tn "Backup Script" /tr "powershell.exe -file C:\Users\Administrator\example.ps1"

Schedule your backup task to run and monitor the file creation time in the directory to verify it is periodically writing a new backup.

The following command shows you all the processes that are scheduled to run.

schtasks

In Linux we have often used grep. You have probably entered the following command on a linux system many times.

ps -e | grep searchterm

Windows is the same. Below we are just replacing grep with findstr

schtasks | findstr Backup

Listing and Killing a process

Open notepad from the command line.

We can get a list of processes using the “Get-Process” command. This simply displays a list of all processes running. Since the output might be a bit hard to follow, we will sort it using the “Sort-Object ID” command. Use the pipe symbol for separation “|”.

Get-Process | Sort-Object ID

That one liner will give us a list of all processes, sorted by process ID. But that’s still not helping us to find a specific process in the list. The “findstr” command is similar to “grep” from Linux.

Can you build up on the command to only list processes that have the name “notepad”?

Hint: There are two different ways that you can accomplish this task.

Remember that if you need to kill a process you can use the following. List the programs that are running on your Windows System:

tasklist

Kill this process from the command line. You can do this with the name or the Process ID (PID). The /f is for "force"

taskkill /im process.ps1 /f 

OR

taskkill /pid 1234 /f

Powershell Loops

As you can see from the big list of commands (“get-commands”), PowerShell supports "for" and "while" loops as well as conditional statements. We will try out a basic for loop below. Instead of hardcoding the parameters for the loop, we based it on the size of an array, so if the array was bigger, then we would have more iterations of the loop.

$array = 1..5
$count = $array.Count
For( $i=0; $i -lt $count; $i++ )
{
  write-host “Testing”
  Start-Sleep -s 1
}
write-host “Success"

Hint: The code above will work if you copy and paste it as a block. You may have trouble if you type it line by line. The problem is when you press <Enter> Powershell tries to execute just that line and commands like the FOR loop don't make sense if you split up the components. If you are typing this into powershell, use <Shift><Enter> at the end of each line and this will insert a <Line Feed> that does not start execution. After typing the last statement you should press <Enter> to execute it.

Extra-task: Modify the script so that it will loop 10 times

Extra-task: Change the line that says testing, such that the program counts every iteration

Final Example: Take a break

In this example, we’ll use the code snippet below to display a message every 30 minutes asking you to take a break. We’ll do this by using the task scheduling feature in Windows.

$a = new-object -comobject wscript.shell
$b = $a.popup(“You should take a break and get a glass of water”, 1)

Modify the code so that the popup will remain for 10 seconds.

Once you have modified the code, save it to a known location. In the examples that follow we saved the file to the folder C:\Users\user because that was our home directory. You should substitute your own directory as you apply commands.

The following schtasks command should schedule your desired task every minute. You may wish to do this for testing purposes.

schtasks /create /sc minute /mo 1 /tn "Pop Up" /tr "powershell.exe -file C:\Users\Administrator\popup.ps1"

You can list the scheduled tasks with

schtasks /query

You can refine the list of scheduled tasks with

schtasks /query | findstr Pop

You can disable a scheduled task with:

Disable-ScheduledTask -TaskName "Pop Up"

Shutting down & Saving Power

Public access computers or computers where we know that people will not be using them after a certain hour. We can shut them down.

Explore the shutdown command options by typing the following in the powershell window:

shutdown

Shutdown /r would restart your computer but shutdown /s will completely shut it down

If you are using a windows machine sitting in front of your, then see if you can use schtasks to hibernate your computer:

shutdown /h

On you cloud-based server machine, see if you can shut it down just a few minutes into the future. You can then watch this happen. Try something like:

shutdown /s

Obviously, this might be useful to shutdown all library, department computers to save power after 6:00 pm.