Skip to content

Instantly share code, notes, and snippets.

@matt40k
Last active February 4, 2019 12:56
Show Gist options
  • Save matt40k/8fad215a0e34670aaf3b59e012e79fd6 to your computer and use it in GitHub Desktop.
Save matt40k/8fad215a0e34670aaf3b59e012e79fd6 to your computer and use it in GitHub Desktop.
Created by DJ-1701 - Shortcut deployment script - The following is the latest powershell shortcut deployment script, first shown in http://www.edugeek.net/forums/windows-server-2000-2003/76664-cc3-vanilla-windows-without-wiping-4.html#post1404554
# Specify source and destination of shortcut folders below.
# ****************************************************************************
# * Note: In the source location, create two folders named 32-Bit and 64-Bit *
# * to host your Start Menu shortcuts (as shortcut paths may vary). *
# ****************************************************************************
$Source = "\\ABC-SVR-01\Applications$\StartMenu"
$Destination="C:\ProgramData\FolderName\Windows\Start Menu"
# Inform user if no Source or Destination has been provided.
If (($Source -eq "") -or ($Destination -eq ""))
{
Write-Host "Missing Source and/or Destination, please check and try again."
Exit
}
# If there is a trailing backslash for $Source and/or $Destination, remove the backslash.
If ($Source.Substring($Source.Length-1) -eq "\")
{
$Source = $Source.Substring(0,$Source.Length-1)
}
If ($Destination.Substring($Destination.Length-1) -eq "\")
{
$Destination = $Destination.Substring(0,$Destination.Length-1)
}
# Update the Source path to include the OS Architecture type to the end of the path.
# If no OS Architecture is returned, then use the 32-Bit shortcut folder.
$Bit = ((Get-WMIObject Win32_OperatingSystem).OSArchitecture)
If ($Bit -eq "") {$Bit = "32-Bit"}
$Source = $Source + "\" + $Bit
# Inform user if Source does not exist.
If (!(Test-Path($Source)))
{
Write-Host "The Source location does not exist, please check and try again."
Exit
}
# Get the latest last modified date on all shortcuts in Source and Destination paths.
$NetworkStamp = Get-ChildItem "$Source\*" -Recurse -Force -include @("*.lnk","*.xml","*.appref-ms")`
| Where {!$_.PsIsContainer} | select Name,DirctoryName, LastWriteTime `
| Sort LastWriteTime -descending | select -first 1
$LocalStamp = Get-ChildItem "$Destination\*" -Recurse -Force -include @("*.lnk","*.xml","*.appref-ms") -ErrorAction SilentlyContinue `
| Where {!$_.PsIsContainer} | select Name,DirctoryName, LastWriteTime `
| Sort LastWriteTime -descending | select -first 1
# If there are any differences in the last modified date:
# 1) Delete files in Destination (if it exists).
# 2) Copy files from Source to Destination.
If ($NetworkStamp.LastWriteTime -ne $LocalStamp.LastWriteTime)
{
If (Test-Path($Destination))
{
Remove-Item "$Destination" -Recurse -Force
}
New-Item -ItemType directory -Path "$Destination"
Copy-Item "$Source\*" -Destination "$Destination" -Recurse
}
# Create a list of folders copied to the destination folder.
$ListOfFolders = Get-ChildItem $Destination -Recurse -Force | Where-Object {$_.PSIsContainer} `
| Sort-Object FullName -Descending | % { $_.FullName }
# Create a shell object, so we can check if the shortcuts are valid.
$sh = New-Object -COM WScript.Shell
# Check if Array is Null (Prevents ForEach null bug in PowerShell 2).
If ($ListOfFolders -ne $null)
{
# Do the following for every folder we scanned.
FOREACH ($Folder in $ListOfFolders)
{
# Set the hidden flag to True for the folder.
# Note: This will hide the folder later on if applications do not exist.
$AllItemsHidden = $true
# Get a list of all shortcuts in the current folder.
$ListOfShortcuts = Get-ChildItem "$Folder\*" -Force -include *.lnk `
| % { $_.FullName }
# Check if Array is Null (Prevents ForEach null bug in PowerShell 2).
If ($ListOfShortcuts -ne $null)
{
# Do the following for every shortcut we scanned.
FOREACH ($Shortcut in $ListOfShortcuts)
{
# Find out if the shortcut is hidden.
$Item = Get-Item $Shortcut -Force
$CheckHidden = (Get-ItemProperty $Item).Attributes.ToString() -match "Hidden"
# Get the target path of the shortcut (the path of the application).
# If it refers to C drive (C:), check if it exists, and ensure the shortcut
# is visible to the users, otherwise hide the shortcut.
$PathOfApplication = $sh.CreateShortcut($Shortcut).TargetPath
If ($PathOfApplication.Length -ge 2)
{
If ($PathOfApplication.Substring(0,2) -eq "C:")
{
If (Test-Path($PathOfApplication))
{
$AllItemsHidden = $false
If ($CheckHidden)
{
$Item.Attributes = $Item.Attributes -bxor [system.IO.FileAttributes]::Hidden
}
}
ElseIf ((!(Test-Path($PathOfApplication))) -and (!($CheckHidden)))
{
$Item.Attributes = $Item.Attributes -bxor [system.IO.FileAttributes]::Hidden
}
}
}
If (($Item.Directory.Name -eq "Programs") -or ($Item.DirectoryName.ToLower().Contains("\Programs\".ToLower())))
{
$CheckHidden = (Get-ItemProperty $Item).Attributes.ToString() -match "Hidden"
If (!($CheckHidden))
{
$Item.Attributes = $Item.Attributes -bxor [system.IO.FileAttributes]::Hidden
}
}
}
# List all files in the folder (excluding desktop.ini and thumbs.db, which aren't required).
$ListOfSubFilesAndFolders = Get-ChildItem "$Folder\*" -Force -exclude "desktop.ini","thumbs.db" `
| % { $_.FullName }
# Check if Array is Null (Prevents ForEach null bug in PowerShell 2).
If ($ListOfSubFilesAndFolders -ne $null)
{
# Do the following for every file or subfolder we scanned.
FOREACH ($SubFilesOrFolder in $ListOfSubFilesAndFolders)
{
# Find out if the file is hidden. If it is not, then it is a required resource.
# inform the program not to hide the folder.
$Item = Get-Item $SubFilesOrFolder -Force
$CheckHidden = $Item.Attributes.ToString() -match "Hidden"
If ($CheckHidden -eq $false)
{
$AllItemsHidden = $false
}
}
}
# If all of the files are hidden in the folder, then hide the unrequired folder.
# If any file is unhidden in the folder, then unhide the required folder.
$Item = Get-Item $Folder -Force
$CheckHidden = (Get-ItemProperty $Item).Attributes.ToString() -match "Hidden"
If (($AllItemsHidden -and !($CheckHidden)) -or (!($AllItemsHidden) -and $CheckHidden))
{
$Item.Attributes = $Item.Attributes -bxor [system.IO.FileAttributes]::Hidden
}
}
If (($Item.Directory.Name -ne $null) -or ($Item.DirectoryName -ne $null))
{
If (($Item.Directory.Name -eq "Programs") -or ($Item.DirectoryName.ToLower().Contains("\Programs\".ToLower())))
{
$CheckHidden = (Get-ItemProperty $Item).Attributes.ToString() -match "Hidden"
If (!($CheckHidden))
{
$Item.Attributes = $Item.Attributes -bxor [system.IO.FileAttributes]::Hidden
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment