Skip to content

Commit

Permalink
Merge pull request #1282 from ykuijs/master
Browse files Browse the repository at this point in the history
[SPDocIcon] Added new resource
  • Loading branch information
ykuijs committed Jan 29, 2021
2 parents c585f59 + cc86184 commit 6e8b8d6
Show file tree
Hide file tree
Showing 8 changed files with 1,181 additions and 2 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

- SharePointDsc
- Added native support for ReverseDsc
- SPDocIcon
- New resource
- SPUserProfileSyncConnection
- Added ability to update UseSSL and UseDisabledFilter parameters
- SPWordAutomationServiceApp
Expand Down
379 changes: 379 additions & 0 deletions SharePointDsc/DSCResources/MSFT_SPDocIcon/MSFT_SPDocIcon.psm1
Original file line number Diff line number Diff line change
@@ -0,0 +1,379 @@
$dociconPath = Join-Path -Path $env:CommonProgramFiles -ChildPath 'microsoft shared\Web Server Extensions\16\TEMPLATE\XML'
$iconPath = Join-Path -Path $env:CommonProgramFiles -ChildPath 'microsoft shared\Web Server Extensions\16\TEMPLATE\IMAGES'
$dociconFileName = 'DOCICON.XML'
$backupFileName = 'DOCICON_Backup_{0}.XML'

function Get-TargetResource
{
[CmdletBinding()]
[OutputType([System.Collections.Hashtable])]
param
(
[Parameter(Mandatory = $true)]
[ValidateScript( { $_ -match "^\w*$" })]
[String]
$FileType,

[Parameter()]
[String]
$IconFile,

[Parameter()]
[String]
$EditText,

[Parameter()]
[String]
$OpenControl,

[Parameter()]
[ValidateSet("Present", "Absent")]
[System.String]
$Ensure = "Present",

[Parameter()]
[System.Management.Automation.PSCredential]
$InstallAccount
)

Write-Verbose -Message "Getting status of $FileType in 'docicon.xml'"

$nullReturn = @{
FileType = $FileType
IconFile = $null
EditText = $null
OpenControl = $null
Ensure = "Absent"
}

if ($Ensure -eq "Present" -and $PSBoundParameters.ContainsKey('IconFile') -eq $false)
{
Write-Verbose -Message "When Ensure=Present, please also specify the IconFile parameter."
return $nullReturn
}

$docIconFilePath = Join-Path -Path $dociconPath -ChildPath $dociconFileName

if ((Test-Path -Path $docIconFilePath) -eq $false)
{
Write-Verbose -Message "Docicon.xml file is not found: $docIconFilePath"
return $nullReturn
}

$xmlDoc = New-Object -TypeName 'System.Xml.XmlDocument'
$xmlDoc.Load($docIconFilePath)
$xmlNode = $xmlDoc.SelectSingleNode("//Mapping[@Key='$($FileType.ToLower())']")

if ($null -eq $xmlNode)
{
Write-Verbose -Message "Specifed file type ($FileType) does not exist in docicon.xml"
return $nullReturn
}
else
{
Write-Verbose -Message "Specifed file type ($FileType) exists in docicon.xml"

$iconFilePath = Join-Path -Path $iconPath -ChildPath $xmlNode.Value
if (Test-Path -Path $iconFilePath)
{
Write-Verbose -Message "Icon file exists: $iconFilePath"
return @{
FileType = $xmlNode.Key
IconFile = $xmlNode.Value
EditText = $xmlNode.EditText
OpenControl = $xmlNode.OpenControl
Ensure = "Present"
}
}
else
{
Write-Verbose -Message "Icon file does not exist: $iconFilePath"
return $nullReturn
}
}
}

