VM Lab - Read Only status
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
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-ReadOnlyfunction 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-ReadOnlyfunction 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" } } } } ```