# VM Lab - Read Only status

Contents

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!

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

Checks to see the ReadOnly status for the file C:\Test\foo.txt

.EXAMPLE

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
}

}

}



<#
.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

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

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 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"
}
}
}

}


`