In this next installment of my VM Lab series of posts, I have created a tiny set of tools which basically do exactly as the names imply.
While I admit, not quite hard to do, perhaps you’d even prefer to type things manually, but as mentioned in my previous post, for me it’s all about re-usability.
Requirements
In one of the upcoming installments of my VM Lab series, I will create a template VHD file, which will need to be set to Read Only in order to prevent changes to be made accidentally.
In another, I will need to copy a current Unattend.xml file, check if it was set to Read Only and if it was, remove that value so we can customize the contents.
So I made a small set of tools that did just that.
Functions
As the scripts aren’t too complex, but do server a solid purpose for the rest of the series, I’ve provided the code below.
BEWARE
These functions are meant for a test environment.
I’ve borrowed Jeffery Hicks‘ disclaimer, because it simply says it all:
DO NOT USE IN A PRODUCTION ENVIRONMENT UNTIL YOU HAVE TESTED THOROUGHLY IN A LAB ENVIRONMENT.
USE AT YOUR OWN RISK.
IF YOU DO NOT UNDERSTAND WHAT THIS SCRIPT DOES OR HOW IT WORKS, DO NOT USE IT OUTSIDE OF A SECURE, TEST SETTING.
I’ve set the scripts to a max height as to not flood the page, but rest assured, everything’s there.
Please do note that functions might refer to other functions, this is intended as a complete toolset, not just 1 piece.
If you have questions on the techniques used or suggestions on how to improve something, please let me know in the comment section!
Get-ReadOnly
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
function Get-ReadOnly { <# .SYNOPSIS Checks the ReadOnly status of a file. .DESCRIPTION Checks the ReadOnly status of a file. The script allows for multiple files to be checked. Value is validated before checked. .PARAMETER FileName Provide the filename [full path] which needs to be checked Accepts input from pipeline .EXAMPLE PS C:\> Get-ReadOnly -FileName C:\Test\foo.txt Checks to see the ReadOnly status for the file C:\Test\foo.txt .EXAMPLE PS C:\> 'C:\Test\foo.txt','C:\Test\bar.txt' | Get-ReadOnly Checks the ReadOnly status for both files C:\Test\foo.txt and C:\Test\bar.txt .NOTES Created by: Robert Prüst Blog: http://powershellpr0mpt.com Version: 1.0 Module: PSP-VMLab #> [CmdletBinding()] param ( [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [ValidateScript({Test-Path -Path $_})] [string[]]$FileName ) process { Write-Verbose "Starting $($MyInvocation.Mycommand)" foreach ($File in $FileName) { Write-Verbose "Checking current ReadOnly status for '$File'" (Get-ItemProperty -Path $File -Name IsReadOnly).IsReadOnly } } } |
Set-ReadOnly
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
function Set-ReadOnly { <# .SYNOPSIS Sets the ReadOnly status of a file. .DESCRIPTION Checks the ReadOnly status of a file and sets it to ReadOnly if this was not already done. The script allows for multiple files to be checked. .PARAMETER FileName Provide the filename [full path] which needs to be checked. Accepts input from pipeline. Value is validated before checked. .EXAMPLE PS C:\> Set-ReadOnly -FileName C:\Test\foo.txt Checks to see the Read Only status for the file C:\Test\foo.txt and sets it to ReadOnly if this is not already the case. .EXAMPLE PS C:\> 'C:\Test\foo.txt','C:\Test\bar.txt' | Set-ReadOnly Checks the ReadOnly status for both files C:\Test\foo.txt and C:\Test\bar.txt and sets them to ReadOnly if this is not already the case .NOTES Created by: Robert Prüst Blog: http://powershellpr0mpt.com Version: 1.0 Module: PSP-VMLab #> [CmdletBinding()] param ( [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [ValidateScript({Test-Path -Path $_})] [string[]]$FileName ) process { Write-Verbose "Starting $($MyInvocation.Mycommand)" foreach ($File in $FileName){ Write-Verbose "Checking current ReadOnly status for '$File'" $Status = Get-ReadOnly -FileName $File if (!($Status)){ Write-Verbose "Setting file '$File' to ReadOnly" Set-ItemProperty -Path $File -Name IsReadOnly -Value $true Write-Output "ReadOnly set for file '$File'" } else { Write-Output "'$File' already set to ReadOnly" } } } } |
Remove-ReadOnly
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
function Remove-ReadOnly { <# .SYNOPSIS Removes the ReadOnly status of a file. .DESCRIPTION Checks the Read Only status of a file and removes the ReadOnly value if this is required. The script allows for multiple files to be checked. .PARAMETER FileName Provide the filename [full path] which needs to be checked. Accepts input from pipeline. Value is validated before checked. .EXAMPLE PS C:\> Remove-ReadOnly -FileName C:\Test\foo.txt Checks to see the ReadOnly status for the file C:\Test\foo.txt and removes it if currently set. .EXAMPLE PS C:\> 'C:\Test\foo.txt','C:\Test\bar.txt' | Set-ReadOnly Checks the ReadOnly status for both files C:\Test\foo.txt and C:\Test\bar.txt and removes it if currently set. .NOTES Created by: Robert Prüst Blog: http://powershellpr0mpt.com Version: 1.0 Module: PSP-VMLab #> [CmdletBinding()] param ( [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [ValidateScript({Test-Path -Path $_})] [string[]]$FileName ) process { Write-Verbose "Starting $($MyInvocation.Mycommand)" foreach ($File in $FileName) { Write-Verbose "Checking current ReadOnly status for '$File'" $Status = Get-ReadOnly -FileName $File if ($Status){ Write-Verbose "Removing ReadOnly from '$File'" Set-ItemProperty -Path $File -Name IsReadOnly -Value $false Write-Output "ReadOnly removed for file '$File'" } else { Write-Output "'$File' not set to ReadOnly" } } } } |



