Can someone please help me with the following
I am using Azure Automation DSC in a LAB, I have once Azure VM on-boarded to Azure Automation DSC
I am finding it quite flaky at the moment (not reliable), unless I am doing something wrong
for example if I run the following PowerShell as a function
function CheckWindowsFeatures {
begin {
$AllowedFeatures = @("BitLocker", "EnhancedStorage", "FileAndStorage-Services", "NET-Framework-45-Core", "NET-Framework-45-Features", "NET-WCF-Services45", "NET-WCF-TCP-PortSharing45", "PowerShell", "PowerShell-ISE", "PowerShellRoot", "Storage-Services", "System-DataArchiver", "Windows-Defender", "WoW64-Support", "XPS-Viewer")
$InstalledWindowsFeatures = (Get-WindowsFeature | Where-Object { $_.Installed } | Select-Object -ExpandProperty Name)
$OFS = ","
return @{ 'Installed Features' = $InstalledWindowsFeatures }
}
process {
Write-Verbose "Checking Windows Features/Roles"
$AdditionalFeatures = $MissingFeatures = $false
$Comparison = @(Compare-Object $using:AllowedFeatures $InstalledWindowsFeatures | Where-Object { $_.SideIndicator -eq "=>" } | Select-Object -ExpandProperty InputObject)
if ($Comparison.Count)
{
$AdditionalFeatures = $true
$WarningMessage = "Found $($Comparison.Count) Windows Features/Roles which are not on the allowed list of Windows Features. The list of these additons is as follows`r`n$($Comparison | Out-String)"
Write-Verbose $WarningMessage
Write-EventLog -LogName Application -Message $WarningMessage -Source "Application" -EntryType Warning -EventId 102
}
$Comparison2 = @(Compare-Object $using:AllowedFeatures $InstalledWindowsFeatures | Where-Object { $_.SideIndicator -eq "<=" } | Select-Object -ExpandProperty InputObject)
if ($Comparison2.Count)
{
$MissingFeatures = $true
$WarningMessage = "Found $($Comparison2.Count) Missing Windows Features/Roles which should be installed but are not. The list of missing features/roles is as follows`r`n$($Comparison2 | Out-String)"
Write-Verbose $WarningMessage
Write-EventLog -LogName Application -Message $WarningMessage -Source "Application" -EntryType Warning -EventId 103
}
if ($AdditionalFeatures -or $MissingFeatures) { return $false }
else { return $true }
}
end {
$string = [string]"Not set this items via script by design"
Write-Verbose $string
}
}
It runs and I see two entries on my Windows Event log, one to tell me the E: drive is missing and another to tell me my C: drive is the wrong size (as expected)
If I run the same code using DSC I set the above entries in my event log, however I get them twice so I end up with four entries in my event log (which I do not want as there is only two issues to log). Here is my DSC code
Configuration MtConfig01
{
Import-DscResource -ModuleName 'PSDesiredStateConfiguration'
Node localhost
{
Script CheckDiskVolumes {
GetScript = { Return @{
Result = [string]$(Get-CimInstance Win32_Volume -ErrorAction Stop | Select-Object DriveLetter, DriveType, Capacity, FreeSpace, Label, FileSystem, BootVolume, Compressed, SerialNumber | Out-String)
} }
TestScript = {
$VolumesDriveLettersCompliant = $VolumeSizeCompliant = $true
$VerbosePreference = "Continue"
$ComputerName = $env:COMPUTERNAME
$DriveLetterArray = @("C:", "D:", "E:")
$Script:Volumes = Get-CimInstance Win32_Volume -ErrorAction Stop | Select-Object DriveLetter, DriveType, @{ l = 'CapacityGB'; e = { [System.Math]::Round(($_.Capacity / 1gb), 2) } }, @{ l = 'FreeSpaceGB'; e = { [System.Math]::Round(($_.FreeSpace / 1gb), 2) } }, Label, FileSystem, BootVolume, Compressed, SerialNumber
foreach ($Volume in ($Volumes | Where-Object { $_.DriveLetter })) {
#region check for missing or additional volumes
# look for additiional drives
if ($DriveLetterArray -notcontains $Volume.DriveLetter)
{
$WarningMessage = "Found the following Volume Drive Letter $($Volume.DriveLetter) on computer $ComputerName it should NOT be present`r`nThe allowed drive letters are`r`n$($DriveLetterArray | Out-String), please investigate and resolve."
Write-Verbose $WarningMessage
Write-EventLog -LogName Application -Message $WarningMessage -Source "Application" -EntryType Warning -EventId 99
$VolumesDriveLettersCompliant = $false
}
#endregion check for missing or additional volumes
#region check drive sizes
if ($Volume.DriveLetter -eq "C:" -and ($Volume.CapacityGB -lt 200 -or $Volume.CapacityGB -gt 220))
{
$WarningMessage = "Disk Volume C: should be 200 GB in size but the actual size is $($Volume.CapacityGB) GB"
Write-Verbose $WarningMessage
Write-EventLog -LogName Application -Message $WarningMessage -Source "Application" -EntryType Warning -EventId 101
$VolumeSizeCompliant = $false
}
if ($Volume.DriveLetter -eq "E:" -and ($Volume.CapacityGB -lt 200 -or $Volume.CapacityGB -gt 220))
{
$WarningMessage = "Disk Volume E: should be 200 GB in size but the actual size is $($Volume.CapacityGB) GB"
Write-Verbose $WarningMessage
Write-EventLog -LogName Application -Message $WarningMessage -Source "Application" -EntryType Warning -EventId 101
$VolumeSizeCompliant = $false
}
#endregion check drive sizes
}
# look for missing drives
if (@($Volumes | Select-Object -ExpandProperty DriveLetter) -notcontains "C:") { Write-Verbose "C: drive volume missing"; $MissingDrive += "C:" }
if (@($Volumes | Select-Object -ExpandProperty DriveLetter) -notcontains "D:") { Write-Verbose "D: drive volume missing"; $MissingDrive += "D:" }
if (@($Volumes | Select-Object -ExpandProperty DriveLetter) -notcontains "E:") { Write-Verbose "E: drive volume missing"; $MissingDrive += "E:" }
if ($MissingDrive.count)
{
$WarningMessage = "The following drive volume letter/s are missing $($MissingDrive | Out-String)"
Write-Verbose $WarningMessage
Write-EventLog -LogName Application -Message $WarningMessage -Source "Application" -EntryType Warning -EventId 100
$VolumesDriveLettersCompliant = $false
}
if (!$VolumesDriveLettersCompliant -or !$VolumeSizeCompliant) { return $false }
else { return $true }
}
# Returns nothing
SetScript = {
$string = [string]"Not set this items via script by design"
Write-Verbose $string
}
}
}
}
I do not understand why the exact same code when run via DSC produces duplicate events in the event log
Please help :)
CXMelga