User Profile Disk unlock script - Powershell

A powershell script that bring up a gridview where you can select user profile disk and dismount them. Useful if the user is getting a temp profile due to locked user profile disks. For use on the file server hosting the UPD. Replace <fileserverwheretheUPDsarestored> with the server name and <driverletterwherethevhdshare> with the physical drive letter where the vhds are.

$vhdarray = @()

## Get list of all VHDs and all Open VHDs for comparison

$vhds = Invoke-Command -ComputerName <fileserverwheretheUPDsarestored> {gci "E:\Data\UserProfileDisks" |

Where-Object {($_.Name -like "*.vhdx") -and ($ -notlike "*template*")}}

$openfiles = Invoke-Command -ComputerName <fileserverwheretheUPDsarestored> {get-smbopenfile | where {$_.path -Like "*.vhdx"}}

## Check list of VHDs against open VHDs to determine if the disk is connected to on of the hosts

foreach($vhd in $vhds)


$openfiletest = ($openfiles | Where {$_.path -eq $vhd.FullName}) | select -Unique

IF ($openfiletest)


$vhdopened = $true

$vhdrdshostip = $openfiletest.clientcomputername | select -Unique

$vhdrdshost = ([System.Net.Dns]::gethostentry($vhdrdshostip)).hostname




$vhdopened = $false

$vhdrdshost = "Not Connected"


## Get user SID from VHD file name - then convert SID to username

try {

$usersid = ([io.path]::GetFileNameWithoutExtension($vhd.Name)).trim("UVHD-")

$objSID = (New-Object System.Security.Principal.SecurityIdentifier ($usersid) -ErrorAction SilentlyContinue).Translate([System.Security.Principal.NTAccount])

$username = $objSID.value



## Order the data into a hash table and add to the array

$hash = [ordered]@{

'Username' = $username

'VHD Connected' = $vhdopened

'RDS Host' = $vhdrdshost

'VHD Path' = $vhd.FullName


$vhdproperties = New-Object -TypeName PSObject -Property $hash

$vhdarray += $vhdproperties


$getinfofromvhd = $vhdarray | sort username | ogv -Title "VHD List" -PassThru

write-host $getinfofromvhd.'VHD Path'

$trimmedpath = "\\<fileserverwheretheUPDsarestored>\<driveletterwherethevhdshare>$\"+($getinfofromvhd.'VHD Path').Trim("E:\")

dismount-vhd -path $trimmedpath

Power in Numbers





Project Gallery