function Set-TargetResource
{
[CmdletBinding()]
param
(
[Parameter(Mandatory = $true)]
[ValidateScript( { $_ -match "^\w*$" })]
[String]
$FileType,

[Parameter()]
[String]
$IconFile,

[Parameter()]
[String]
$EditText,

[Parameter()]
[String]
$OpenControl,

[Parameter()]
[ValidateSet("Present", "Absent")]
[System.String]
$Ensure = "Present",

[Parameter()]
[System.Management.Automation.PSCredential]
$InstallAccount
)

Write-Verbose -Message "Setting status of $FileType in 'docicon.xml'"

if ($Ensure -eq "Present" -and $PSBoundParameters.ContainsKey('IconFile') -eq $false)
{
$message = "When Ensure=Present, please also specify the IconFile parameter."
Add-SPDscEvent -Message $message `
-EntryType 'Error' `
-EventID 100 `
-Source $MyInvocation.MyCommand.Source
throw $message
}

if ($Ensure -eq "Present" -and (Test-Path -Path $IconFile) -eq $false)
{
$message = "Specified IconFile does not exist: $IconFile"
Add-SPDscEvent -Message $message `
-EntryType 'Error' `
-EventID 100 `
-Source $MyInvocation.MyCommand.Source
throw $message
}

$docIconFilePath = Join-Path -Path $dociconPath -ChildPath $dociconFileName

if ((Test-Path -Path $docIconFilePath) -eq $false)
{
$message = "Docicon.xml file is not found: $docIconFilePath"
Add-SPDscEvent -Message $message `
-EntryType 'Error' `
-EventID 100 `
-Source $MyInvocation.MyCommand.Source
throw $message
}

$xmlDoc = New-Object -TypeName 'System.Xml.XmlDocument'
$xmlDoc.Load($docIconFilePath)
$xmlNode = $xmlDoc.SelectSingleNode("//Mapping[@Key='$($FileType.ToLower())']")

$changed = $false
if ($Ensure -eq 'Present')
{
$iconFileName = Split-Path -Path $IconFile -Leaf
$targetIconFile = Join-Path -Path $iconPath -ChildPath $iconFileName

if ((Test-Path -Path $targetIconFile) -eq $false)
{
Write-Verbose -Message "Copying the IconFile to the server: $iconFileName"
$null = Copy-Item -Path $IconFile -Destination $iconPath -Force
}
else
{
Write-Verbose -Message "IconFile already exists on the server: $iconFileName"
$sourceHash = (Get-FileHash -Path $IconFile -Algorithm SHA512).Hash
$targetHash = (Get-FileHash -Path $targetIconFile -Algorithm SHA512).Hash
if ($sourceHash -ne $targetHash)
{
Write-Verbose -Message "Files differ. Updating the IconFile on the server: $iconFileName"
$null = Copy-Item -Path $IconFile -Destination $iconPath -Force
}
}

if ($null -eq $xmlNode)
{
Write-Verbose -Message "Adding $FileType to docicon.xml"

$xmlNode = $xmlDoc.CreateElement("Mapping")
$xmlNode.SetAttribute("Key", $FileType)

$xmlNode.SetAttribute("Value", $iconFileName)

if ([System.String]::IsNullOrEmpty($EditText) -eq $false)
{
$xmlNode.SetAttribute("EditText", $EditText)
}

if ([System.String]::IsNullOrEmpty($OpenControl) -eq $false)
{
$xmlNode.SetAttribute("OpenControl", $OpenControl)
}

$xmlDoc.DocIcons.ByExtension.AppendChild($xmlNode) | Out-Null
$changed = $true
}
else
{
Write-Verbose -Message "Updating $FileType in docicon.xml"
if ($xmlNode.Value -ne $iconFileName)
{
Write-Verbose -Message " Updating IconFile parameter"
$xmlNode.SetAttribute("Value", $iconFileName)
$changed = $true
}

if ($PSBoundParameters.ContainsKey('EditText') -and `
$xmlNode.EditText -ne $EditText)
{
Write-Verbose -Message " Updating EditText parameter"
$xmlNode.SetAttribute("EditText", $EditText)
$changed = $true
}

if ($PSBoundParameters.ContainsKey('OpenControl') -and `
$xmlNode.OpenControl -ne $OpenControl)
{
Write-Verbose -Message " Updating OpenControl parameter"
$xmlNode.SetAttribute("OpenControl", $OpenControl)
$changed = $true
}
}
}
else
{
if ($null -ne $xmlNode)
{
Write-Verbose -Message "Removing $FileType from docicon.xml"
$targetIconFile = Join-Path -Path $iconPath -ChildPath $xmlNode.Value

if (Test-Path -Path $targetIconFile)
{
Remove-Item -Path $targetIconFile -Force -Confirm:$false
}

$xmlDoc.DocIcons.ByExtension.RemoveChild($xmlNode) | Out-Null
$changed = $true
}
}

if ($changed -eq $true)
{
Write-Verbose -Message "Saving changes to Docicon.xml file"
$xmlDoc.Save($DocIconFilePath)
}
}

function Test-TargetResource
{
[CmdletBinding()]
[OutputType([System.Boolean])]
param
(
[Parameter(Mandatory = $true)]
[ValidateScript( { $_ -match "^\w*$" })]
[String]
$FileType,

[Parameter()]
[String]
$IconFile,

[Parameter()]
[String]
$EditText,

[Parameter()]
[String]
$OpenControl,

[Parameter()]
[ValidateSet("Present", "Absent")]
[System.String]
$Ensure = "Present",

[Parameter()]
[System.Management.Automation.PSCredential]
$InstallAccount
)

Write-Verbose -Message "Testing status of $FileType in 'docicon.xml'"

$PSBoundParameters.Ensure = $Ensure

$CurrentValues = Get-TargetResource @PSBoundParameters

if ($PSBoundParameters.ContainsKey('IconFile'))
{
Write-Verbose "Stripping the path from IconFile to simplify parameter comparison"
$PSBoundParameters.IconFile = Split-Path -Path $PSBoundParameters.IconFile -Leaf
}

Write-Verbose -Message "Current Values: $(Convert-SPDscHashtableToString -Hashtable $CurrentValues)"
Write-Verbose -Message "Target Values: $(Convert-SPDscHashtableToString -Hashtable $PSBoundParameters)"

$result = Test-SPDscParameterState -CurrentValues $CurrentValues `
-Source $($MyInvocation.MyCommand.Source) `
-DesiredValues $PSBoundParameters `
-ValuesToCheck @(
"FileType",
"IconFile",
"EditText",
"OpenControl",
"Ensure"
)

Write-Verbose -Message "Test-TargetResource returned $result"

return $result
}

function Export-TargetResource
{
$VerbosePreference = "SilentlyContinue"
$ParentModuleBase = Get-Module "SharePointDsc" -ListAvailable | Select-Object -ExpandProperty Modulebase
$module = Join-Path -Path $ParentModuleBase -ChildPath "\DSCResources\MSFT_SPDocIcon\MSFT_SPDocIcon.psm1" -Resolve

$Content = ''
$params = Get-DSCFakeParameters -ModulePath $module

$docIconFilePath = Join-Path -Path $dociconPath -ChildPath $dociconFileName

if ((Test-Path -Path $docIconFilePath) -eq $false)
{
$message = "Docicon.xml file is not found: $docIconFilePath"
Add-SPDscEvent -Message $message `
-EntryType 'Error' `
-EventID 100 `
-Source $MyInvocation.MyCommand.Source
throw $message
}

$xmlDoc = New-Object -TypeName 'System.Xml.XmlDocument'
$xmlDoc.Load($docIconFilePath)

$dociconSourcePath = "C:\Install\Icons"
foreach ($mapping in $xmlDoc.DocIcons.ByExtension.Mapping)
{
$PartialContent = " SPDocIcon DocIcon" + $mapping.Key + "`r`n"
$PartialContent += " {`r`n"
$params.FileType = $mapping.Key
$params.Ensure = "Present"
$results = Get-TargetResource @params

$results = Repair-Credentials -results $results

# Parameterize IconFile parameter
Add-ConfigurationDataEntry -Node "NonNodeData" `
-Key "DocIcon$($mapping.Key)" `
-Value (Join-Path -Path $dociconSourcePath -ChildPath $results.IconFile) `
-Description "Path to the icon file of the file type;"
$results.IconFile = "`$ConfigurationData.NonNodeData.DocIcon$($mapping.Key)"

$currentBlock = Get-DSCBlock -Params $results -ModulePath $module
$currentBlock = Convert-DSCStringParamToVariable -DSCBlock $currentBlock -ParameterName "PsDscRunAsCredential"

$PartialContent += $currentBlock
$PartialContent += " }`r`n"
$Content += $PartialContent
}

return $Content
}

Export-ModuleMember -Function *-TargetResource
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[ClassVersion("1.0.0.0"), FriendlyName("SPDocIcon")]
class MSFT_SPDocIcon : OMI_BaseResource
{
[Key, Description("Specifies the file type to configure the docicon for")] String FileType;
[Write, Description("Specifies the full path to the image file for the file type")] String IconFile;
[Write, Description("Specifies the edit text for the file type")] String EditText;
[Write, Description("Specifies the Open Control command for the file type")] String OpenControl;
[Write, Description("Present to configure the file type. Absent is remove the file type"), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] string Ensure;
[Write, Description("POWERSHELL 4 ONLY: The account to run this resource as, use PsDscRunAsCredential if using PowerShell 5"), EmbeddedInstance("MSFT_Credential")] String InstallAccount;
};

0 comments on commit 6e8b8d6

Please sign in to comment.