[
  {
    "path": ".github/FUNDING.yml",
    "content": "﻿# These are supported funding model platforms\n\ngithub: PrzemyslawKlys\ncustom: https://paypal.me/PrzemyslawKlys"
  },
  {
    "path": ".github/workflows/test-powershell.yml",
    "content": "﻿name: Test PowerShell Module\n\non:\n  push:\n    branches:\n      - master\n    paths-ignore:\n      - 'README.md'\n      - 'CHANGELOG.md'\n      - 'Docs/**'\n  pull_request:\n    branches:\n      - master\n  workflow_dispatch:  # 👈 enables manual triggering\n\nenv:\n  DOTNET_VERSION: '8.x'\n  BUILD_CONFIGURATION: 'Debug'\n\njobs:\n  refresh-psd1:\n    name: 'Refresh PSD1'\n    runs-on: windows-latest\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v4\n\n      - name: Setup PowerShell modules\n        run: |\n          Install-Module PSPublishModule -Force -Scope CurrentUser -AllowClobber\n          Install-Module PSWriteColor -Force -Scope CurrentUser -AllowClobber\n        shell: pwsh\n\n      - name: Refresh module manifest\n        env:\n          RefreshPSD1Only: 'true'\n        run: |\n          .\\Build\\Build-Module.ps1\n        shell: pwsh\n\n      - name: Upload refreshed manifest\n        uses: actions/upload-artifact@v4\n        with:\n          name: psd1\n          path: PSSharedGoods.psd1\n\n  test-windows-ps5:\n    needs: refresh-psd1\n    name: 'Windows PowerShell 5.1'\n    runs-on: windows-latest\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v4\n\n      - name: Download manifest\n        uses: actions/download-artifact@v4\n        with:\n          name: psd1\n          path: .\n\n      - name: Setup .NET\n        uses: actions/setup-dotnet@v4\n        with:\n          dotnet-version: ${{ env.DOTNET_VERSION }}\n\n      - name: Install PowerShell modules\n        shell: powershell\n        run: |\n          Write-Host \"PowerShell Version: $($PSVersionTable.PSVersion)\"\n          Install-Module -Name Pester -Repository PSGallery -Force -SkipPublisherCheck -AllowClobber\n\n      - name: Run PowerShell tests\n        shell: powershell\n        run: .\\PSSharedGoods.Tests.ps1\n\n  test-windows-ps7:\n    needs: refresh-psd1\n    name: 'Windows PowerShell 7'\n    runs-on: windows-latest\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v4\n\n      - name: Download manifest\n        uses: actions/download-artifact@v4\n        with:\n          name: psd1\n          path: .\n\n      - name: Setup .NET\n        uses: actions/setup-dotnet@v4\n        with:\n          dotnet-version: ${{ env.DOTNET_VERSION }}\n\n      - name: Install PowerShell modules\n        shell: pwsh\n        run: |\n          Write-Host \"PowerShell Version: $($PSVersionTable.PSVersion)\"\n          Install-Module -Name Pester -Repository PSGallery -Force -SkipPublisherCheck -AllowClobber\n\n      - name: Run PowerShell tests\n        shell: pwsh\n        run: .\\PSSharedGoods.Tests.ps1\n\n"
  },
  {
    "path": ".gitignore",
    "content": "Ignore/*\n.vs/*\nReleases/*\nReleasesUnpacked/*\n.vscode/*\n*.html\nArtefacts/*"
  },
  {
    "path": "Build/Build-Module.ps1",
    "content": "Import-Module \"PSPublishModule\" -Force\n\nInvoke-ModuleBuild -ModuleName 'PSSharedGoods' {\n    # Usual defaults as per standard module\n    $Manifest = @{\n        # Version number of this module.\n        ModuleVersion        = '0.0.X'\n        # Supported PSEditions\n        CompatiblePSEditions = @('Desktop', 'Core')\n        # ID used to uniquely identify this module\n        GUID                 = 'ee272aa8-baaa-4edf-9f45-b6d6f7d844fe'\n        # Author of this module\n        Author               = 'Przemyslaw Klys'\n        # Company or vendor of this module\n        CompanyName          = 'Evotec'\n        # Copyright statement for this module\n        Copyright            = \"(c) 2011 - $((Get-Date).Year) Przemyslaw Klys @ Evotec. All rights reserved.\"\n        # Description of the functionality provided by this module\n        Description          = 'Module covering functions that are shared within multiple projects'\n        # Minimum version of the Windows PowerShell engine required by this module\n        PowerShellVersion    = '5.1'\n        # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export.\n        # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell.\n        Tags                 = @('Windows', 'MacOS', 'Linux', 'Shared', 'Useful', 'Email', 'Format', 'Azure', 'ActiveDirectory')\n        IconUri              = 'https://evotec.xyz/wp-content/uploads/2018/10/PSSharedGoods-Alternative.png'\n        ProjectUri           = 'https://github.com/EvotecIT/PSSharedGoods'\n    }\n    New-ConfigurationManifest @Manifest\n\n    New-ConfigurationModule -Type RequiredModule -Name 'PSWriteColor' -Guid Auto -Version Latest\n    #New-ConfigurationModule -Type ExternalModule -Name 'Microsoft.PowerShell.Utility', 'Microsoft.PowerShell.Management','Microsoft.PowerShell.Security'\n    New-ConfigurationModule -Type ApprovedModule -Name 'PSWriteColor', 'Connectimo', 'PSUnifi', 'PSWebToolbox', 'PSMyPassword'\n\n    New-ConfigurationModuleSkip -IgnoreModuleName @(\n        # this are builtin into PowerShell, so not critical\n        'Microsoft.PowerShell.Management'\n        'Microsoft.PowerShell.Security'\n        'Microsoft.PowerShell.Utility'\n        'Microsoft.WSMan.Management'\n        'NetConnection'\n        'NetSecurity'\n        'NetTCPIP'\n        'powershellget'\n        'SmbShare'\n        'ServerManager'\n        'ScheduledTasks'\n        'ActiveDirectory'\n        'CimCmdlets'\n        'DnsClient'\n    ) -IgnoreFunctionName 'Select-Unique', 'Compare-TwoArrays', 'Invoke-DbaQuery', 'Get-RequiredModule', 'IsOfType', 'GetFormattedPair', 'IsNumeric' # those functions are internal within private function\n\n    $ConfigurationFormat = [ordered] @{\n        RemoveComments                              = $true\n        RemoveEmptyLines                            = $true\n\n        PlaceOpenBraceEnable                        = $true\n        PlaceOpenBraceOnSameLine                    = $true\n        PlaceOpenBraceNewLineAfter                  = $true\n        PlaceOpenBraceIgnoreOneLineBlock            = $false\n\n        PlaceCloseBraceEnable                       = $true\n        PlaceCloseBraceNewLineAfter                 = $true\n        PlaceCloseBraceIgnoreOneLineBlock           = $false\n        PlaceCloseBraceNoEmptyLineBefore            = $true\n\n        UseConsistentIndentationEnable              = $true\n        UseConsistentIndentationKind                = 'space'\n        UseConsistentIndentationPipelineIndentation = 'IncreaseIndentationAfterEveryPipeline'\n        UseConsistentIndentationIndentationSize     = 4\n\n        UseConsistentWhitespaceEnable               = $true\n        UseConsistentWhitespaceCheckInnerBrace      = $true\n        UseConsistentWhitespaceCheckOpenBrace       = $true\n        UseConsistentWhitespaceCheckOpenParen       = $true\n        UseConsistentWhitespaceCheckOperator        = $true\n        UseConsistentWhitespaceCheckPipe            = $true\n        UseConsistentWhitespaceCheckSeparator       = $true\n\n        AlignAssignmentStatementEnable              = $true\n        AlignAssignmentStatementCheckHashtable      = $true\n\n        UseCorrectCasingEnable                      = $true\n    }\n    # format PSD1 and PSM1 files when merging into a single file\n    # enable formatting is not required as Configuration is provided\n    New-ConfigurationFormat -ApplyTo 'OnMergePSM1', 'OnMergePSD1' -Sort None @ConfigurationFormat\n    # format PSD1 and PSM1 files within the module\n    # enable formatting is required to make sure that formatting is applied (with default settings)\n    New-ConfigurationFormat -ApplyTo 'DefaultPSD1', 'DefaultPSM1' -EnableFormatting -Sort None\n    # when creating PSD1 %use special style without comments and with only required parameters\n    New-ConfigurationFormat -ApplyTo 'DefaultPSD1', 'OnMergePSD1' -PSD1Style 'Minimal'\n    # configuration for documentation, at the same time it enables documentation processing\n    New-ConfigurationDocumentation -Enable:$false -StartClean -UpdateWhenNew -PathReadme 'Docs\\Readme.md' -Path 'Docs'\n\n    New-ConfigurationImportModule -ImportSelf\n\n    $newConfigurationBuildSplat = @{\n        Enable                            = $true\n        SignModule                        = $true\n        MergeModuleOnBuild                = $true\n        MergeFunctionsFromApprovedModules = $true\n        CertificateThumbprint             = '483292C9E317AA13B07BB7A96AE9D1A5ED9E7703'\n        RefreshPSD1Only                   = $true\n    }\n\n    New-ConfigurationBuild @newConfigurationBuildSplat\n\n    #New-ConfigurationTest -TestsPath \"$PSScriptRoot\\..\\Tests\" -Enable\n\n    New-ConfigurationArtefact -Type Unpacked -Enable -Path \"$PSScriptRoot\\..\\Artefacts\\Unpacked\" -AddRequiredModules\n    New-ConfigurationArtefact -Type Packed -Enable -Path \"$PSScriptRoot\\..\\Artefacts\\Packed\" -ArtefactName '<ModuleName>.v<ModuleVersion>.zip'\n\n    # options for publishing to github/psgallery\n    #New-ConfigurationPublish -Type PowerShellGallery -FilePath 'C:\\Support\\Important\\PowerShellGalleryAPI.txt' -Enabled:$true\n    #New-ConfigurationPublish -Type GitHub -FilePath 'C:\\Support\\Important\\GitHubAPI.txt' -UserName 'EvotecIT' -Enabled:$true\n} -ExitCode"
  },
  {
    "path": "CHANGELOG.MD",
    "content": "﻿#### 0.0.310 - 2025.07.07\n##### What's new\n- Added `Get-FolderEncoding` to get folder encoding\n- Added `Convert-FolderEncoding` to convert folder encoding\n- Added `Convert-FileEncoding` to convert file encoding\n- Added `Get-FileEncoding` to get file encoding\n\n#### 0.0.309 - 2025.06.25\n##### What's new\n- improved `ConvertTo-PrettyObject` to handle nulls\n\n#### 0.0.308 - 2025.06.02\n##### What's new\n- Improve `Convert-FromColor` to support other ways in PSWriteHTML\n\n#### 0.0.307\n##### What's new\n- Introduced various commented-out examples for using `ConvertFrom-DistinguishedName`.\n- Included examples for converting distinguished names to organizational units and other formats.\n- Enhanced documentation for better understanding of the module's capabilities.\n- Added `ToContainer` switch to `ConvertFrom-DistinguishedName`\n\n**Full Changelog**: https://github.com/EvotecIT/PSSharedGoods/compare/v0.0.306...v0.0.307\n\n#### 0.0.306 - 2025.03.20\n- Improve `ConvertTo-PrettyObject` to handle `deserialized` objects better\n- Improve `ConvertTo-JsonLiteral` to handle `deserialized` objects better\n\n#### 0.0.305 - 2025.03.17\n- Improve `Remove-EmptyValue` to respect parameters for recursive call\n\n#### 0.0.304 - 2025.03.03\n- Improve `Set-ReportingCapabilities`\n\n#### 0.0.303\n- Added `Remove-FileItem` to remove files and folders including moving to recycle bin\n- Improved `Set-LoggingCapabilities`\n\n#### 0.0.302 - 2024.12.22\n- Refactor `Format-TransposeTable` parameters to be more consistent\n- Added `Set-ReportingCapabilities` to manage report files in multiple PowerShell modules\n- Added `Set-LoggingCapabilities` to manage log files in multiple PowerShell modules\n- Improved `ConvertFrom-DistinguishedName` with `ToFQDN` switch\n- Removed `Get-HTML`\n- Removed `Send-Email`\n- Removed `Set-EmailBody`\n- Removed `Set-EmailBodyPreparedTable`\n- Removed `Set-EmailBodyReplacement`\n- Removed `Set-EmailBodyTableReplacement`\n- Removed `Set-EmailFormatting`\n- Removed `Set-EmailHead`\n- Removed `Set-EmailReportBranding`\n- Removed `Set-EmailWordReplacements`\n- Removed `Set-EmailWordReplacementsHash`\n- Removed `Add-ToArray`\n- Removed `Add-ToArrayAdvanced`\n- Removed `Find-DatesCurrentDayMinusDayX`\n- Removed `Find-DatesCurrentDayMinuxDaysX`\n- Removed `Find-DatesCurrentHour`\n- Removed `Find-DatesDayPrevious`\n- Removed `Find-DatesDayToday`\n- Removed `Find-DatesMonthCurrent`\n- Removed `Find-DatesMonthPast`\n- Removed `Find-DatesPastHour`\n- Removed `Find-DatesPastWeek`\n- Removed `Find-DatesQuarterCurrent`\n- Removed `Find-DatesQuarterLast`\n- Removed `New-SqlQuery`\n- Removed `New-SqlQueryAlterTable`\n- Removed `New-SqlQueryCreateTable`\n- Removed `New-SqlTableMapping`\n- Removed `Send-SqlInsert`\n- Removed `Get-SqlQueryColumnInformation`\n- Removed `Get-ObjectCount`\n- Removed `Get-ObjectData`\n- Removed `Get-ObjectEnumValues`\n- Removed `Get-ObjectKeys`\n- Removed `Get-ObjectProperties`\n- Removed `Get-ObjectPropertiesAdvanced`\n- Removed `Get-ObjectTitles`\n- Removed `Get-ObjectType`\n- Removed `New-ArrayList`\n- Removed `New-GenericList`\n- Removed `Remove-FromArray`\n- Removed `Get-HashMaxValue`\n- Removed `Get-Logger`\n- Removed `Add-WinADUserGroups`\n- Removed `Find-ADConnectServer`\n- Removed `Find-ExchangeServer`\n- Removed `Find-HyperVServer`\n- Removed `Find-UserProxyAddressesStatus`\n- Removed `Get-ADAdministrativeGroups`\n- Removed `Get-WinADOrganizationalUnitiData`\n- Removed `Get-WinADOrganizationalUnitFromDN`\n- Removed `Get-WinADUsersByDN`\n- Removed `Get-WinADUsersByOU`\n- Removed `Get-WinADUserSnapshot`\n- Removed `Remove-WinADUserGroups`\n- Removed `Set-WinADGroupSynchornization`\n- Removed `Set-WinADUserFields`\n- Removed `Set-WinADUserSettingGAL`\n- Removed `Set-WinADUserStatus`\n\nThose functions are moved to `Private` just in case they are still in use, but will be removed later on, as they are legacy.\nThose functions were mostly used by PSWinReporting, PSAutomator or maybe PSWinDocumentation.\nWith the PSWriteHTML/Mailozaurr/ADEssentials they don't really need to exists.\nAdditionally some of those are really slow and should not be used in production as funtions as it moots the point of using them as functions.\nThey should be used directly to benefit the speed.\n\n#### 0.0.301 - 2024.12.02\n- Improved `Get-FileName`\n\n#### 0.0.300 - 2024.11.24\n- Improved `Format-TransposeTable`\n- Improved `ConvertFrom-DistinguishedName`\n\n#### 0.0.299 - 2024.11.06\n- Improved `ConvertFrom-DistinguishedName` switches `ToMultipleOrganizationalUnit`, `ToOrganizationalUnit` should handle properly using containers such as `CN=Users,DC=ad,DC=evotec,DC=xyz`\n\n#### 0.0.298 - 2024.10.27\n- Added `Get-ComputerPorts`\n\n#### 0.0.297 - 2024.10.26\n- Added `Get-ComputerFirewall`\n- Improved `ConvertFrom-SID` and `Convert-Identity` to mark `Schema Admins` as Administrative\n\n#### 0.0.296 - 2024.09.28\n- Improve `Get-ComputerSMBSharePermissions` with `Translated` switch by adding SID value\n\n#### 0.0.295 - 2024.08.01\n- Improved `Get-ComputerDiskLogical`\n- Added `Get-ComputerNetFramework`\n\n#### 0.0.294 - 2024.07.06\n* Added help where needed and did minor legibility improvements. by @neztach in https://github.com/EvotecIT/PSSharedGoods/pull/40\n\n##### New Contributors\n* @neztach made their first contribution in https://github.com/EvotecIT/PSSharedGoods/pull/40\n\n#### 0.0.293 - 2024.06.29\n- Improve `Format-TransposeTable`\n\n#### 0.0.292 - 2024.06.29\n- Rewritten `Format-TransposeTable` to new approach. Old approach still usable with `Legacy` switch\n\n#### 0.0.291 - 2024.06.08\n- Fixes `ConvertTo-PrettyObject` handling new lines properly for strings\n\n#### 0.0.290 - 2024.06.06\n- Added `ConvertTo-NormalizedString` to replace special characters with normal ones\n\n#### 0.0.289 - 2024.04.26\n- Improve `Get-TimeSettings` with additional information about Windows Secure Time Seeding\n\n#### 0.0.288 - 2024.04.26\n- Improve `Format-StringToSentence`\n\n#### 0.0.287 - 2024.04.26\n- Small update to `Get-FileEncoding`\n- Renamed `Format-AddSpaceToSentence` to `Format-StringToSentence` (alias left in place)\n- Improve `Format-StringToSentence` with more features\n\n#### 0.0.286 - 2024.04.15\n- Improve `Get-ComputerTime` when computer can't be connected\n\n#### 0.0.285 - 2024.04.10\n- Improve performance `Get-FileEncoding` by using filestream\n- Add documentation for `Get-ComputerInstalledUpdates`\n\n#### 0.0.284 - 2024.04.09\n- Improved `Get-ComputerInstalledUpdates` to support Credential parameter\n\n#### 0.0.283 - 2024.04.09\n- Added `Get-FileEncoding` to get file encoding\n\n#### 0.0.282 - 2024.03.28\n- Added `Convert-IpAddressToPtr` to convert IP Address to PTR record\n\n#### 0.0.281 - 2024.03.25\n- Improve `Get-ComputerWindowsUpdates`\n- Added `Get-ComputerInstalledUpdates`\n\n#### 0.0.280 - 2024.03.12\n- Improve `Convert-Identity`\n- Improve `ConvertFrom-SID`\n\n#### 0.0.279 - 2024.03.12\n- Improve `Convert-Identity`\n- Improve `ConvertFrom-SID`\n\n#### 0.0.278 - 2024.02.29\n- Added `Get-ComputerMemory`\n- Improved `Get-ComputerOperatingSystem`\n\n#### 0.0.277 - 2024.02.13\n- Added `Get-WinADDSAGuid` to get list of Domain Controllers and their DSA GUIDs/DSA Names\n- Improved `Get-WinADForestDetails` to include `DSAGUID` and `DSANAME` for each DC\n\n#### 0.0.276 - 2024.01.23\n- Added `WindowsSecureTimeSeeding` to `Get-TimeSettings`\n\n#### 0.0.275 - 2024.01.04\n- Improved `Join-UriQuery`\n- Improved `Get-ComputerSMBShareList`\n\n#### 0.0.274 - 2023.12.21\n- Improved `Get-ComputerSMBShareList` with ability to SkipDiskSpace\n\n#### 0.0.273 - 2023.12.20\n- Added `Get-ComputerSMBShareList` to get list of SMB Shares (`net view /all` replacement)\n\n#### 0.0.271 - 2023.12.12\n- Fixes `Get-WinADForestDetails` returning empty element for ForestDomainControllers in some cases\n\n#### 0.0.270 - 2023.12.12\n- Improve `Join-UriQuery`\n\n#### 0.0.269 - 2023.11.22\n- Small fixes to `ConvertTo-PrettyObject`\n- Added tests for `ConvertTo-PrettyObject`\n\n#### 0.0.268 - 2023.11.22\n- Improved `Get-FileInformation` - added docs, and converted to PSCustomObject\n- Added `ConvertTo-PrettyObject` as an alternative to `ConvertTo-JsonLiteral` for use in PSWriteHTML\n\n#### 0.0.267 - 2023.10.28\n- Added `Get-IPAddressRangeInformation`\n\n#### 0.0.266 - 2023.09.16\n- Update `Convert-Office365License` to support new licenses based on the website from Microsoft, rather than manual input\n\n#### 0.0.265 - 2023.08.22\n- Update `Copy-Dictionary` to support PS7.4 which disables BinaryFormatter by default (breaking change - the output may be different a bit)\n- Update `Get-GitHubLatestRelease` fixes a typo\n- Update `Get-GitHubVersion` to return unknown value\n- Added `Format-Dictionary` to sort hashtable by key or by value\n\n#### 0.0.264 - 2023.05.23\n- Improve `ConvertTo-OperatingSystem`\n\n#### 0.0.263 - 2023.05.08\n- Improve `Select-Properties` null handling\n\n#### 0.0.262 - 2023.05.03\n- Improves handling of null in `Convert-CountryCodeToCountry`\n- Remove `ReturnHashtable`  in `Convert-CountryToContinent` changing the behavior to always return hashtable of continents if country is not given\n\n#### 0.0.261 - 2023.04.23\n- Adds `Convert-CountryToContinent`\n\n#### 0.0.260 - 2023.04.18\n- Adds support for `HKUDUO` and `HKUDUDO` for `Get-PSRegistry`, `Set-PSRegistry`, `Remove-PSRegistry`, `New-PSRegistry` and `Test-PSRegistry`\n  - `HKUDUO` - All users in HKEY_USERS that are non SPECIAL accounts excluding .DEFAULT / .DEFAULT_USER (auto mapped from NTUSER.DAT). But also including non-loaded users (not logged in) (auto mapped from NTUSER.DAT)\n  - `HKUDUDO` - All users in HKEY_USERS that are non SPECIAL accounts including .DEFAULT_USER (auto mapped from NTUSER.DAT). But also including non-loaded users (not logged in) (auto mapped from NTUSER.DAT)\n  - Improve `Get-WinADForestDetails` by adding switch `PreferWritable` which would use writable DCs for quering\n\n#### 0.0.259 - 2023.03.08\n- Improve `Get-ComputerSMBSharePermissions` with `Translated` switch\n- Improve `Get-ComputerSMBShare` with `Translated` switch\n\n#### 0.0.258 - 2023.02.04\n- Fixes `ConvertFrom-SID` value for `NT AUTHORITY\\LOCAL SERVICE`\n\n#### 0.0.257 - 2023.01.15\n- `ConvertFrom-HTML` removed (well moved to Private until final removal)\n\n#### 0.0.256 - 2023.01.14\n- Added more licenses/service plans `Convert-Office365License`\n- Enhance generated string in `ConvertFrom-ObjectToString` by @danubie\n- Removed dependency on `Connectimo` (moved one function), archived Connectimo repo\n\n#### 0.0.255 - 2023.01.08\n- Add `Get-GitHubVersion`\n\n#### 0.0.254 - 2022.12.20\n- Update Get-WinADForestControllers.ps1 by @ferwe in https://github.com/EvotecIT/PSSharedGoods/pull/32\n- Added `Force` to Convert-Identity to clear cache when doing lots of lookups and creatiing new objects\n- Improves `Convert-ADGuidToSchema`\n- Improves `Convert-ADSchemaToGuidd`\n- Improves `Convert-Identity`\n\n#### 0.0.253 - 2022.12.14\n- Fixes `ConvertFrom-SID` fixing one SID returning wrong value\n- Improves `Convert-ADGuidToSchema`\n- Improves `Convert-ADSchemaToGuidd`\n- Improves `Get-WinADForestOptions`\n- Improves `Get-WinADForestControllers` by @ferwe\n\n#### 0.0.252 - 2022.11.20\n- Updated `Convert-ExchangeRecipient`\n- Removed `Convert-Convert-ExchangeRecipientDetails` (added as an alias to `Convert-ExchangeRecipient`)\n\n#### 0.0.251 - 2022.11.07\n- Fixes private function `Get-LocalComputerSid` solving [#34](https://github.com/EvotecIT/GPOZaurr/issues/34)\n\n#### 0.0.250 - 2022.11.05\n- Fixes `ConvertFrom-DistinguishedName` when using `ToCanonicalName` for domain name\n\n#### 0.0.249 - 2022.11.01\n- Improve `ConvertFrom-DistinguishedName` to allow `ToCanonicalName`\n\n```powershell\nConvertFrom-DistinguishedName -DistinguishedName 'OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz' -ToCanonicalName\nConvertFrom-DistinguishedName -DistinguishedName 'CN=test,OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz' -ToCanonicalName\n```\n\n#### 0.0.248 - 2022.10.24\n- Added `ConvertFrom-ObjectToString` to help with converting objects into\n\n#### 0.0.247 - 2022.10.05\n- `Convert-ADSchemaToGuid` improved by adding `AsString`. By default returns Guid, but can return string.\n\n#### 0.0.246 - 2022.09.19\n- Fixes `Split-Array` in some rare cases\n\n#### 0.0.245 - 2022.09.19\n- Fixes `Split-Array` when there's a single array\n#### 0.0.244 - 2022.09.19\n- Improved `Split-Array`\n- Removed `Split-ArrayEvery`\n\n#### 0.0.243 - 2022.09.18\n- Added `Convert-ADSchemaToGuid` and `Convert-ADGuidToSchema`\n- Renamed `Get-WinADForestGUIDs` to `Convert-ADGuidToSchema`\n\n#### 0.0.242 - 2022.09.01\n- Adds some countries `Convert-CountryToCountryCode` and `Convert-CountryCodeToCountry` with some haardcoding\n\n#### 0.0.241 - 2022.09.01\n- Fixes `Convert-CountryToCountryCode` and `Convert-CountryCodeToCountry` for PS7\n- Improved `Convert-CountryCodeToCountry` for 3 letter codes\n\n#### 0.0.239 - 2022.08.31\n- Improved `Convert-CountryToCountryCode` and `Convert-CountryCodeToCountry` by using cache for frequest queries\n\n#### 0.0.238 - 2022.08.31\n- Improved `Convert-CountryToCountryCode` to resolve country names to country codes from NativeName, DisplayName and ThreeLetterISORegionName as an addition to EnglishName\n\n#### 0.0.237 - 2022.08.18\n- Improved `ConvertTo-Json` to handle ArrayJoin feature for nested objects\n\n#### 0.0.236 - 2022.08.14\n- Improved `Convert-Identity` and `ConvertFrom-SID` - faster lookup for SIDs that are less than 19 chars\n\n#### 0.0.236 - 2022.08.14\n- Improved `Convert-Identity` and `ConvertFrom-SID` - faster lookup for `BUILTIN\\IIS_IUSRS`\n\n#### 0.0.235 - 2022.08.14\n- Improved `Convert-Identity` and `ConvertFrom-SID` - faster lookup for `NT SERVICE\\WdiServiceHost`\n\n#### 0.0.234 - 2022.08.14\n- Improved `Convert-Identity` and `ConvertFrom-SID` - faster local SID lookup and `Window Manager\\Window Manager Group`\n\n#### 0.0.233 - 2022.08.06\n- Improves `Get-GitHubLatestRelease` to verify for internet connection.\n\n#### 0.0.232 - 2022.07.16\n- Fixes `Convert-CountryToCountryCode` usind DisplayNames instead of EnglishNames\n#### 0.0.231 - 2022.07.06\n- Fixes `Convert-CountryCodeToCountry` to output just country english name by default\n- Fixes `Convert-CountryToCountryCode` to output region information rather than culture information.\n\n#### 0.0.230 - 2022.07.05\n- Added `Convert-CountryCodeToCountry`\n- Added `Convert-CountryToCountryCode`\n\n#### 0.0.229 - 2022.06.30\n- Fixes `Compare-MultipleObjects` which would result in bad comparison from time to time\n\n#### 0.0.228 - 2022.06.30\n- Improved `ConvertTo-FlatObject` supporting `ExcludeProperty`\n- Improved `Compare-MultipleObjects` supporting `ExcludeProperty`\n- Removed `Set-WinAzureADUserStatus` - i think only used in PSAutomator which is experimantal and moved to that repo\n- Removed `Set-WinAzureADUserLicense` - i think only used in PSAutomator which is experimantal and moved to that repo\n- Removed `Set-WinAzureADUserField` - i think only used in PSAutomator which is experimantal and moved to that repo\n- Removed `Set-SpecUser` - i have no clue where it was used, but PSSharedGoods is not a good place for it\n- Removed `New-UserAdd` - i have no clue where it was used, but PSSharedGoods is not a good place for it\n- Removed `Add-PropertyToList` - i have no clue where it was used, but PSSharedGoods is not a good place for it\n\n#### 0.0.227 - 2022.06.17\n- Improved `Convert-Office365License` - tnx diecknet\n\n#### 0.0.226 - 2022.05.28\n- Improved `Set-PSRegistry` - supports automapping of DEFAULT_USER (ntuser.dat), skips using .DEFAULT which is just an alias to SYSTEM account (S-1-5-18)\n- Improved `Get-PSRegistry` - supports automapping of DEFAULT_USER (ntuser.dat), skips using .DEFAULT which is just an alias to SYSTEM account (S-1-5-18)\n- Improved `New-PSRegistry` - supports automapping of DEFAULT_USER (ntuser.dat), add supports for virtual keys to Users, skips using .DEFAULT which is just an alias to SYSTEM account (S-1-5-18)\n- Improved `Remove-PSRegistry` - supports automapping of DEFAULT_USER (ntuser.dat), add supports for virtual keys to Users, skips using .DEFAULT which is just an alias to SYSTEM account (S-1-5-18)\n- Added `Mount-PSRegistryPath` - allows mapping of file NTUSER.DAT to a specific path in registry\n- Added `Dismount-PSRegistryPath` - unmounts NTUSER.DAT from registry\n\n#### 0.0.225 - 2022.04.30\n- Rewritten `Set-PSRegistry` to use .net methods\n- Rewritten `Get-PSRegistry` to use .net methods, adding more features\n- Added `WhatIf` to `Set-PSRegistry`\n- Added `Test-PSRegistry`\n- Improvement to `Get-PSRegistry`\n- Added `Remove-PSRegistry` to remove registry keys\n- Added `New-PSRegistry` to create registry paths\n- Improvement to `ConvertTo-FlatObject` to deal with `$null` objects\n- Improvement to `Compare-MultipleObjects` to deal with `$null` objects and missing properties\n\n#### 0.0.224 - 2022.03.02\n- Improvement to `Compare-MultipleObjects`\n#### 0.0.223 - 2022.02.25\n- Improvement to `ConvertTo-FlatObject` which also improves `Compare-MultipleObjects`\n\n#### 0.0.222 - 2022.02.24\n- For publishing PSSharedGoods no longer requires PSWriteColor, Connectimo. It's still required during development\n#### 0.0.221 - 2022.02.14\n- Improvement to `Compare-MultipleObjects`\n- Improvement to `ConvertTo-FlatObject`\n#### 0.0.220 - 2022.02.13\n- Improvement to `Compare-MultipleObjects`\n- Improvement to `ConvertTo-FlatObject`\n#### 0.0.219 - 2022.02.12\n- Fixes `Compare-MuplipleObjects`\n#### 0.0.218 - 2022.02.12\n- Fixes `Compare-MuplipleObjects`\n#### 0.0.217 - 2022.02.12\n- Improvement to `Compare-MultipleObjects`\n- Added `ConvertTo-FlatObject`\n#### 0.0.216 - 2022.01.24\n- 🐛 Fixes critical bug in `New-FileName` where it could lead to a lot of temporary files created by `New-FileName`\n#### 0.0.215 - 2021.12.11\n- ℹ Improved `Rename-LatinCharacters` with docs and cmdletbinding\n- ℹ Improved `ConvertFrom-DistinguishedName` by adding `ToLastName` switch\n#### 0.0.214 - 2021.10.23\n- ℹ Improved error handling `Get-PSRegistry` and added new property\n- ℹ Improved `ConvertTo-OperatingSystem` adding registry handling + few more systems\n- Added `Get-ProtocolDefaults` to get default values for SSL/TLS protocols per system\n#### 0.0.213 - 2021.10.22\n- ℹ Fixes for forest domains handling `Get-WinADForestDetails`\n#### 0.0.212 - 2021.09.30\n- ℹ Improved detection of dead domains in `Get-WinADForestDetails`\n#### 0.0.211 - 2021.08.25\n- ℹ Improved `Join-UriQuery`\n#### 0.0.210 - 2021.08.12\n- ℹ Improved `Convert-OfficeLicense` - adds [more licenses](https://github.com/EvotecIT/PSSharedGoods/pull/26) license - tnx diecknet\n#### 0.0.209 - 2021.08.08\n- ℹ Improved `Convert-OfficeLicense` - adds [Dynamics 365 Business Central Essentials](https://github.com/EvotecIT/PSSharedGoods/pull/25) license - tnx diecknet\n#### 0.0.208 - 2021.08.04\n- ℹ Improved `Set-PasswordRemotely` to cleanup objects\n- ℹ Improved `ConvertFrom-DistinguishedName`\n#### 0.0.207 - 2021.07.05\n- 📦 Added Principal.UserID for ScheduledTask (run as account) - tnx itpro-tips - [#20](https://github.com/EvotecIT/PSSharedGoods/pull/20)\n- Renamed function `Get-TimeSetttings` to `Get-TimeSettings` - tnx rmbolger - [Extra 't' in Get-TimeSetttings #22](https://github.com/EvotecIT/PSSharedGoods/issues/22)\n- ℹ Improved `Get-TimeSettings` to support 2 ways of flag definitions - tnx rmbolger - [#23](https://github.com/EvotecIT/PSSharedGoods/issues/23)\n#### 0.0.206 - 2021.06.16\n- ℹ Improved `Send-Email` to return object when using `WhatIf`\n#### 0.0.205 - 2021.06.06\n- ℹ Improved `ConvertTo-FlatHashtable`\n#### 0.0.204 - 2021.06.05\n- 📦 Added `ConvertTo-FlatHashtable`\n#### 0.0.203 - 2021.06.01\n- 💡 Improved `Join-UriQuery`\n#### 0.0.202 - 2021.06.01\n- 💡 Improved `Join-UriQuery`\n#### 0.0.201 - 2021.05.19\n- 📦 Added `Convert-DomainFqdnToNetBIOS`\n- 📦 Added `Convert-DomainToSid`\n- 📦 Improved `Get-OperatingSystem`\n#### 0.0.200 - 2021.05.19\n- 📦 Added `Convert-ExchangeRecipient` (replacement to `Convert-ExchangeRecipientDetails` which will be removed in the future (too slow))\n- 📦 Added `Get-OperatingSystem`\n- 💡 Improved `Convert-Office365License` by adding licenses: FORMS_PRO, CCIBOTS_PRIVPREV_VIRAL [#19](https://github.com/EvotecIT/PSSharedGoods/pull/19) - tnx diecknet\n- 💡 Improved `Remove-EmptyValue` by adding ability to disable removing of different object types\n- 🐛 Fixes `ConvertTo-JsonLiteral` when dealing with array of double, decimal values\n- 💡 Improved `ConvertTo-OperatingSystem`\n#### 0.0.199 - 2021.04.12\n- 📦 Added `Join-Uri` - Provides ability to join two Url paths together\n- 📦 Added `Join-UriQuery` - Provides ability to join two Url paths together including advanced querying which is useful for RestAPI/GraphApi calls\n#### 0.0.198 - 2021.03.12\n- Improved `ConvertTo-JsonLiteral`\n  - ☑ Added `AdvancedReplace` parameter to be able to fix strings like `@{ '.' = '\\.'; '$' = '\\$' }` which break JSON, but useful for other stuff\n  - ☑ Moved enum/numeric conversions around to prevent issues with arrays\n#### 0.0.197 - 2021.02.21\n- Improved `ConvertTo-JsonLiteral` - `ArrayJoin` and `ArrayJoinString` to better control `JavaScript` output\n#### 0.0.196 - 2021.02.11\n- Fixed `ConvertFrom-Color` when using multiple hex colors\n#### 0.0.195 - 2021.01.26\n- Improved/Fixed `Invoke-CommandCustom` to catch errors properly\n#### 0.0.194 - 2021.01.20\n- Fixed `Get-WinADForestControllers` to discover only writable DCs\n#### 0.0.193 - 2021.01.14\n- Added `Invoke-CommandCustom`\n- Fixed actions property in `Get-ComputerTask`\n#### 0.0.192 - 2020.12.16\n- Improved `Get-PSService`\n- Improved `Get-CimData`\n#### 0.0.191 - 2020.12.16\n- Improved `Set-PasswordRemotly` with more secure approach and autodetect DC\n#### 0.0.190 - 2020.12.07\n- Improved `Get-Computer`\n- Improved `Get-ComputerNetwork`\n- Improved `Get-ComputerStartup`\n- Improved `Get-ComputerApplication` (renamed from `Get-ComputerApplications`, but alias left in place)\n- Improved `Get-ComputerTask` (renamed from `Get-ComputerTasks`, but alias left in place)\n#### 0.0.189 - 2020.11.29\n- Improved `Get-ComputerWindowsFeatures`\n- Improved `Get-ComputerRoles`\n#### 0.0.188 - 2020.11.12\n- Improved `Set-FileOwner`\n#### 0.0.187\n- Added tests for `Copy-Dictionary`\n- Improved `Get-FilePermission`\n#### 0.0.186 - 2020.10.22\n- Disabled progress for `Get-GitHubLatestRelease`\n#### 0.0.185 - 2020.10.21\n- Improvements to `ConvertTo-JsonLiteral`\n#### 0.0.184 - 2020.10.20\n- Improvements to `ConvertTo-JsonLiteral`\n#### 0.0.183 - 2020.10.18\n- Update to `ConvertFrom-SID`\n- Update to `Get-FilePermission`\n#### 0.0.182 - 2020.10.18\n- Improvements to `ConvertTo-JsonLiteral`\n- Rewritten `Get-PSService` to CIM, small change on output parameter\n- Added `Get-ComputerDevice`\n- Added `Get-ComputerRAM`\n- Improved `Get-ComputerBIOS`\n- Moved `Get-ComputerSplit` to private functions as it shouldn't be used outside\n- Added `Get-Computer`\n- Improvements to other `Get-Computer*` cmdlets\n#### 0.0.180 - 2020.09.20\n- Updates to `Convert-Identity`\n- Updated PSD1 to better version\n#### 0.0.179 - 2020.09.17\n- Rewritten `Convert-Identity` and added tests for it - basic ones as no AD in Cloud\n- Rewritten `ConvertTo-SID` and added tests for it\n#### 0.0.178 - 2020.09.12\n- Updated `Get-ADTrustAttributes` with more attributes, renamed some\n- Added `Get-ADEncryptionTypes`\n#### 0.0.177 - 2020.09.11\n- Fixed `ConvertTo-DistinguishedName`\n#### 0.0.176 - 2020.09.07\n- Improvements `ConvertTo-JsonLiteral`\n#### 0.0.175 - 2020.09.06\n- Added `ConvertTo-JsonLiteral`\n#### 0.0.174 - 2020.09.06\n- Removed from PSGallery\n#### 0.0.173 - 2020.09.06\n- `Send-Email` more fixes to encoding\n#### 0.0.172 - 2020.09.05\n- `Send-Email` now sets encoding utf-8 for AlternativeView (inline attachments)\n#### 0.0.171 - 2020.09.05\n- Small updates to email commands but those will be removed in future\n  - Need to migrate them to modules that use them\n  - Only Send-Email will be left\n#### 0.0.170 - 2020.09.01\n- Added `Test-IsDistinguishedName`\n- Added `ConvertFrom-NetbiosName`\n- Improvements to `Convert-Identity`\n- Improvements to `Get-Colors`\n#### 0.0.169 - 2020.08.27\n- Added `ConvertTo-DistinguishedName`\n- Updated `ConvertFrom-DistinguishedName`\n- Added tests for both\n#### 0.0.168 - 2020.08.25\n- `Convert-UserAccountControl` - alterntive to `Convert-UAC`, should be faster\n#### 0.0.167 - 2020.08.23\n- `Select-Properties` updated to skip some types\n#### 0.0.166 - 2020.08.03\n- `Remove-EmptyValue` fix for bool values\n#### 0.0.165 - 2020.07.31\n- `Format-ToTitleCase` updates\n- `Remove-EmptyValue` fix for ILIST 0\n#### 0.0.163 - 2020.07.31\n- `Remove-EmptyValue` fix for ILIST\n#### 0.0.162 - 2020.07.31\n- `Format-ToTitleCase` updates\n#### 0.0.161 - 2020.07.23\n- Updated `Get-FilePermission`\n- Updated `Get-FileOwner`\n#### 0.0.160 - 2020.07.21\n- Updated `Get-FileMetaData`\n#### 0.0.159 - 2020.07.20\n- Updated `ConvertTo-OperatingSystem`\n- Update SKU mapping table $O365SKU for `Convert-Office365License` #12 tnx diecknet\n#### 0.0.158 - 2020.07.06\n- Update `Convert-Identity`\n#### 0.0.157 - 2020.07.03\n- Improvements to `Remove-EmptyValue`\n- Accidentally `Get-FileMetaData` would run during import\n#### 0.0.156 - 2020.07.02\n- Improvements to `Convert-Identity`\n#### 0.0.155 - 2020.06.25\n- Improvements to `Convert-Office365License`\n#### 0.0.154 - 2020.06.25\n- Improvements to `Get-FileMetaData` to not-existing files\n#### 0.0.153 - 2020.06.21\n- Added `HashAlgorithm` parameter to `Get-FileMetaData`\n#### 0.0.152 - 2020.06.20\n- Improvements to `Get-FileMetaData`\n#### 0.0.151 - 2020.06.20\n- Improvements to `Get-FileMetaData`\n#### 0.0.150 - 2020.06.20\n- Bugfix `Get-FileMetaData`\n#### 0.0.149 - 2020.06.20\n- Added `Get-FileMetaData`\n#### 0.0.148 - 2020.06.19\n- Fixes for nuget versioning [#11](https://github.com/EvotecIT/PSSharedGoods/issues/11)\n- `Send-Email` now returns [PSCustomObject] instead of hashtable. Makes it easier to process in loops\n#### 0.0.146 - 2020.06.11\n- Improved `Get-Colors`\n- Improved `ConvertFrom-Color`\n#### 0.0.144 - 2020.05.31\n- Improved `Get-WinADForestDetails`\n#### 0.0.143 - 2020.05.17\n- Improved `Get-WinADForestDetails`\n- Added `Copy-DictionaryManual`, alternative to `Copy-Dictionary` which is driving me nuts - tnx joel~!\n#### 0.0.142 - 2020.05.14\n- Improved `Get-WinADForestDetails`\n#### 0.0.141 - 2020.05.14\n- Improved `Set-FileOwner`\n- Improved `Get-WinADForestDetails`\n#### 0.0.140 - 2020.05.10\n- Improved `Get-FilePermission`\n#### 0.0.139 - 2020.05.09\n- Added `Convert-Identity`\n- Improved `ConvertFrom-Sid`\n- Improved `ConvertTo-Sid`\n- Added `Get-FileOwner`\n- Improved `Get-FilePermission`\n- Improved `Remove-FilePermission`\n- Added `Set-FileOwner`\n- Improved `Set-FilePermission`\n- Improved `Get-WinADForestDetails`\n- Added `Get-ADAdministrativeGroups`\n\n#### 0.0.138 - 2020.04.26\n- ☑ ConvertFrom-DistinguishedName added switch `ToDomainCN`\n\n    ```powershell\n    $Oops = 'cn={55FB3860-74C9-4262-AD77-30197EAB9999},cn=policies,cn=system,DC=ad,DC=evotec,DC=xyz'\n    ConvertFrom-DistinguishedName -DistinguishedName $Oops -ToDomainCN\n    ```\n\n    ```output\n    ad.evotec.xyz\n    ```\n\n#### 0.0.137 - 2020.04.24\n- ☑ Removed aliases for `Set-FileInheritance`, `Set-FilePermission`, `Remove-FilePermission`\n\n#### 0.0.136 - 2020.04.24\n- ☑ Added `OnlyWellKnownAdministrative` switch to `ConvertFrom-SID`\n\n#### 0.0.135 - 2020.04.19\n- ☑ Improvements to Get-WinADForestDetails\n- ☑ Added `OnlyWellKnown` switch to `ConvertFrom-SID`\n\n#### 0.0.134 - 2020.04.09\n- ☑ Improvements to Get-WinADForestDetails\n\n#### 0.0.133 - 2020.04.03\n- ☑ Improvements to Get-WinADForestDetails\n\n#### 0.0.132 - 2020.03.19\n- ☑ Improvements to Get-WinADForestDetails\n\n#### 0.0.131 - 2020.03.18\n- ☑ Improvements to Get-WinADForestDetails for subsequent use, fix for excluding d\n- ☑ Copy-Dictionary added\n\n#### 0.0.130 - 2020.03.14\n- ☑ Small update to Get-WinADForestDetails\n\n#### 0.0.129 - 2020.03.13\n- ☑ Typo fix for string\n\n#### 0.0.128 - 2020.03.05\n- ☑ Small update to Get-WinADForestDetails\n\n#### 0.0.127 - 2020.02.27\n- ☑ Fix for ConvertFrom-DistinguishedName\n\n#### 0.0.126 - 2020.02.27\n- ☑ Added Get-FilePermissions\n- ☑ Improved ConvertFrom-SID\n\n#### 0.0.125 - 2020.02.17\n- ☑ Improvments to Get-ComputerSMBSharePermissions\n#### 0.0.124 - 2020.02.17\n- ☑ Added Get-ComputerSMBSharePermissions\n#### 0.0.123 - 2020.02.16\n- ☑ Updates to Get-PSRegistry/Set-PSRegistry/Get-CimData\n- ☑ Added Get-ComputerSplit for easiedr use of above functions but also for future use\n\n#### 0.0.122 - 2020.01.26\n- ☑ Fix for ConvertFrom-DistinguishedName to cover OU/DC properly (wrong regex)\n"
  },
  {
    "path": "Docs/Add-PropertyToList.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Add-PropertyToList\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nAdd-PropertyToList [[-List] <Object>] [[-PropertyName] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -List\n{{Fill List Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -PropertyName\n{{Fill PropertyName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: Password, MailNickName\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Add-ToArray.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Add-ToArray\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nAdd-ToArray [[-List] <ArrayList>] [[-Element] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Element\n{{Fill Element Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -List\n{{Fill List Description}}\n\n```yaml\nType: ArrayList\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Add-ToArrayAdvanced.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Add-ToArrayAdvanced\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nAdd-ToArrayAdvanced [[-List] <ArrayList>] [[-Element] <Object>] [-SkipNull] [-RequireUnique] [-FullComparison]\n [-Merge] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Element\n{{Fill Element Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -FullComparison\n{{Fill FullComparison Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -List\n{{Fill List Description}}\n\n```yaml\nType: ArrayList\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Merge\n{{Fill Merge Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -RequireUnique\n{{Fill RequireUnique Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SkipNull\n{{Fill SkipNull Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Add-ToHashTable.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Add-ToHashTable\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nAdd-ToHashTable [[-Hashtable] <Object>] [[-Key] <Object>] [[-Value] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Hashtable\n{{Fill Hashtable Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Key\n{{Fill Key Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Value\n{{Fill Value Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Add-WinADUserGroups.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Add-WinADUserGroups\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nAdd-WinADUserGroups [-User] <Object> [[-Groups] <String[]>] [[-FieldSearch] <String>] [-WhatIf]\n [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -FieldSearch\n{{Fill FieldSearch Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Groups\n{{Fill Groups Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -User\n{{Fill User Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -WhatIf\nShows what would happen if the cmdlet runs.\nThe cmdlet is not run.\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Compare-ObjectProperties.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Compare-ObjectProperties\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nCompare-ObjectProperties [[-ReferenceObject] <PSObject>] [[-DifferenceObject] <PSObject>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -DifferenceObject\n{{Fill DifferenceObject Description}}\n\n```yaml\nType: PSObject\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ReferenceObject\n{{Fill ReferenceObject Description}}\n\n```yaml\nType: PSObject\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -CaseSensitive\n{{Fill CaseSensitive Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Compare-ObjectsAdvanced.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Compare-ObjectsAdvanced\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nCompare-ObjectsAdvanced [[-Object1] <Object>] [[-Object2] <Object>] [[-CommonProperty] <String>]\n [[-AddObjectArrayName] <String[]>] [[-AddObjectArray] <Object[]>] [[-Object1Property] <String>]\n [[-Object2Property] <String>] [[-ObjectPropertySubstitute] <String>] [-RemoveSideIndicator]\n [-KeepTemporaryProperty] [[-Side] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -AddObjectArray\n{{Fill AddObjectArray Description}}\n\n```yaml\nType: Object[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 4\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -AddObjectArrayName\n{{Fill AddObjectArrayName Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -CommonProperty\n{{Fill CommonProperty Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases: Property\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -KeepTemporaryProperty\n{{Fill KeepTemporaryProperty Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Object1\n{{Fill Object1 Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Object1Property\n{{Fill Object1Property Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 5\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Object2\n{{Fill Object2 Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Object2Property\n{{Fill Object2Property Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 6\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ObjectPropertySubstitute\n{{Fill ObjectPropertySubstitute Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 7\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -RemoveSideIndicator\n{{Fill RemoveSideIndicator Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Side\n{{Fill Side Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: Left, Right\n\nRequired: False\nPosition: 8\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Connect-WinAzure.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Connect-WinAzure\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConnect-WinAzure [[-SessionName] <String>] [[-Username] <String>] [[-Password] <String>] [-AsSecure]\n [-FromFile] [-MultiFactorAuthentication] [-Output] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -AsSecure\n{{Fill AsSecure Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: PasswordAsSecure\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -FromFile\n{{Fill FromFile Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: PasswordFromFile\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -MultiFactorAuthentication\n{{Fill MultiFactorAuthentication Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: mfa\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Output\n{{Fill Output Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Password\n{{Fill Password Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SessionName\n{{Fill SessionName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Username\n{{Fill Username Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Connect-WinAzureAD.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Connect-WinAzureAD\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConnect-WinAzureAD [[-SessionName] <String>] [[-Username] <String>] [[-Password] <String>] [-AsSecure]\n [-FromFile] [-MultiFactorAuthentication] [-Output] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -AsSecure\n{{Fill AsSecure Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: PasswordAsSecure\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -FromFile\n{{Fill FromFile Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: PasswordFromFile\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -MultiFactorAuthentication\n{{Fill MultiFactorAuthentication Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: mfa\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Output\n{{Fill Output Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Password\n{{Fill Password Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SessionName\n{{Fill SessionName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Username\n{{Fill Username Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Connect-WinExchange.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Connect-WinExchange\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConnect-WinExchange [[-SessionName] <String>] [[-ConnectionURI] <String>] [[-Authentication] <String>]\n [[-Username] <String>] [[-Password] <String>] [-AsSecure] [-FromFile] [-MultiFactorAuthentication]\n [[-Prefix] <String>] [-Output] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -AsSecure\n{{Fill AsSecure Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: PasswordAsSecure\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Authentication\n{{Fill Authentication Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: Basic, Kerberos\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ConnectionURI\n{{Fill ConnectionURI Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -FromFile\n{{Fill FromFile Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: PasswordFromFile\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -MultiFactorAuthentication\n{{Fill MultiFactorAuthentication Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: mfa\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Output\n{{Fill Output Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Password\n{{Fill Password Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 4\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Prefix\n{{Fill Prefix Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 5\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SessionName\n{{Fill SessionName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Username\n{{Fill Username Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases: UserPrincipalName\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Connect-WinSecurityCompliance.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Connect-WinSecurityCompliance\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConnect-WinSecurityCompliance [[-SessionName] <String>] [[-ConnectionURI] <String>]\n [[-Authentication] <String>] [[-Username] <String>] [[-Password] <String>] [-AsSecure] [-FromFile]\n [-MultiFactorAuthentication] [[-Prefix] <String>] [-Output] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -AsSecure\n{{Fill AsSecure Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: PasswordAsSecure\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Authentication\n{{Fill Authentication Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: Basic, Kerberos\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ConnectionURI\n{{Fill ConnectionURI Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -FromFile\n{{Fill FromFile Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: PasswordFromFile\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -MultiFactorAuthentication\n{{Fill MultiFactorAuthentication Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: mfa\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Output\n{{Fill Output Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Password\n{{Fill Password Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 4\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Prefix\n{{Fill Prefix Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 5\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SessionName\n{{Fill SessionName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Username\n{{Fill Username Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases: UserPrincipalName\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Connect-WinService.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Connect-WinService\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConnect-WinService [[-Credentials] <Object>] [[-Service] <Object>] [[-Type] <String>] [-Output]\n [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Credentials\n{{Fill Credentials Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Output\n{{Fill Output Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Service\n{{Fill Service Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Type\n{{Fill Type Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Connect-WinSharePoint.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Connect-WinSharePoint\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConnect-WinSharePoint [[-SessionName] <String>] [[-Username] <String>] [[-Password] <String>] [-AsSecure]\n [-FromFile] [-MultiFactorAuthentication] [[-ConnectionURI] <Uri>] [-Output] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -AsSecure\n{{Fill AsSecure Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: PasswordAsSecure\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ConnectionURI\n{{Fill ConnectionURI Description}}\n\n```yaml\nType: Uri\nParameter Sets: (All)\nAliases: uri, url, ConnectionUrl\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -FromFile\n{{Fill FromFile Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: PasswordFromFile\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -MultiFactorAuthentication\n{{Fill MultiFactorAuthentication Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: mfa\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Output\n{{Fill Output Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Password\n{{Fill Password Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SessionName\n{{Fill SessionName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Username\n{{Fill Username Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Connect-WinSkype.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Connect-WinSkype\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConnect-WinSkype [[-SessionName] <String>] [[-Username] <String>] [[-Password] <String>] [-AsSecure]\n [-FromFile] [-MultiFactorAuthentication] [-Output] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -AsSecure\n{{Fill AsSecure Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: PasswordAsSecure\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -FromFile\n{{Fill FromFile Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: PasswordFromFile\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -MultiFactorAuthentication\n{{Fill MultiFactorAuthentication Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: mfa\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Output\n{{Fill Output Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Password\n{{Fill Password Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SessionName\n{{Fill SessionName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Username\n{{Fill Username Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Connect-WinTeams.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Connect-WinTeams\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConnect-WinTeams [[-SessionName] <String>] [[-Username] <String>] [[-Password] <String>] [-AsSecure]\n [-FromFile] [-MultiFactorAuthentication] [-Output] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -AsSecure\n{{Fill AsSecure Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: PasswordAsSecure\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -FromFile\n{{Fill FromFile Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: PasswordFromFile\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -MultiFactorAuthentication\n{{Fill MultiFactorAuthentication Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: mfa\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Output\n{{Fill Output Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Password\n{{Fill Password Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SessionName\n{{Fill SessionName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Username\n{{Fill Username Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Convert-BinaryToHex.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Convert-BinaryToHex\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConvert-BinaryToHex [[-Binary] <Byte[]>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Binary\n{{Fill Binary Description}}\n\n```yaml\nType: Byte[]\nParameter Sets: (All)\nAliases: Bin\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: True (ByValue)\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### System.Byte[]\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Convert-BinaryToString.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Convert-BinaryToString\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConvert-BinaryToString [[-Binary] <Byte[]>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Binary\n{{Fill Binary Description}}\n\n```yaml\nType: Byte[]\nParameter Sets: (All)\nAliases: Bin\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: True (ByValue)\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### System.Byte[]\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Convert-Color.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Convert-Color\n\n## SYNOPSIS\nThis color converter gives you the hexadecimal values of your RGB colors and vice versa (RGB to HEX)\n\n## SYNTAX\n\n### RGB\n```\nConvert-Color [[-RGB] <Object>] [<CommonParameters>]\n```\n\n### HEX\n```\nConvert-Color [[-HEX] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\nThis color converter gives you the hexadecimal values of your RGB colors and vice versa (RGB to HEX).\nUse it to convert your colors and prepare your graphics and HTML web pages.\n\n## EXAMPLES\n\n### EXAMPLE 1\n```\n.\\convert-color -hex FFFFFF\n```\n\nConverts hex value FFFFFF to RGB\n\n### EXAMPLE 2\n```\n.\\convert-color -RGB 123,200,255\n```\n\nConverts Red = 123 Green = 200 Blue = 255 to Hex value\n\n## PARAMETERS\n\n### -RGB\n{{Fill RGB Description}}\n\n```yaml\nType: Object\nParameter Sets: RGB\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -HEX\nEnter the Hex value to be converted.\nDo not use the '#' symbol.\n(Ex: 3333CC converts to Red: 51 Green: 51 Blue: 204)\n\n```yaml\nType: String\nParameter Sets: HEX\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n## OUTPUTS\n\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Convert-ExchangeEmail.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Convert-ExchangeEmail\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConvert-ExchangeEmail [[-Emails] <String[]>] [[-Separator] <String>] [-RemoveDuplicates] [-RemovePrefix]\n [-AddSeparator] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Emails\n{{Fill Emails Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Separator\n{{Fill Separator Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -RemoveDuplicates\n{{Fill RemoveDuplicates Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -RemovePrefix\n{{Fill RemovePrefix Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -AddSeparator\n{{Fill AddSeparator Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Convert-ExchangeItems.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Convert-ExchangeItems\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConvert-ExchangeItems [[-Count] <Object>] [[-Default] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Count\n{{Fill Count Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Default\n{{Fill Default Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Convert-ExchangeRecipientDetails.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Convert-ExchangeRecipientDetails\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConvert-ExchangeRecipientDetails [[-RecipientType] <String>] [-FromKey] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -FromKey\n{{Fill FromKey Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -RecipientType\n{{Fill RecipientType Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Convert-ExchangeSize.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Convert-ExchangeSize\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConvert-ExchangeSize [[-To] <String>] [[-Size] <String>] [[-Precision] <Int32>] [-Display]\n [[-Default] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Default\n{{Fill Default Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Display\n{{Fill Display Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Precision\n{{Fill Precision Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Size\n{{Fill Size Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -To\n{{Fill To Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: Bytes, KB, MB, GB, TB\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Convert-HexToBinary.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Convert-HexToBinary\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConvert-HexToBinary [-Hex] <String> [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Hex\n{{Fill Hex Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 0\nDefault value: None\nAccept pipeline input: True (ByValue)\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### System.String\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Convert-KeyToKeyValue.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Convert-KeyToKeyValue\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConvert-KeyToKeyValue [[-Object] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Object\n{{Fill Object Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Convert-Office365License.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Convert-Office365License\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConvert-Office365License [[-License] <String[]>] [-ToSku] [[-Separator] <String>] [-ReturnArray]\n [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -License\n{{Fill License Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ToSku\nConverts license name to SKU\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: SKU\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Separator\n{{Fill Separator Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: ,\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ReturnArray\n{{Fill ReturnArray Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Convert-Size.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Convert-Size\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConvert-Size [[-From] <String>] [[-To] <String>] [-Value] <Double> [[-Precision] <Int32>] [-Display]\n [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Display\n{{Fill Display Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -From\n{{Fill From Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: Bytes, KB, MB, GB, TB\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Precision\n{{Fill Precision Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -To\n{{Fill To Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: Bytes, KB, MB, GB, TB\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Value\n{{Fill Value Description}}\n\n```yaml\nType: Double\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Convert-TimeToDays.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Convert-TimeToDays\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConvert-TimeToDays [[-StartTime] <Object>] [[-EndTime] <Object>] [[-Ignore] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -EndTime\n{{Fill EndTime Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Ignore\n{{Fill Ignore Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -StartTime\n{{Fill StartTime Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Convert-ToDateTime.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Convert-ToDateTime\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConvert-ToDateTime [[-Timestring] <String>] [[-Ignore] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Ignore\n{{Fill Ignore Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Timestring\n{{Fill Timestring Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Convert-ToTimeSpan.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Convert-ToTimeSpan\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConvert-ToTimeSpan [[-StartTime] <DateTime>] [[-EndTime] <DateTime>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -EndTime\n{{Fill EndTime Description}}\n\n```yaml\nType: DateTime\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -StartTime\n{{Fill StartTime Description}}\n\n```yaml\nType: DateTime\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Convert-TwoArraysIntoOne.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Convert-TwoArraysIntoOne\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConvert-TwoArraysIntoOne [[-Object] <Object>] [[-ObjectToAdd] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Object\n{{Fill Object Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ObjectToAdd\n{{Fill ObjectToAdd Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Convert-UAC.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Convert-UAC\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConvert-UAC [[-UAC] <String[]>] [[-Separator] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -UAC\n{{Fill UAC Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Separator\n{{Fill Separator Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/ConvertFrom-Color.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# ConvertFrom-Color\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConvertFrom-Color [[-Color] <RGBColors[]>] [-AsDecimal] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -AsDecimal\n{{Fill AsDecimal Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Color\n{{Fill Color Description}}\n\n```yaml\nType: RGBColors[]\nParameter Sets: (All)\nAliases: Colors\nAccepted values: Black, Navy, DarkBlue, MediumBlue, Blue, DarkGreen, Green, Teal, DarkCyan, DeepSkyBlue, DarkTurquoise, MediumSpringGreen, Lime, SpringGreen, Aqua, Cyan, MidnightBlue, DodgerBlue, LightSeaGreen, ForestGreen, SeaGreen, DarkSlateGray, DarkSlateGrey, LimeGreen, MediumSeaGreen, Turquoise, RoyalBlue, SteelBlue, DarkSlateBlue, MediumTurquoise, Indigo, DarkOliveGreen, CadetBlue, CornflowerBlue, MediumAquamarine, DimGray, DimGrey, SlateBlue, OliveDrab, SlateGray, SlateGrey, LightSlateGray, LightSlateGrey, MediumSlateBlue, LawnGreen, Chartreuse, Aquamarine, Maroon, Purple, Olive, Grey, Gray, SkyBlue, LightSkyBlue, BlueViolet, DarkRed, DarkMagenta, SaddleBrown, DarkSeaGreen, LightGreen, MediumPurple, DarkViolet, PaleGreen, DarkOrchid, YellowGreen, Sienna, Brown, DarkGray, DarkGrey, LightBlue, GreenYellow, PaleTurquoise, LightSteelBlue, PowderBlue, FireBrick, DarkGoldenrod, MediumOrchid, RosyBrown, DarkKhaki, Silver, MediumVioletRed, IndianRed, Peru, Chocolate, Tan, LightGray, LightGrey, Thistle, Orchid, Goldenrod, PaleVioletRed, Crimson, Gainsboro, Plum, BurlyWood, LightCyan, Lavender, DarkSalmon, Violet, PaleGoldenrod, LightCoral, Khaki, AliceBlue, Honeydew, Azure, SandyBrown, Wheat, Beige, WhiteSmoke, MintCream, GhostWhite, Salmon, AntiqueWhite, Linen, LightGoldenrodYellow, OldLace, Red, Fuchsia, Magenta, DeepPink, OrangeRed, Tomato, HotPink, Coral, DarkOrange, LightSalmon, Orange, LightPink, Pink, Gold, PeachPuff, NavajoWhite, Moccasin, Bisque, MistyRose, BlanchedAlmond, PapayaWhip, LavenderBlush, Seashell, Cornsilk, LemonChiffon, FloralWhite, Snow, Yellow, LightYellow, Ivory, White\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/ConvertFrom-ErrorRecord.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# ConvertFrom-ErrorRecord\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n### ErrorRecord\n```\nConvertFrom-ErrorRecord -ErrorRecord <ErrorRecord[]> [<CommonParameters>]\n```\n\n### StopException\n```\nConvertFrom-ErrorRecord -Exception <ActionPreferenceStopException[]> [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ErrorRecord\n{{Fill ErrorRecord Description}}\n\n```yaml\nType: ErrorRecord[]\nParameter Sets: ErrorRecord\nAliases:\n\nRequired: True\nPosition: Named\nDefault value: None\nAccept pipeline input: True (ByValue)\nAccept wildcard characters: False\n```\n\n### -Exception\n{{Fill Exception Description}}\n\n```yaml\nType: ActionPreferenceStopException[]\nParameter Sets: StopException\nAliases:\n\nRequired: True\nPosition: Named\nDefault value: None\nAccept pipeline input: True (ByValue)\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### System.Management.Automation.ErrorRecord[]\n\n### System.Management.Automation.ActionPreferenceStopException[]\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/ConvertFrom-OperationType.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# ConvertFrom-OperationType\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConvertFrom-OperationType [[-OperationType] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -OperationType\n{{Fill OperationType Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/ConvertFrom-SID.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# ConvertFrom-SID\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConvertFrom-SID [[-Sid] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Sid\n{{Fill Sid Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/ConvertFrom-X500Address.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# ConvertFrom-X500Address\n\n## SYNOPSIS\n\n## SYNTAX\n\n```\nConvertFrom-X500Address [[-IMCEAEXString] <String>] [-Full] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### EXAMPLE 1\n```\nBy default returns string without @evotec.pl in the end. This is because the string from NDR needs domain name removed to be able to add it back to Exchange\n```\n\nConvertFrom-X500Address -IMCEAEXString 'IMCEAEX-_o=AD_ou=Exchange+20Administrative+20Group+20+28FYDIBOHF23SPDLT+29_cn=Recipients_cn=5209048016da47689b4421790ad1763f-EVOTEC+20PL+20Recepcja+20G@evotec.pl'\nConvertFrom-X500Address -IMCEAEXString 'IMCEAEX-_o=AD_ou=Exchange+20Administrative+20Group+20+28FYDIBOHF23SPDLT+29_cn=Recipients_cn=8bcad655e07c46788fe1f796162cd87f-EVOTEC+20PL+20Recepcja+20G@evotec.pl'\nConvertFrom-X500Address -IMCEAEXString 'IMCEAEX-_o=AD_ou=Exchange+20Administrative+20Group+20+28FYDIBOHF23SPDLT+29_cn=Recipients_cn=0d4540e9a8f845d798625c9c0ad753bf-Test-All-Group@evotec.pl'\nConvertFrom-X500Address -IMCEAEXString 'IMCEAEX-_o=AD_ou=Exchange+20Administrative+20Group+20+28FYDIBOHF23SPDLT+29_cn=Recipients_cn=0d4540e9a8f845d798625c9c0ad753bf-Test-All-Group@evotec.pl'\n\n### EXAMPLE 2\n```\nConvertFrom-X500Address -IMCEAEXString 'IMCEAEX-_o=AD_ou=Exchange+20Administrative+20Group+20+28FYDIBOHF23SPDLT+29_cn=Recipients_cn=5209048016da47689b4421790ad1763f-EVOTEC+20PL+20Recepcja+20G@evotec.pl' -Full\n```\n\nConvertFrom-X500Address -IMCEAEXString 'IMCEAEX-_o=AD_ou=Exchange+20Administrative+20Group+20+28FYDIBOHF23SPDLT+29_cn=Recipients_cn=8bcad655e07c46788fe1f796162cd87f-EVOTEC+20PL+20Recepcja+20G@evotec.pl' -Full\nConvertFrom-X500Address -IMCEAEXString 'IMCEAEX-_o=AD_ou=Exchange+20Administrative+20Group+20+28FYDIBOHF23SPDLT+29_cn=Recipients_cn=0d4540e9a8f845d798625c9c0ad753bf-Test-All-Group@evotec.pl' -Full\nConvertFrom-X500Address -IMCEAEXString 'IMCEAEX-_o=AD_ou=Exchange+20Administrative+20Group+20+28FYDIBOHF23SPDLT+29_cn=Recipients_cn=0d4540e9a8f845d798625c9c0ad753bf-Test-All-Group@evotec.pl' -Full\n\n## PARAMETERS\n\n### -IMCEAEXString\n{{Fill IMCEAEXString Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Full\n{{Fill Full Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n## OUTPUTS\n\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/ConvertTo-ImmutableID.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# ConvertFrom-SID\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nConvertFrom-SID [[-Sid] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Sid\n{{Fill Sid Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Disconnect-WinAzure.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Disconnect-WinAzure\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nDisconnect-WinAzure [[-SessionName] <String>] [-Output] [-Force] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Force\n{{Fill Force Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Output\n{{Fill Output Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SessionName\n{{Fill SessionName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Disconnect-WinAzureAD.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Disconnect-WinAzureAD\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nDisconnect-WinAzureAD [[-SessionName] <String>] [-Output] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Output\n{{Fill Output Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SessionName\n{{Fill SessionName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Disconnect-WinExchange.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Disconnect-WinExchange\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nDisconnect-WinExchange [[-SessionName] <String>] [-Output] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Output\n{{Fill Output Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SessionName\n{{Fill SessionName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Disconnect-WinSecurityCompliance.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Disconnect-WinSecurityCompliance\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nDisconnect-WinSecurityCompliance [[-SessionName] <String>] [-Output] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Output\n{{Fill Output Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SessionName\n{{Fill SessionName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Disconnect-WinService.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Disconnect-WinService\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nDisconnect-WinService [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Disconnect-WinSkype.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Disconnect-WinSkype\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nDisconnect-WinSkype [[-SessionName] <String>] [-Output] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Output\n{{Fill Output Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SessionName\n{{Fill SessionName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Disconnect-WinTeams.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Disconnect-WinTeams\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nDisconnect-WinTeams [[-SessionName] <String>] [-Output] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Output\n{{Fill Output Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SessionName\n{{Fill SessionName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Find-ADConnectServer.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Find-ADConnectServer\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFind-ADConnectServer [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Find-DatesCurrentDayMinusDayX.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Find-DatesCurrentDayMinusDayX\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFind-DatesCurrentDayMinusDayX [[-days] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -days\n{{Fill days Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Find-DatesCurrentDayMinuxDaysX.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Find-DatesCurrentDayMinuxDaysX\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFind-DatesCurrentDayMinuxDaysX [[-days] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -days\n{{Fill days Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Find-DatesCurrentHour.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Find-DatesCurrentHour\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFind-DatesCurrentHour [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Find-DatesDayPrevious.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Find-DatesDayPrevious\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFind-DatesDayPrevious [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Find-DatesDayToday.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Find-DatesDayToday\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFind-DatesDayToday [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Find-DatesMonthCurrent.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Find-DatesMonthCurrent\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFind-DatesMonthCurrent [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Find-DatesMonthPast.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Find-DatesMonthPast\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFind-DatesMonthPast [[-Force] <Boolean>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Force\n{{Fill Force Description}}\n\n```yaml\nType: Boolean\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Find-DatesPastHour.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Find-DatesPastHour\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFind-DatesPastHour [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Find-DatesPastWeek.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Find-DatesPastWeek\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFind-DatesPastWeek [[-DayName] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -DayName\n{{Fill DayName Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Find-DatesQuarterCurrent.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Find-DatesQuarterCurrent\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFind-DatesQuarterCurrent [[-Force] <Boolean>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Force\n{{Fill Force Description}}\n\n```yaml\nType: Boolean\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Find-DatesQuarterLast.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Find-DatesQuarterLast\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFind-DatesQuarterLast [[-Force] <Boolean>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Force\n{{Fill Force Description}}\n\n```yaml\nType: Boolean\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Find-ExchangeServer.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Find-ExchangeServer\n\n## SYNOPSIS\nFind Exchange Servers in Active Directory\n\n## SYNTAX\n\n```\nFind-ExchangeServer [<CommonParameters>]\n```\n\n## DESCRIPTION\nFind Exchange Servers in Active Directory\n\n## EXAMPLES\n\n### EXAMPLE 1\n```\nFind-ExchangeServer\n```\n\n## PARAMETERS\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n## OUTPUTS\n\n## NOTES\nGeneral notes\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Find-HyperVServer.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Find-HyperVServer\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFind-HyperVServer [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Find-MyProgramData.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Find-MyProgramData\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFind-MyProgramData [[-Data] <Object>] [[-FindText] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Data\n{{Fill Data Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -FindText\n{{Fill FindText Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Find-ServerTypes.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Find-ServerTypes\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFind-ServerTypes [[-Type] <String[]>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Type\n{{Fill Type Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\nAccepted values: All, ADConnect, DomainController, Exchange, Hyper-V, RDSLicense, SQL, VirtualMachine\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Find-TypesNeeded.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Find-TypesNeeded\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFind-TypesNeeded [[-TypesRequired] <Object>] [[-TypesNeeded] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -TypesNeeded\n{{Fill TypesNeeded Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -TypesRequired\n{{Fill TypesRequired Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Find-UsersProxyAddressesStatus.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Find-UsersProxyAddressesStatus\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFind-UsersProxyAddressesStatus [[-User] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -User\n{{Fill User Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Format-AddSpaceToSentence.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Format-AddSpaceToSentence\n\n## SYNOPSIS\nShort description\n\n## SYNTAX\n\n```\nFormat-AddSpaceToSentence [-Text] <String[]> [-ToLowerCase] [<CommonParameters>]\n```\n\n## DESCRIPTION\nLong description\n\n## EXAMPLES\n\n### EXAMPLE 1\n```\n$test = @(\n```\n\n'OnceUponATime',\n    'OnceUponATime1',\n    'Money@Risk',\n    'OnceUponATime123',\n    'AHappyMan2014'\n    'OnceUponATime_123'\n)\n\nFormat-AddSpaceToSentence -Text $Test\n\n$Test | Format-AddSpaceToSentence -ToLowerCase\n\n## PARAMETERS\n\n### -Text\nParameter description\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: True (ByValue)\nAccept wildcard characters: False\n```\n\n### -ToLowerCase\n{{Fill ToLowerCase Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n## OUTPUTS\n\n## NOTES\nGeneral notes\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Format-FirstXChars.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Format-FirstXChars\n\n## SYNOPSIS\nShort description\n\n## SYNTAX\n\n```\nFormat-FirstXChars [[-Text] <String>] [[-NumberChars] <Int32>] [<CommonParameters>]\n```\n\n## DESCRIPTION\nLong description\n\n## EXAMPLES\n\n### EXAMPLE 1\n```\nFormat-FirstChars -Text \"VERBOSE: Loading module from path 'C:\\Users\\pklys\\.vscode\\extensions\\ms-vs\" -NumberChars 15\n```\n\n## PARAMETERS\n\n### -Text\nParameter description\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -NumberChars\nParameter description\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: 0\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n## OUTPUTS\n\n## NOTES\nGeneral notes\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Format-PSTable.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Format-PSTable\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFormat-PSTable [[-Object] <Object>] [-SkipTitle] [[-Property] <String[]>] [[-ExcludeProperty] <String[]>]\n [-NoAliasOrScriptProperties] [-DisplayPropertySet] [[-OverwriteHeaders] <Object>] [-PreScanHeaders]\n [[-StringLenghts] <PSReference>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -DisplayPropertySet\n{{Fill DisplayPropertySet Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ExcludeProperty\n{{Fill ExcludeProperty Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -NoAliasOrScriptProperties\n{{Fill NoAliasOrScriptProperties Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Object\n{{Fill Object Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: True (ByPropertyName, ByValue)\nAccept wildcard characters: False\n```\n\n### -OverwriteHeaders\n{{Fill OverwriteHeaders Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -PreScanHeaders\n{{Fill PreScanHeaders Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Property\n{{Fill Property Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SkipTitle\n{{Fill SkipTitle Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -StringLenghts\n{{Fill StringLenghts Description}}\n\n```yaml\nType: PSReference\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 4\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### System.Object\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Format-Stream.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Format-Stream\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n### All (Default)\n```\nFormat-Stream [[-InputObject] <Object>] [-HideTableHeaders] [[-ColumnHeaderSize] <Int32>] [-AlignRight]\n [[-Stream] <String>] [-List] [-Transpose] [[-TransposeSort] <String>] [-ForegroundColor <ConsoleColor[]>]\n [-ForegroundColorRow <Int32[]>] [<CommonParameters>]\n```\n\n### Property\n```\nFormat-Stream [[-InputObject] <Object>] [[-Property] <Object[]>] [-HideTableHeaders]\n [[-ColumnHeaderSize] <Int32>] [-AlignRight] [[-Stream] <String>] [-List] [-Transpose]\n [[-TransposeSort] <String>] [-ForegroundColor <ConsoleColor[]>] [-ForegroundColorRow <Int32[]>]\n [<CommonParameters>]\n```\n\n### ExcludeProperty\n```\nFormat-Stream [[-InputObject] <Object>] [[-ExcludeProperty] <Object[]>] [-HideTableHeaders]\n [[-ColumnHeaderSize] <Int32>] [-AlignRight] [[-Stream] <String>] [-List] [-Transpose]\n [[-TransposeSort] <String>] [-ForegroundColor <ConsoleColor[]>] [-ForegroundColorRow <Int32[]>]\n [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -AlignRight\n{{Fill AlignRight Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 5\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ColumnHeaderSize\n{{Fill ColumnHeaderSize Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 4\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ExcludeProperty\n{{Fill ExcludeProperty Description}}\n\n```yaml\nType: Object[]\nParameter Sets: ExcludeProperty\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ForegroundColor\n{{Fill ForegroundColor Description}}\n\n```yaml\nType: ConsoleColor[]\nParameter Sets: (All)\nAliases: Color\nAccepted values: Black, DarkBlue, DarkGreen, DarkCyan, DarkRed, DarkMagenta, DarkYellow, Gray, DarkGray, Blue, Green, Cyan, Red, Magenta, Yellow, White\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ForegroundColorRow\n{{Fill ForegroundColorRow Description}}\n\n```yaml\nType: Int32[]\nParameter Sets: (All)\nAliases: ColorRow\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -HideTableHeaders\n{{Fill HideTableHeaders Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -InputObject\n{{Fill InputObject Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: True (ByPropertyName, ByValue)\nAccept wildcard characters: False\n```\n\n### -List\n{{Fill List Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: AsList\n\nRequired: False\nPosition: 7\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Property\n{{Fill Property Description}}\n\n```yaml\nType: Object[]\nParameter Sets: Property\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Stream\n{{Fill Stream Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: Output, Host, Warning, Verbose, Debug, Information\n\nRequired: False\nPosition: 6\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Transpose\n{{Fill Transpose Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: Rotate, RotateData, TransposeColumnsRows, TransposeData\n\nRequired: False\nPosition: 8\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -TransposeSort\n{{Fill TransposeSort Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: ASC, DESC, NONE\n\nRequired: False\nPosition: 9\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### System.Object\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Format-ToTitleCase.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Format-ToTitleCase\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFormat-ToTitleCase [-Text] <String[]> [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Text\n{{Fill Text Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 0\nDefault value: None\nAccept pipeline input: True (ByValue)\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### System.String[]\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Format-TransposeTable.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Format-TransposeTable\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFormat-TransposeTable [[-Object] <Object[]>] [[-Sort] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Object\n{{Fill Object Description}}\n\n```yaml\nType: Object[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: True (ByPropertyName, ByValue)\nAccept wildcard characters: False\n```\n\n### -Sort\n{{Fill Sort Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: ASC, DESC, NONE\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### System.Object[]\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Format-Verbose.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Format-TransposeTable\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nFormat-TransposeTable [[-Object] <Object[]>] [[-Sort] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Object\n{{Fill Object Description}}\n\n```yaml\nType: Object[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: True (ByPropertyName, ByValue)\nAccept wildcard characters: False\n```\n\n### -Sort\n{{Fill Sort Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: ASC, DESC, NONE\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### System.Object[]\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Format-View.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Format-View\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n### All (Default)\n```\nFormat-View [[-InputObject] <Object>] [-HideTableHeaders] [[-Stream] <String>] [-List] [-Autosize]\n [<CommonParameters>]\n```\n\n### Property\n```\nFormat-View [[-InputObject] <Object>] [[-Property] <Object[]>] [-HideTableHeaders] [[-Stream] <String>] [-List]\n [-Autosize] [<CommonParameters>]\n```\n\n### ExcludeProperty\n```\nFormat-View [[-InputObject] <Object>] [[-ExcludeProperty] <Object[]>] [-HideTableHeaders] [[-Stream] <String>]\n [-List] [-Autosize] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Autosize\n{{Fill Autosize Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 8\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ExcludeProperty\n{{Fill ExcludeProperty Description}}\n\n```yaml\nType: Object[]\nParameter Sets: ExcludeProperty\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -HideTableHeaders\n{{Fill HideTableHeaders Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -InputObject\n{{Fill InputObject Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: True (ByPropertyName, ByValue)\nAccept wildcard characters: False\n```\n\n### -List\n{{Fill List Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: AsList\n\nRequired: False\nPosition: 7\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Property\n{{Fill Property Description}}\n\n```yaml\nType: Object[]\nParameter Sets: Property\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Stream\n{{Fill Stream Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: Output, Host, Warning, Verbose, Debug, Information\n\nRequired: False\nPosition: 6\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable.\nFor more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### System.Object\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-CimData.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-CimData\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-CimData [[-ComputerName] <String[]>] [[-Protocol] <String>] [[-Class] <String>] [[-Properties] <String[]>]\n [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Class\n{{Fill Class Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ComputerName\n{{Fill ComputerName Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Properties\n{{Fill Properties Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Protocol\n{{Fill Protocol Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: Default, Dcom, Wsman\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable.\nFor more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-CommandInfo.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-CommandInfo\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-CommandInfo [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ComputerApplications.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ComputerApplications\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ComputerApplications [[-ComputerName] <Object>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ComputerName\n{{Fill ComputerName Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ComputerBios.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ComputerBios\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ComputerBios [[-ComputerName] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ComputerName\n{{Fill ComputerName Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable.\nFor more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ComputerCPU.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ComputerCPU\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ComputerCPU [[-ComputerName] <String[]>] [[-Protocol] <String>] [-All] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -All\n{{Fill All Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ComputerName\n{{Fill ComputerName Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Protocol\n{{Fill Protocol Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: Default, Dcom, Wsman\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable.\nFor more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ComputerCulture.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ComputerCulture\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ComputerCulture [[-ComputerName] <Object>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ComputerName\n{{Fill ComputerName Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ComputerDisk.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ComputerDisk\n\n## SYNOPSIS\nShort description\n\n## SYNTAX\n\n```\nGet-ComputerDisk [[-ComputerName] <String[]>] [[-Protocol] <String>] [-All] [<CommonParameters>]\n```\n\n## DESCRIPTION\nLong description\n\n## EXAMPLES\n\n### EXAMPLE 1\n```\nGet-ComputerDisk -ComputerName AD1, AD2, EVO1, AD2019 | Format-Table -AutoSize *\n```\n\nOutput:\nWARNING: Get-ComputerSystem - No data for computer AD2019.\nMost likely an error on receiving side.\n\nComputerName Index Model                     Caption                   SerialNumber         Description MediaType             FirmwareRevision Partitions SizeGB PNPDeviceID\n------------ ----- -----                     -------                   ------------         ----------- ---------             ---------------- ---------- ------ -----------\nAD1              0 Microsoft Virtual Disk    Microsoft Virtual Disk                         Disk drive  Fixed hard disk media 1.0                       3    127 SCSI\\DISK&VEN_MSFT&PROD_VIRTUAL_DISK\\000000\nAD2              0 Microsoft Virtual Disk    Microsoft Virtual Disk                         Disk drive  Fixed hard disk media 1.0                       3    127 SCSI\\DISK&VEN_MSFT&PROD_VIRTUAL_DISK\\000000\nEVO1             0 WDC WD30EFRX-68AX9N0      WDC WD30EFRX-68AX9N0      WD-WMC1T2351095      Disk drive  Fixed hard disk media 80.00A80                  1   2795 SCSI\\DISK&VEN_WDC&PROD_WD30EFRX-68AX9N0\\4&191557A4&0&000000\nEVO1             2 Samsung SSD 950 PRO 512GB Samsung SSD 950 PRO 512GB 0025_3857_61B0_0EF2.\nDisk drive  Fixed hard disk media 2B0Q                      3    477 SCSI\\DISK&VEN_NVME&PROD_SAMSUNG_SSD_950\\5&35365596&0&000000\nEVO1             1 Samsung SSD 860 EVO 500GB Samsung SSD 860 EVO 500GB S3Z2NB0K176976A      Disk drive  Fixed hard disk media RVT01B6Q                  1    466 SCSI\\DISK&VEN_SAMSUNG&PROD_SSD\\4&191557A4&0&000100\n\n## PARAMETERS\n\n### -ComputerName\nParameter description\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: $Env:COMPUTERNAME\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Protocol\nParameter description\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: Default\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -All\nParameter description\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable.\nFor more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n## OUTPUTS\n\n## NOTES\nGeneral notes\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ComputerDiskLogical.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ComputerDiskLogical\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ComputerDiskLogical [[-ComputerName] <Object>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ComputerName\n{{Fill ComputerName Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ComputerMissingDrivers.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ComputerMissingDrivers\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ComputerMissingDrivers [[-ComputerName] <Object>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ComputerName\n{{Fill ComputerName Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ComputerNetwork.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ComputerNetwork\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ComputerNetwork [[-ComputerName] <Object>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ComputerName\n{{Fill ComputerName Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ComputerOemInformation.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ComputerOemInformation\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ComputerOemInformation [[-ComputerName] <Object>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ComputerName\n{{Fill ComputerName Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ComputerOperatingSystem.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ComputerOperatingSystem\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ComputerOperatingSystem [[-ComputerName] <String[]>] [[-Protocol] <String>] [-All] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -All\n{{Fill All Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ComputerName\n{{Fill ComputerName Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Protocol\n{{Fill Protocol Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: Default, Dcom, Wsman\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable.\nFor more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ComputerServices.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ComputerServices\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ComputerServices [[-ComputerName] <Object>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ComputerName\n{{Fill ComputerName Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ComputerStartup.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ComputerStartup\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ComputerStartup [[-ComputerName] <Object>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ComputerName\n{{Fill ComputerName Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ComputerSystem.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ComputerSystem\n\n## SYNOPSIS\nShort description\n\n## SYNTAX\n\n```\nGet-ComputerSystem [[-ComputerName] <String[]>] [[-Protocol] <String>] [-All] [<CommonParameters>]\n```\n\n## DESCRIPTION\nLong description\n\n## EXAMPLES\n\n### EXAMPLE 1\n```\nGet-ComputerSystem -ComputerName AD1, AD2, EVO1, ADFFS | ft -a *\n```\n\nOutput:\nWARNING: Get-ComputerSystem - No data for computer ADFFS.\nMost likely an error on receiving side.\nComputerName Name Manufacturer          Domain        Model           Systemtype   PrimaryOwnerName PCSystemType PartOfDomain CurrentTimeZone BootupState SystemFamily    Roles\n------------ ---- ------------          ------        -----           ----------   ---------------- ------------ ------------ --------------- ----------- ------------    -----\nAD1          AD1  Microsoft Corporation ad.evotec.xyz Virtual Machine x64-based PC Windows User                1         True              60 Normal boot Virtual Machine LM_Workstation, LM_Server, Primary_Domain_Controller, Timesource, NT, DFS\nAD2          AD2  Microsoft Corporation ad.evotec.xyz Virtual Machine x64-based PC Windows User                1         True              60 Normal boot Virtual Machine LM_Workstation, LM_Server, Backup_Domain_Controller, Timesource, NT, DFS\nEVO1         EVO1 MSI                   ad.evotec.xyz MS-7980         x64-based PC                             1         True              60 Normal boot Default string  LM_Workstation, LM_Server, SQLServer, NT, Potential_Browser, Master_Browser\n\n## PARAMETERS\n\n### -ComputerName\nParameter description\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: $Env:COMPUTERNAME\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Protocol\nParameter description\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: Default\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -All\nParameter description\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable.\nFor more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n## OUTPUTS\n\n## NOTES\nGeneral notes\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ComputerWindowsFeatures.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ComputerWindowsFeatures\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ComputerWindowsFeatures [[-ComputerName] <Object>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ComputerName\n{{Fill ComputerName Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ComputerWindowsUpdates.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ComputerWindowsUpdates\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ComputerWindowsUpdates [[-ComputerName] <Object>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ComputerName\n{{Fill ComputerName Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-FileInformation.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-FileInformation\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-FileInformation [[-File] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -File\n{{Fill File Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-FileName.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-FileName\n\n## SYNOPSIS\nShort description\n\n## SYNTAX\n\n```\nGet-FileName [[-Extension] <String>] [-Temporary] [-TemporaryFileOnly] [<CommonParameters>]\n```\n\n## DESCRIPTION\nLong description\n\n## EXAMPLES\n\n### EXAMPLE 1\n```\nGet-FileName -Temporary\n```\n\nOutput: 3ymsxvav.tmp\n\nGet-FileName -Temporary\nOutput: C:\\Users\\pklys\\AppData\\Local\\Temp\\tmpD74C.tmp\n\nGet-FileName -Temporary -Extension 'xlsx'\nOutput: C:\\Users\\pklys\\AppData\\Local\\Temp\\tmp45B6.xlsx\n\n## PARAMETERS\n\n### -Extension\nParameter description\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: Tmp\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Temporary\nParameter description\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -TemporaryFileOnly\nParameter description\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n## OUTPUTS\n\n## NOTES\nGeneral notes\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-FileSize.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-FileSize\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-FileSize [[-Bytes] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Bytes\n{{Fill Bytes Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-FilesInFolder.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-FilesInFolder\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-FilesInFolder [[-Folder] <String>] [[-Extension] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Extension\n{{Fill Extension Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Folder\n{{Fill Folder Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-HTML.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-HTML\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-HTML [[-text] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -text\n{{Fill text Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-HashMaxValue.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-HashMaxValue\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-HashMaxValue [[-hashTable] <Object>] [-Lowest] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Lowest\n{{Fill Lowest Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -hashTable\n{{Fill hashTable Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-IPAddressInformation.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-IPAddressInformation\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-IPAddressInformation [[-IP] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -IP\n{{Fill IP Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-InstalledApplication.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-InstalledApplication\n\n## SYNOPSIS\n\n## SYNTAX\n\n```\nGet-InstalledApplication [[-DisplayName] <String[]>] [[-Type] <String>] [-All] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### EXAMPLE 1\n```\nGet-InstalledApplication -Type UserInstalled -DisplayName 'JetBrains dotCover 2017.1.1'\n```\n\n## PARAMETERS\n\n### -DisplayName\n{{Fill DisplayName Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Type\n= \"Microsoft Exchange Online Powershell Module\",\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: UserInstalled\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -All\n{{Fill All Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n## OUTPUTS\n\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-Logger.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-Logger\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n### All (Default)\n```\nGet-Logger [-ShowTime] [-TimeFormat <String>] [<CommonParameters>]\n```\n\n### Logpath\n```\nGet-Logger [-LogPath <String>] [-ShowTime] [-TimeFormat <String>] [<CommonParameters>]\n```\n\n### Complexpath\n```\nGet-Logger [-LogsDir <String>] [-Filename <String>] [-ShowTime] [-TimeFormat <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Filename\n{{Fill Filename Description}}\n\n```yaml\nType: String\nParameter Sets: Complexpath\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -LogPath\n{{Fill LogPath Description}}\n\n```yaml\nType: String\nParameter Sets: Logpath\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -LogsDir\n{{Fill LogsDir Description}}\n\n```yaml\nType: String\nParameter Sets: Complexpath\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ShowTime\n{{Fill ShowTime Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -TimeFormat\n{{Fill TimeFormat Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-MimeType.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-MimeType\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-MimeType [-FileName] <String> [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -FileName\n{{Fill FileName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ModulesAvailability.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ModulesAvailability\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ModulesAvailability [[-Name] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Name\n{{Fill Name Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-MyIpAddress.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-MyIpAddress\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-MyIpAddress [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ObjectCount.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ObjectCount\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ObjectCount [[-Object] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Object\n{{Fill Object Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: True (ByPropertyName, ByValue)\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### System.Object\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ObjectData.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ObjectData\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ObjectData [[-Object] <Object>] [[-Title] <Object>] [-DoNotAddTitles] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -DoNotAddTitles\n{{Fill DoNotAddTitles Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Object\n{{Fill Object Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Title\n{{Fill Title Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ObjectEnumValues.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ObjectEnumValues\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ObjectEnumValues [[-enum] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -enum\n{{Fill enum Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ObjectKeys.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ObjectKeys\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ObjectKeys [[-Object] <Object>] [[-Ignore] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Ignore\n{{Fill Ignore Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Object\n{{Fill Object Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ObjectProperties.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ObjectProperties\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ObjectProperties [[-Object] <Object>] [[-AddProperties] <String[]>] [-Sort] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -AddProperties\n{{Fill AddProperties Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Object\n{{Fill Object Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Sort\n{{Fill Sort Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ObjectPropertiesAdvanced.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ObjectPropertiesAdvanced\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ObjectPropertiesAdvanced [[-Object] <Object>] [[-AddProperties] <String[]>] [-Sort] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -AddProperties\n{{Fill AddProperties Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Object\n{{Fill Object Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Sort\n{{Fill Sort Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ObjectTitles.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ObjectTitles\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ObjectTitles [[-Object] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Object\n{{Fill Object Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ObjectType.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ObjectType\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ObjectType [[-Object] <Object>] [[-ObjectName] <String>] [-VerboseOnly] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Object\n{{Fill Object Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ObjectName\n{{Fill ObjectName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -VerboseOnly\n{{Fill VerboseOnly Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-PathSeparator.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-PathSeparator\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-PathSeparator [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-PathTemporary.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-PathTemporary\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-PathTemporary [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-RandomCharacters.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-RandomCharacters\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-RandomCharacters [[-length] <Int32>] [[-characters] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -characters\n{{Fill characters Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -length\n{{Fill length Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-RandomPassword.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-RandomPassword\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-RandomPassword [[-LettersLowerCase] <Int32>] [[-LettersHigherCase] <Int32>] [[-Numbers] <Int32>]\n [[-SpecialChars] <Int32>] [[-SpecialCharsLimited] <Int32>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -LettersHigherCase\n{{Fill LettersHigherCase Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -LettersLowerCase\n{{Fill LettersLowerCase Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Numbers\n{{Fill Numbers Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SpecialChars\n{{Fill SpecialChars Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SpecialCharsLimited\n{{Fill SpecialCharsLimited Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 4\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-RandomStringName.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-RandomStringName\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-RandomStringName [[-Size] <Int32>] [-ToLower] [-ToUpper] [-LettersOnly] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -LettersOnly\n{{Fill LettersOnly Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Size\n{{Fill Size Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ToLower\n{{Fill ToLower Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ToUpper\n{{Fill ToUpper Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-ServerRoles.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-ServerRoles\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-ServerRoles [[-ComputerName] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ComputerName\n{{Fill ComputerName Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable.\nFor more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-SqlQueryColumnInformation.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-SqlQueryColumnInformation\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-SqlQueryColumnInformation [[-SqlServer] <String>] [[-SqlDatabase] <String>] [[-Table] <String>]\n [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -SqlDatabase\n{{Fill SqlDatabase Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SqlServer\n{{Fill SqlServer Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Table\n{{Fill Table Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-TimeSynchronization.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-TimeSynchronization\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-TimeSynchronization [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-TimeZoneAdvanced.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-TimeZoneAdvanced\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-TimeZoneAdvanced [[-ComputerName] <String[]>] [[-Credential] <PSCredential>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ComputerName\n{{Fill ComputerName Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Credential\n{{Fill Credential Description}}\n\n```yaml\nType: PSCredential\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-TimeZoneLegacy.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-TimeZoneLegacy\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-TimeZoneLegacy [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-Types.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-Types\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-Types [[-Types] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Types\n{{Fill Types Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-WinADForestControllers.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-WinADForestControllers\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-WinADForestControllers [-TestAvailability] [-SkipEmpty] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -SkipEmpty\n{{Fill SkipEmpty Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -TestAvailability\n{{Fill TestAvailability Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-WinADForestOptions.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version: http://myotherpcisacloud.com\nschema: 2.0.0\n---\n\n# Get-WinADForestOptions\n\n## SYNOPSIS\nThis Cmdlet gets Active Directory Site Options.\n\n## SYNTAX\n\n```\nGet-WinADForestOptions [<CommonParameters>]\n```\n\n## DESCRIPTION\nThis Cmdlet gets Active Directory Site Options.\nWe can fill out the rest of this comment-based help later.\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n## OUTPUTS\n\n## NOTES\nWritten by Ryan Ries, October 2013.\nryanries09@gmail.com.\n\n## RELATED LINKS\n\n[http://myotherpcisacloud.com](http://myotherpcisacloud.com)\n\n[https://serverfault.com/questions/543143/detecting-ad-site-options-using-powershell](https://serverfault.com/questions/543143/detecting-ad-site-options-using-powershell)\n\n"
  },
  {
    "path": "Docs/Get-WinADOrganizationalUnitData.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-WinADOrganizationalUnitData\n\n## SYNOPSIS\nShort description\n\n## SYNTAX\n\n```\nGet-WinADOrganizationalUnitData [[-OrganizationalUnit] <String[]>] [<CommonParameters>]\n```\n\n## DESCRIPTION\nLong description\n\n## EXAMPLES\n\n### EXAMPLE 1\n```\nAn example\n```\n\nGet-WinADOrganizationalUnitData -OrganizationalUnit 'OU=Users-O365,OU=Production,DC=ad,DC=evotec,DC=xyz'\n\n## PARAMETERS\n\n### -OrganizationalUnit\nParameter description\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n## OUTPUTS\n\n## NOTES\nOutput of function:\n    CanonicalName                   : ad.evotec.xyz/Production/Users-O365\n    City                            :\n    CN                              :\n    Country                         : PL\n    Created                         : 09.11.2018 17:38:32\n    Description                     : OU for Synchronization of Users to Office 365\n    DisplayName                     :\n    DistinguishedName               : OU=Users-O365,OU=Production,DC=ad,DC=evotec,DC=xyz\n    LinkedGroupPolicyObjects        : {cn={74D09C6F-35E9-4743-BCF7-F87D7010C60D},cn=policies,cn=system,DC=ad,DC=evotec,DC=xyz}\n    ManagedBy                       :\n    Modified                        : 19.11.2018 22:54:47\n    Name                            : Users-O365\n    PostalCode                      :\n    ProtectedFromAccidentalDeletion : True\n    State                           :\n    StreetAddress                   :\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-WinADOrganizationalUnitFromDN.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-WinADOrganizationalUnitFromDN\n\n## SYNOPSIS\n\n## SYNTAX\n\n```\nGet-WinADOrganizationalUnitFromDN [[-DistinguishedName] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\nLong description\n\n## EXAMPLES\n\n### EXAMPLE 1\n```\nAn example\n```\n\n$DistinguishedName = 'CN=Przemyslaw Klys,OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz'\nGet-WinADOrganizationalUnitFromDN -DistinguishedName $DistinguishedName\n\n## PARAMETERS\n\n### -DistinguishedName\nParameter description\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n## OUTPUTS\n\n## NOTES\nGeneral notes\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-WinADUserSnapshot.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-WinADUserSnapshot\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-WinADUserSnapshot [-User] <Object> [[-XmlPath] <String>] [-WhatIf] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -User\n{{Fill User Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -WhatIf\nShows what would happen if the cmdlet runs.\nThe cmdlet is not run.\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -XmlPath\n{{Fill XmlPath Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-WinADUsersByDN.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-WinADUsersByDN\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-WinADUsersByDN [[-DistinguishedName] <String[]>] [[-Field] <String>] [-All] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -All\n{{Fill All Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -DistinguishedName\n{{Fill DistinguishedName Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases: DN\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Field\n{{Fill Field Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Get-WinADUsersByOU.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Get-WinADUsersByOU\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nGet-WinADUsersByOU [[-OrganizationalUnit] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -OrganizationalUnit\n{{Fill OrganizationalUnit Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Install-ApplicationClickOnce.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Install-ApplicationClickOnce\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nInstall-ApplicationClickOnce [[-Manifest] <String>] [-ElevatePermissions] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ElevatePermissions\n{{Fill ElevatePermissions Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Manifest\n{{Fill Manifest Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Install-WinConnectity.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Install-WinConnectity\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nInstall-WinConnectity [[-Module] <String[]>] [-All] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -All\n{{Fill All Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Module\n{{Fill Module Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\nAccepted values: MSOnline, AzureAD, SharePoint, ExchangeOnline\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Merge-Array.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Merge-Array\n\n## SYNOPSIS\nMerge-Array allows to merge two or more arrays together.\n\n## SYNTAX\n\n```\nMerge-Array [[-Array] <Array[]>] [-Prescan]\n```\n\n## DESCRIPTION\nMerge-Array allows to merge two or more arrays together.\nIt copies headers from each Array and merges them together allowing for fulll output. \nWhen used with Prescan parameter it actually is able to show headers from all arrays\n\n## EXAMPLES\n\n### EXAMPLE 1\n```\n$Array1 = @(\n```\n\n\\[PSCustomObject\\] @{ Name = 'Company1'; Count = 259  }\n    \\[PSCustomObject\\] @{ Name = 'Company2'; Count = 300 }\n)\n$Array2 = @(\n    \\[PSCustomObject\\] @{ Name = 'Company1'; Count = 25 }\n    \\[PSCustomObject\\] @{ Name = 'Company2'; Count = 100 }\n)\n$Array3 = @(\n    \\[PSCustomObject\\] @{ Name1 = 'Company1'; Count3 = 25 }\n    \\[PSCustomObject\\] @{ Name1 = 'Company2'; Count3 = 100 }\n    \\[PSCustomObject\\] @{ Name2 = 'Company2'; Count3 = 100 }\n)\n\n$Array1 | Format-Table -AutoSize\n$Array2 | Format-Table -AutoSize\n$Array3 | Format-Table -AutoSize\n\nMerge-Array -Array $Array1, $Array2, $Array3 | Format-Table -AutoSize\nMerge-Array -Array $Array1, $Array2, $Array3 -Prescan | Format-Table -AutoSize\n\n## PARAMETERS\n\n### -Array\nList of Arrays to process\n\n```yaml\nType: Array[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Prescan\nScans each element of each array for headers.\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n## INPUTS\n\n## OUTPUTS\n\n## NOTES\nGeneral notes\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Merge-Objects.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Merge-Objects\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nMerge-Objects [[-Object1] <Object>] [[-Object2] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Object1\n{{Fill Object1 Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Object2\n{{Fill Object2 Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/New-ArrayList.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# New-ArrayList\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nNew-ArrayList [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/New-GenericList.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# New-GenericList\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nNew-GenericList [[-Type] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Type\n{{Fill Type Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/New-Runspace.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# New-Runspace\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nNew-Runspace [[-minRunspaces] <Int32>] [[-maxRunspaces] <Int32>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -maxRunspaces\n{{Fill maxRunspaces Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -minRunspaces\n{{Fill minRunspaces Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/New-SqlQuery.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# New-SqlQuery\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nNew-SqlQuery [[-SqlSettings] <Object>] [[-Object] <Object>] [[-TableMapping] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Object\n{{Fill Object Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SqlSettings\n{{Fill SqlSettings Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -TableMapping\n{{Fill TableMapping Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/New-SqlQueryAlterTable.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# New-SqlQueryAlterTable\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nNew-SqlQueryAlterTable [[-SqlSettings] <Object>] [[-TableMapping] <Object>] [[-ExistingColumns] <String[]>]\n [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ExistingColumns\n{{Fill ExistingColumns Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SqlSettings\n{{Fill SqlSettings Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -TableMapping\n{{Fill TableMapping Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/New-SqlQueryCreateTable.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# New-SqlQueryCreateTable\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nNew-SqlQueryCreateTable [[-SqlSettings] <Object>] [[-TableMapping] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -SqlSettings\n{{Fill SqlSettings Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -TableMapping\n{{Fill TableMapping Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/New-SqlTableMapping.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# New-SqlTableMapping\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nNew-SqlTableMapping [[-SqlTableMapping] <Object>] [[-Object] <Object>] [[-Properties] <Object>]\n [-BasedOnSqlTable] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -BasedOnSqlTable\n{{Fill BasedOnSqlTable Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Object\n{{Fill Object Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Properties\n{{Fill Properties Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SqlTableMapping\n{{Fill SqlTableMapping Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/New-UserAdd.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# New-UserAdd\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nNew-UserAdd [[-Users] <Object>] [-WhatIf] [-Confirm] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Confirm\nPrompts you for confirmation before running the cmdlet.\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: cf\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Users\n{{Fill Users Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -WhatIf\nShows what would happen if the cmdlet runs.\nThe cmdlet is not run.\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: wi\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Readme.md",
    "content": "---\nModule Name: PSSharedGoods\nModule Guid: ee272aa8-baaa-4edf-9f45-b6d6f7d844fe\nDownload Help Link: {{Please enter FwLink manually}}\nHelp Version: {{Please enter version of help manually (X.X.X.X) format}}\nLocale: en-US\n---\n\n# PSSharedGoods Module\n## Description\n{{Manually Enter Description Here}}\n\n## PSSharedGoods Cmdlets\n### [Add-PropertyToList](Add-PropertyToList.md)\n{{Fill in the Synopsis}}\n\n### [Add-ToArray](Add-ToArray.md)\n{{Fill in the Synopsis}}\n\n### [Add-ToArrayAdvanced](Add-ToArrayAdvanced.md)\n{{Fill in the Synopsis}}\n\n### [Add-ToHashTable](Add-ToHashTable.md)\n{{Fill in the Synopsis}}\n\n### [Add-WinADUserGroups](Add-WinADUserGroups.md)\n{{Fill in the Synopsis}}\n\n### [Compare-ObjectProperties](Compare-ObjectProperties.md)\n{{Fill in the Synopsis}}\n\n### [Compare-ObjectsAdvanced](Compare-ObjectsAdvanced.md)\n{{Fill in the Synopsis}}\n\n### [Connect-WinAzure](Connect-WinAzure.md)\n{{Fill in the Synopsis}}\n\n### [Connect-WinAzureAD](Connect-WinAzureAD.md)\n{{Fill in the Synopsis}}\n\n### [Connect-WinExchange](Connect-WinExchange.md)\n{{Fill in the Synopsis}}\n\n### [Connect-WinSecurityCompliance](Connect-WinSecurityCompliance.md)\n{{Fill in the Synopsis}}\n\n### [Connect-WinService](Connect-WinService.md)\n{{Fill in the Synopsis}}\n\n### [Connect-WinSharePoint](Connect-WinSharePoint.md)\n{{Fill in the Synopsis}}\n\n### [Connect-WinSkype](Connect-WinSkype.md)\n{{Fill in the Synopsis}}\n\n### [Connect-WinTeams](Connect-WinTeams.md)\n{{Fill in the Synopsis}}\n\n### [Convert-BinaryToHex](Convert-BinaryToHex.md)\n{{Fill in the Synopsis}}\n\n### [Convert-BinaryToString](Convert-BinaryToString.md)\n{{Fill in the Synopsis}}\n\n### [Convert-Color](Convert-Color.md)\nThis color converter gives you the hexadecimal values of your RGB colors and vice versa (RGB to HEX)\n\n### [Convert-ExchangeEmail](Convert-ExchangeEmail.md)\n{{Fill in the Synopsis}}\n\n### [Convert-ExchangeItems](Convert-ExchangeItems.md)\n{{Fill in the Synopsis}}\n\n### [Convert-ExchangeRecipientDetails](Convert-ExchangeRecipientDetails.md)\n{{Fill in the Synopsis}}\n\n### [Convert-ExchangeSize](Convert-ExchangeSize.md)\n{{Fill in the Synopsis}}\n\n### [Convert-HexToBinary](Convert-HexToBinary.md)\n{{Fill in the Synopsis}}\n\n### [Convert-KeyToKeyValue](Convert-KeyToKeyValue.md)\n{{Fill in the Synopsis}}\n\n### [Convert-Office365License](Convert-Office365License.md)\n{{Fill in the Synopsis}}\n\n### [Convert-Size](Convert-Size.md)\n{{Fill in the Synopsis}}\n\n### [Convert-TimeToDays](Convert-TimeToDays.md)\n{{Fill in the Synopsis}}\n\n### [Convert-ToDateTime](Convert-ToDateTime.md)\n{{Fill in the Synopsis}}\n\n### [Convert-ToTimeSpan](Convert-ToTimeSpan.md)\n{{Fill in the Synopsis}}\n\n### [Convert-TwoArraysIntoOne](Convert-TwoArraysIntoOne.md)\n{{Fill in the Synopsis}}\n\n### [Convert-UAC](Convert-UAC.md)\n{{Fill in the Synopsis}}\n\n### [ConvertFrom-Color](ConvertFrom-Color.md)\n{{Fill in the Synopsis}}\n\n### [ConvertFrom-ErrorRecord](ConvertFrom-ErrorRecord.md)\n{{Fill in the Synopsis}}\n\n### [ConvertFrom-OperationType](ConvertFrom-OperationType.md)\n{{Fill in the Synopsis}}\n\n### [ConvertFrom-SID](ConvertFrom-SID.md)\n{{Fill in the Synopsis}}\n\n### [ConvertFrom-X500Address](ConvertFrom-X500Address.md)\n\n\n### [ConvertFrom-SID](ConvertFrom-SID.md)\n{{Fill in the Synopsis}}\n\n### [Disconnect-WinAzure](Disconnect-WinAzure.md)\n{{Fill in the Synopsis}}\n\n### [Disconnect-WinAzureAD](Disconnect-WinAzureAD.md)\n{{Fill in the Synopsis}}\n\n### [Disconnect-WinExchange](Disconnect-WinExchange.md)\n{{Fill in the Synopsis}}\n\n### [Disconnect-WinSecurityCompliance](Disconnect-WinSecurityCompliance.md)\n{{Fill in the Synopsis}}\n\n### [Disconnect-WinService](Disconnect-WinService.md)\n{{Fill in the Synopsis}}\n\n### [Disconnect-WinSkype](Disconnect-WinSkype.md)\n{{Fill in the Synopsis}}\n\n### [Disconnect-WinTeams](Disconnect-WinTeams.md)\n{{Fill in the Synopsis}}\n\n### [Find-ADConnectServer](Find-ADConnectServer.md)\n{{Fill in the Synopsis}}\n\n### [Find-DatesCurrentDayMinusDayX](Find-DatesCurrentDayMinusDayX.md)\n{{Fill in the Synopsis}}\n\n### [Find-DatesCurrentDayMinuxDaysX](Find-DatesCurrentDayMinuxDaysX.md)\n{{Fill in the Synopsis}}\n\n### [Find-DatesCurrentHour](Find-DatesCurrentHour.md)\n{{Fill in the Synopsis}}\n\n### [Find-DatesDayPrevious](Find-DatesDayPrevious.md)\n{{Fill in the Synopsis}}\n\n### [Find-DatesDayToday](Find-DatesDayToday.md)\n{{Fill in the Synopsis}}\n\n### [Find-DatesMonthCurrent](Find-DatesMonthCurrent.md)\n{{Fill in the Synopsis}}\n\n### [Find-DatesMonthPast](Find-DatesMonthPast.md)\n{{Fill in the Synopsis}}\n\n### [Find-DatesPastHour](Find-DatesPastHour.md)\n{{Fill in the Synopsis}}\n\n### [Find-DatesPastWeek](Find-DatesPastWeek.md)\n{{Fill in the Synopsis}}\n\n### [Find-DatesQuarterCurrent](Find-DatesQuarterCurrent.md)\n{{Fill in the Synopsis}}\n\n### [Find-DatesQuarterLast](Find-DatesQuarterLast.md)\n{{Fill in the Synopsis}}\n\n### [Find-ExchangeServer](Find-ExchangeServer.md)\nFind Exchange Servers in Active Directory\n\n### [Find-HyperVServer](Find-HyperVServer.md)\n{{Fill in the Synopsis}}\n\n### [Find-MyProgramData](Find-MyProgramData.md)\n{{Fill in the Synopsis}}\n\n### [Find-ServerTypes](Find-ServerTypes.md)\n{{Fill in the Synopsis}}\n\n### [Find-TypesNeeded](Find-TypesNeeded.md)\n{{Fill in the Synopsis}}\n\n### [Find-UsersProxyAddressesStatus](Find-UsersProxyAddressesStatus.md)\n{{Fill in the Synopsis}}\n\n### [Format-AddSpaceToSentence](Format-AddSpaceToSentence.md)\nShort description\n\n### [Format-FirstXChars](Format-FirstXChars.md)\nShort description\n\n### [Format-PSTable](Format-PSTable.md)\n{{Fill in the Synopsis}}\n\n### [Format-Stream](Format-Stream.md)\n{{Fill in the Synopsis}}\n\n### [Format-ToTitleCase](Format-ToTitleCase.md)\n{{Fill in the Synopsis}}\n\n### [Format-TransposeTable](Format-TransposeTable.md)\n{{Fill in the Synopsis}}\n\n### [Format-TransposeTable](Format-TransposeTable.md)\n{{Fill in the Synopsis}}\n\n### [Get-CommandInfo](Get-CommandInfo.md)\n{{Fill in the Synopsis}}\n\n### [Get-FileInformation](Get-FileInformation.md)\n{{Fill in the Synopsis}}\n\n### [Get-FileName](Get-FileName.md)\nShort description\n\n### [Get-FilesInFolder](Get-FilesInFolder.md)\n{{Fill in the Synopsis}}\n\n### [Get-FileSize](Get-FileSize.md)\n{{Fill in the Synopsis}}\n\n### [Get-HashMaxValue](Get-HashMaxValue.md)\n{{Fill in the Synopsis}}\n\n### [Get-HTML](Get-HTML.md)\n{{Fill in the Synopsis}}\n\n### [Get-InstalledApplication](Get-InstalledApplication.md)\n\n\n### [Get-IPAddressInformation](Get-IPAddressInformation.md)\n{{Fill in the Synopsis}}\n\n### [Get-Logger](Get-Logger.md)\n{{Fill in the Synopsis}}\n\n### [Get-MimeType](Get-MimeType.md)\n{{Fill in the Synopsis}}\n\n### [Get-ModulesAvailability](Get-ModulesAvailability.md)\n{{Fill in the Synopsis}}\n\n### [Get-MyIpAddress](Get-MyIpAddress.md)\n{{Fill in the Synopsis}}\n\n### [Get-ObjectCount](Get-ObjectCount.md)\n{{Fill in the Synopsis}}\n\n### [Get-ObjectData](Get-ObjectData.md)\n{{Fill in the Synopsis}}\n\n### [Get-ObjectEnumValues](Get-ObjectEnumValues.md)\n{{Fill in the Synopsis}}\n\n### [Get-ObjectKeys](Get-ObjectKeys.md)\n{{Fill in the Synopsis}}\n\n### [Get-ObjectProperties](Get-ObjectProperties.md)\n{{Fill in the Synopsis}}\n\n### [Get-ObjectPropertiesAdvanced](Get-ObjectPropertiesAdvanced.md)\n{{Fill in the Synopsis}}\n\n### [Get-ObjectTitles](Get-ObjectTitles.md)\n{{Fill in the Synopsis}}\n\n### [Get-ObjectType](Get-ObjectType.md)\n{{Fill in the Synopsis}}\n\n### [Get-PathSeparator](Get-PathSeparator.md)\n{{Fill in the Synopsis}}\n\n### [Get-PathTemporary](Get-PathTemporary.md)\n{{Fill in the Synopsis}}\n\n### [Get-RandomCharacters](Get-RandomCharacters.md)\n{{Fill in the Synopsis}}\n\n### [Get-RandomPassword](Get-RandomPassword.md)\n{{Fill in the Synopsis}}\n\n### [Get-RandomStringName](Get-RandomStringName.md)\n{{Fill in the Synopsis}}\n\n### [Get-SqlQueryColumnInformation](Get-SqlQueryColumnInformation.md)\n{{Fill in the Synopsis}}\n\n### [Get-TimeSynchronization](Get-TimeSynchronization.md)\n{{Fill in the Synopsis}}\n\n### [Get-TimeZoneAdvanced](Get-TimeZoneAdvanced.md)\n{{Fill in the Synopsis}}\n\n### [Get-TimeZoneLegacy](Get-TimeZoneLegacy.md)\n{{Fill in the Synopsis}}\n\n### [Get-Types](Get-Types.md)\n{{Fill in the Synopsis}}\n\n### [Get-WinADForestControllers](Get-WinADForestControllers.md)\n{{Fill in the Synopsis}}\n\n### [Get-WinADForestOptions](Get-WinADForestOptions.md)\nThis Cmdlet gets Active Directory Site Options.\n\n### [Get-WinADOrganizationalUnitData](Get-WinADOrganizationalUnitData.md)\nShort description\n\n### [Get-WinADOrganizationalUnitFromDN](Get-WinADOrganizationalUnitFromDN.md)\n\n\n### [Get-WinADUsersByDN](Get-WinADUsersByDN.md)\n{{Fill in the Synopsis}}\n\n### [Get-WinADUsersByOU](Get-WinADUsersByOU.md)\n{{Fill in the Synopsis}}\n\n### [Get-WinADUserSnapshot](Get-WinADUserSnapshot.md)\n{{Fill in the Synopsis}}\n\n### [Install-ApplicationClickOnce](Install-ApplicationClickOnce.md)\n{{Fill in the Synopsis}}\n\n### [Install-WinConnectity](Install-WinConnectity.md)\n{{Fill in the Synopsis}}\n\n### [Merge-Objects](Merge-Objects.md)\n{{Fill in the Synopsis}}\n\n### [New-ArrayList](New-ArrayList.md)\n{{Fill in the Synopsis}}\n\n### [New-GenericList](New-GenericList.md)\n{{Fill in the Synopsis}}\n\n### [New-Runspace](New-Runspace.md)\n{{Fill in the Synopsis}}\n\n### [New-SqlQuery](New-SqlQuery.md)\n{{Fill in the Synopsis}}\n\n### [New-SqlQueryAlterTable](New-SqlQueryAlterTable.md)\n{{Fill in the Synopsis}}\n\n### [New-SqlQueryCreateTable](New-SqlQueryCreateTable.md)\n{{Fill in the Synopsis}}\n\n### [New-SqlTableMapping](New-SqlTableMapping.md)\n{{Fill in the Synopsis}}\n\n### [New-UserAdd](New-UserAdd.md)\n{{Fill in the Synopsis}}\n\n### [Remove-DuplicateObjects](Remove-DuplicateObjects.md)\n{{Fill in the Synopsis}}\n\n### [Remove-FilePermission](Remove-FilePermission.md)\n{{Fill in the Synopsis}}\n\n### [Remove-FromArray](Remove-FromArray.md)\n{{Fill in the Synopsis}}\n\n### [Remove-ObjectsExistingInTarget](Remove-ObjectsExistingInTarget.md)\n{{Fill in the Synopsis}}\n\n### [Remove-WhiteSpace](Remove-WhiteSpace.md)\n{{Fill in the Synopsis}}\n\n### [Remove-WinADUserGroups](Remove-WinADUserGroups.md)\n{{Fill in the Synopsis}}\n\n### [Rename-LatinCharacters](Rename-LatinCharacters.md)\n{{Fill in the Synopsis}}\n\n### [Rename-UserValuesFromHash](Rename-UserValuesFromHash.md)\n{{Fill in the Synopsis}}\n\n### [Request-Credentials](Request-Credentials.md)\n{{Fill in the Synopsis}}\n\n### [Save-XML](Save-XML.md)\n{{Fill in the Synopsis}}\n\n### [Search-Command](Search-Command.md)\n{{Fill in the Synopsis}}\n\n### [Send-Email](Send-Email.md)\n{{Fill in the Synopsis}}\n\n### [Send-SqlInsert](Send-SqlInsert.md)\n{{Fill in the Synopsis}}\n\n### [Set-DnsServerIpAddress](Set-DnsServerIpAddress.md)\n{{Fill in the Synopsis}}\n\n### [Set-EmailBody](Set-EmailBody.md)\n{{Fill in the Synopsis}}\n\n### [Set-EmailBodyPreparedTable](Set-EmailBodyPreparedTable.md)\n{{Fill in the Synopsis}}\n\n### [Set-EmailBodyReplacement](Set-EmailBodyReplacement.md)\n{{Fill in the Synopsis}}\n\n### [Set-EmailBodyReplacementTable](Set-EmailBodyReplacementTable.md)\n{{Fill in the Synopsis}}\n\n### [Set-EmailFormatting](Set-EmailFormatting.md)\n{{Fill in the Synopsis}}\n\n### [Set-EmailHead](Set-EmailHead.md)\n{{Fill in the Synopsis}}\n\n### [Set-EmailReportBranding](Set-EmailReportBranding.md)\n{{Fill in the Synopsis}}\n\n### [Set-EmailWordReplacements](Set-EmailWordReplacements.md)\n{{Fill in the Synopsis}}\n\n### [Set-EmailWordReplacementsHash](Set-EmailWordReplacementsHash.md)\n{{Fill in the Synopsis}}\n\n### [Set-FileInheritance](Set-FileInheritance.md)\n{{Fill in the Synopsis}}\n\n### [Set-FilePermission](Set-FilePermission.md)\n{{Fill in the Synopsis}}\n\n### [Set-PasswordRemotely](Set-PasswordRemotely.md)\n{{Fill in the Synopsis}}\n\n### [Set-SpecUser](Set-SpecUser.md)\n{{Fill in the Synopsis}}\n\n### [Set-TimeSynchronization](Set-TimeSynchronization.md)\n{{Fill in the Synopsis}}\n\n### [Set-WinADGroupSynchronization](Set-WinADGroupSynchronization.md)\n{{Fill in the Synopsis}}\n\n### [Set-WinADUserFields](Set-WinADUserFields.md)\n{{Fill in the Synopsis}}\n\n### [Set-WinADUserSettingGAL](Set-WinADUserSettingGAL.md)\n{{Fill in the Synopsis}}\n\n### [Set-WinADUserStatus](Set-WinADUserStatus.md)\n{{Fill in the Synopsis}}\n\n### [Set-WinAzureADUserField](Set-WinAzureADUserField.md)\n{{Fill in the Synopsis}}\n\n### [Set-WinAzureADUserLicense](Set-WinAzureADUserLicense.md)\n{{Fill in the Synopsis}}\n\n### [Set-WinAzureADUserStatus](Set-WinAzureADUserStatus.md)\n{{Fill in the Synopsis}}\n\n### [Set-XML](Set-XML.md)\n{{Fill in the Synopsis}}\n\n### [Show-Array](Show-Array.md)\n{{Fill in the Synopsis}}\n\n### [Show-DataInVerbose](Show-DataInVerbose.md)\n{{Fill in the Synopsis}}\n\n### [Show-TableVisualization](Show-TableVisualization.md)\n{{Fill in the Synopsis}}\n\n### [Split-Array](Split-Array.md)\n{{Fill in the Synopsis}}\n\n### [Split-ArrayEvery](Split-ArrayEvery.md)\n{{Fill in the Synopsis}}\n\n### [Start-MyProgram](Start-MyProgram.md)\n{{Fill in the Synopsis}}\n\n### [Start-Runspace](Start-Runspace.md)\n{{Fill in the Synopsis}}\n\n### [Start-TimeLog](Start-TimeLog.md)\n{{Fill in the Synopsis}}\n\n### [Stop-Runspace](Stop-Runspace.md)\n{{Fill in the Synopsis}}\n\n### [Stop-TimeLog](Stop-TimeLog.md)\n{{Fill in the Synopsis}}\n\n### [Test-AvailabilityCommands](Test-AvailabilityCommands.md)\n{{Fill in the Synopsis}}\n\n### [Test-ComputerAvailability](Test-ComputerAvailability.md)\n{{Fill in the Synopsis}}\n\n### [Test-ComputerPort](Test-ComputerPort.md)\n{{Fill in the Synopsis}}\n\n### [Test-ConfigurationCredentials](Test-ConfigurationCredentials.md)\n{{Fill in the Synopsis}}\n\n### [Test-ForestConnectivity](Test-ForestConnectivity.md)\n{{Fill in the Synopsis}}\n\n### [Test-InstalledApplication](Test-InstalledApplication.md)\n{{Fill in the Synopsis}}\n\n### [Test-Key](Test-Key.md)\n{{Fill in the Synopsis}}\n\n### [Test-ModuleAvailability](Test-ModuleAvailability.md)\n{{Fill in the Synopsis}}\n\n### [Test-WinRM](Test-WinRM.md)\n{{Fill in the Synopsis}}\n\n### [Uninstall-ApplicationClickOnce](Uninstall-ApplicationClickOnce.md)\n{{Fill in the Synopsis}}\n\n"
  },
  {
    "path": "Docs/Remove-DuplicateObjects.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Remove-DuplicateObjects\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nRemove-DuplicateObjects [[-Object] <Object>] [[-Property] <String[]>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Object\n{{Fill Object Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Property\n{{Fill Property Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Remove-FilePermission.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Remove-FilePermission\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nRemove-FilePermission [[-StartingDir] <String>] [[-UserOrGroup] <String>] [-All] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -All\n{{Fill All Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -StartingDir\n{{Fill StartingDir Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -UserOrGroup\n{{Fill UserOrGroup Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Remove-FromArray.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Remove-FromArray\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nRemove-FromArray [[-List] <ArrayList>] [[-Element] <Object>] [-LastElement] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Element\n{{Fill Element Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -LastElement\n{{Fill LastElement Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -List\n{{Fill List Description}}\n\n```yaml\nType: ArrayList\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Remove-ObjectsExistingInTarget.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Remove-ObjectsExistingInTarget\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nRemove-ObjectsExistingInTarget [[-ObjectSource] <Object>] [[-ObjectTarget] <Object>]\n [[-ComparePropertySource] <String>] [[-ComparePropertyTarget] <String>] [-Reverse] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ComparePropertySource\n{{Fill ComparePropertySource Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ComparePropertyTarget\n{{Fill ComparePropertyTarget Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ObjectSource\n{{Fill ObjectSource Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ObjectTarget\n{{Fill ObjectTarget Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Reverse\n{{Fill Reverse Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Remove-WhiteSpace.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Remove-WhiteSpace\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nRemove-WhiteSpace [[-Text] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Text\n{{Fill Text Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Remove-WinADUserGroups.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Remove-WinADUserGroups\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nRemove-WinADUserGroups [-User] <Object> [[-GroupCategory] <String>] [[-GroupScope] <String>]\n [[-Groups] <String[]>] [-All] [-WhatIf] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -All\n{{Fill All Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -GroupCategory\n{{Fill GroupCategory Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: Distribution, Security\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -GroupScope\n{{Fill GroupScope Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: DomainLocal, Global, Universal\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Groups\n{{Fill Groups Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -User\n{{Fill User Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -WhatIf\nShows what would happen if the cmdlet runs.\nThe cmdlet is not run.\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Rename-LatinCharacters.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Rename-LatinCharacters\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nRename-LatinCharacters [[-String] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -String\n{{Fill String Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Rename-UserValuesFromHash.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Rename-UserValuesFromHash\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nRename-UserValuesFromHash [[-Users] <Object>] [[-MatchData] <Object>] [[-FieldTypes] <Object>]\n [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -FieldTypes\n{{Fill FieldTypes Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -MatchData\n{{Fill MatchData Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Users\n{{Fill Users Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Request-Credentials.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Request-Credentials\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nRequest-Credentials [[-UserName] <String>] [[-Password] <String>] [-AsSecure] [-FromFile] [-Output]\n [-NetworkCredentials] [[-Service] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -AsSecure\n{{Fill AsSecure Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -FromFile\n{{Fill FromFile Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -NetworkCredentials\n{{Fill NetworkCredentials Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Output\n{{Fill Output Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Password\n{{Fill Password Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Service\n{{Fill Service Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -UserName\n{{Fill UserName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Save-XML.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Save-XML\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSave-XML [[-FilePath] <String>] [[-xml] <XmlNode>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -FilePath\n{{Fill FilePath Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -xml\n{{Fill xml Description}}\n\n```yaml\nType: XmlNode\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Search-Command.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Search-Command\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSearch-Command [[-CommandName] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -CommandName\n{{Fill CommandName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Send-Email.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Send-Email\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSend-Email [[-Email] <IDictionary>] [[-Body] <String>] [[-Attachment] <String[]>]\n [[-InlineAttachments] <IDictionary>] [[-Subject] <String>] [[-To] <String[]>] [[-Logger] <PSObject>] [-WhatIf]\n [-Confirm] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Attachment\n{{Fill Attachment Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Body\n{{Fill Body Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Confirm\nPrompts you for confirmation before running the cmdlet.\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: cf\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Email\n{{Fill Email Description}}\n\n```yaml\nType: IDictionary\nParameter Sets: (All)\nAliases: EmailParameters\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -InlineAttachments\n{{Fill InlineAttachments Description}}\n\n```yaml\nType: IDictionary\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Logger\n{{Fill Logger Description}}\n\n```yaml\nType: PSObject\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 6\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Subject\n{{Fill Subject Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 4\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -To\n{{Fill To Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 5\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -WhatIf\nShows what would happen if the cmdlet runs.\nThe cmdlet is not run.\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases: wi\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Send-SqlInsert.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Send-SqlInsert\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSend-SqlInsert [[-Object] <Array>] [[-SqlSettings] <IDictionary>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Object\n{{Fill Object Description}}\n\n```yaml\nType: Array\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SqlSettings\n{{Fill SqlSettings Description}}\n\n```yaml\nType: IDictionary\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-DnsServerIpAddress.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-DnsServerIpAddress\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-DnsServerIpAddress [[-ComputerName] <String>] [[-NicName] <String>] [[-IpAddresses] <String>]\n [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ComputerName\n{{Fill ComputerName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -IpAddresses\n{{Fill IpAddresses Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -NicName\n{{Fill NicName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-EmailBody.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-EmailBody\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-EmailBody [[-TableData] <Object>] [[-TableMessageWelcome] <String>] [[-TableMessageNoData] <String>]\n [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -TableData\n{{Fill TableData Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -TableMessageNoData\n{{Fill TableMessageNoData Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -TableMessageWelcome\n{{Fill TableMessageWelcome Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases: TableWelcomeMessage\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-EmailBodyPreparedTable.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-EmailBodyPreparedTable\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-EmailBodyPreparedTable [[-TableData] <Object>] [[-TableWelcomeMessage] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -TableData\n{{Fill TableData Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -TableWelcomeMessage\n{{Fill TableWelcomeMessage Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-EmailBodyReplacement.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-EmailBodyReplacement\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-EmailBodyReplacement [[-Body] <String>] [[-ReplacementTable] <Hashtable>] [[-Type] <String>]\n [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Body\n{{Fill Body Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ReplacementTable\n{{Fill ReplacementTable Description}}\n\n```yaml\nType: Hashtable\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Type\n{{Fill Type Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: Colors, Bold\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-EmailBodyReplacementTable.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-EmailBodyReplacementTable\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-EmailBodyReplacementTable [[-Body] <Object>] [[-TableName] <Object>] [[-TableData] <Object>]\n [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Body\n{{Fill Body Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -TableData\n{{Fill TableData Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -TableName\n{{Fill TableName Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-EmailFormatting.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-EmailFormatting\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-EmailFormatting [[-Template] <Object>] [[-FormattingParameters] <IDictionary>]\n [[-ConfigurationParameters] <IDictionary>] [[-Logger] <Object>] [-SkipNewLines]\n [[-AddAfterOpening] <String[]>] [[-AddBeforeClosing] <String[]>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -AddAfterOpening\n{{Fill AddAfterOpening Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 4\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -AddBeforeClosing\n{{Fill AddBeforeClosing Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 5\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ConfigurationParameters\n{{Fill ConfigurationParameters Description}}\n\n```yaml\nType: IDictionary\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -FormattingParameters\n{{Fill FormattingParameters Description}}\n\n```yaml\nType: IDictionary\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Logger\n{{Fill Logger Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -SkipNewLines\n{{Fill SkipNewLines Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Template\n{{Fill Template Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-EmailHead.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-EmailHead\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-EmailHead [[-FormattingOptions] <IDictionary>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -FormattingOptions\n{{Fill FormattingOptions Description}}\n\n```yaml\nType: IDictionary\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-EmailReportBranding.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-EmailReportBranding\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-EmailReportBranding [[-FormattingParameters] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -FormattingParameters\n{{Fill FormattingParameters Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases: FormattingOptions\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-EmailWordReplacements.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-EmailWordReplacements\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-EmailWordReplacements [[-Body] <Object>] [[-Replace] <Object>] [[-ReplaceWith] <Object>] [-RegEx]\n [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Body\n{{Fill Body Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -RegEx\n{{Fill RegEx Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Replace\n{{Fill Replace Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ReplaceWith\n{{Fill ReplaceWith Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-EmailWordReplacementsHash.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-EmailWordReplacementsHash\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-EmailWordReplacementsHash [[-Body] <Object>] [[-Substitute] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Body\n{{Fill Body Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Substitute\n{{Fill Substitute Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-FileInheritance.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-FileInheritance\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-FileInheritance [[-StartingDir] <String>] [-DisableInheritance] [-KeepInheritedAcl] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -DisableInheritance\n{{Fill DisableInheritance Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -KeepInheritedAcl\n{{Fill KeepInheritedAcl Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -StartingDir\n{{Fill StartingDir Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-FilePermission.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-FilePermission\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-FilePermission [[-StartingDir] <String>] [[-UserOrGroup] <String>] [[-InheritedFolderPermissions] <Object>]\n [[-AccessControlType] <String>] [[-PropagationFlags] <String>] [[-AclRightsToAssign] <Object>]\n [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -AccessControlType\n{{Fill AccessControlType Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -AclRightsToAssign\n{{Fill AclRightsToAssign Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 5\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -InheritedFolderPermissions\n{{Fill InheritedFolderPermissions Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -PropagationFlags\n{{Fill PropagationFlags Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 4\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -StartingDir\n{{Fill StartingDir Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -UserOrGroup\n{{Fill UserOrGroup Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-PasswordRemotely.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-PasswordRemotely\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-PasswordRemotely [-UserName] <String> [-OldPassword] <String> [-NewPassword] <String>\n [-DomainController] <String> [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -DomainController\n{{Fill DomainController Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases: DC, Server, ComputerName\n\nRequired: True\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -NewPassword\n{{Fill NewPassword Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -OldPassword\n{{Fill OldPassword Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -UserName\n{{Fill UserName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-ServiceRecovery.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-ServiceRecovery\n\n## SYNOPSIS\n#\n\n## SYNTAX\n\n```\nSet-ServiceRecovery [-ServiceDisplayName] <String> [-Server] <String> [[-action1] <String>] [[-time1] <Int32>]\n [[-action2] <String>] [[-time2] <Int32>] [[-actionLast] <String>] [[-timeLast] <Int32>]\n [[-resetCounter] <Int32>] [<CommonParameters>]\n```\n\n## DESCRIPTION\nLong description\n\n## EXAMPLES\n\n### EXAMPLE 1\n```\nSet-ServiceRecovery -ServiceDisplayName \"Pulseway\" -Server \"MAIL1\"\n```\n\n## PARAMETERS\n\n### -ServiceDisplayName\nParameter description\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Server\nParameter description\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -action1\nParameter description\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: Restart\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -time1\nParameter description\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 4\nDefault value: 30000\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -action2\nParameter description\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 5\nDefault value: Restart\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -time2\nParameter description\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 6\nDefault value: 30000\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -actionLast\nParameter description\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 7\nDefault value: Restart\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -timeLast\nParameter description\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 8\nDefault value: 30000\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -resetCounter\nParameter description\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 9\nDefault value: 4000\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable.\nFor more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n## OUTPUTS\n\n## NOTES\nGeneral notes\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-SpecUser.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-SpecUser\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-SpecUser [[-User] <Object>] [[-UsersAzure] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -User\n{{Fill User Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -UsersAzure\n{{Fill UsersAzure Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-TimeSynchronization.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-TimeSynchronization\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-TimeSynchronization [[-TimeSource] <String[]>] [[-MaxPosPhaseCorrection] <Int32>]\n [[-MaxnegPhaseCorrection] <Int32>] [[-PollInterval] <Int32>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -MaxPosPhaseCorrection\n{{Fill MaxPosPhaseCorrection Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -MaxnegPhaseCorrection\n{{Fill MaxnegPhaseCorrection Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -PollInterval\n{{Fill PollInterval Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -TimeSource\n{{Fill TimeSource Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-WinADGroupSynchronization.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-WinADGroupSynchronization\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-WinADGroupSynchronization [-GroupFrom] <String> [-GroupTo] <String> [[-Type] <String>]\n [[-Recursive] <Object>] [-WhatIf] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -GroupFrom\n{{Fill GroupFrom Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -GroupTo\n{{Fill GroupTo Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Recursive\n{{Fill Recursive Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\nAccepted values: None, RecursiveFrom, RecursiveBoth, RecursiveTo\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Type\n{{Fill Type Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: User, Group, All\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -WhatIf\nShows what would happen if the cmdlet runs.\nThe cmdlet is not run.\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-WinADUserFields.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-WinADUserFields\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-WinADUserFields [-User] <Object> [[-Option] <String>] [[-TextToAdd] <String>] [[-TextToRemove] <String>]\n [[-Fields] <String[]>] [-WhatIf] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Fields\n{{Fill Fields Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 4\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Option\n{{Fill Option Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: Before, After\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -TextToAdd\n{{Fill TextToAdd Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -TextToRemove\n{{Fill TextToRemove Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -User\n{{Fill User Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -WhatIf\nShows what would happen if the cmdlet runs.\nThe cmdlet is not run.\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-WinADUserSettingGAL.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-WinADUserSettingGAL\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-WinADUserSettingGAL [-User] <Object> [-Option] <String> [-WhatIf] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Option\n{{Fill Option Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: Hide, Show\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -User\n{{Fill User Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -WhatIf\nShows what would happen if the cmdlet runs.\nThe cmdlet is not run.\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-WinADUserStatus.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-WinADUserStatus\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-WinADUserStatus [-User] <Object> [-Option] <String> [-WhatIf] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Option\n{{Fill Option Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: Enable, Disable\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -User\n{{Fill User Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -WhatIf\nShows what would happen if the cmdlet runs.\nThe cmdlet is not run.\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-WinAzureADUserField.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-WinAzureADUserField\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-WinAzureADUserField [-User] <Object> [[-Value] <Object>] [-WhatIf] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -User\n{{Fill User Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Value\n{{Fill Value Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -WhatIf\nShows what would happen if the cmdlet runs.\nThe cmdlet is not run.\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-WinAzureADUserLicense.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-WinAzureADUserLicense\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-WinAzureADUserLicense [-User] <Object> [-Option] <String> [[-License] <String>]\n [[-LicenseToReplace] <String>] [-WhatIf] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -License\n{{Fill License Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -LicenseToReplace\n{{Fill LicenseToReplace Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Option\n{{Fill Option Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: Add, Remove, RemoveAll, Replace\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -User\n{{Fill User Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -WhatIf\nShows what would happen if the cmdlet runs.\nThe cmdlet is not run.\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-WinAzureADUserStatus.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-WinAzureADUserStatus\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-WinAzureADUserStatus [-User] <Object> [-Option] <String> [-WhatIf] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Option\n{{Fill Option Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: Enable, Disable\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -User\n{{Fill User Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -WhatIf\nShows what would happen if the cmdlet runs.\nThe cmdlet is not run.\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Set-XML.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Set-XML\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSet-XML [[-FilePath] <String>] [[-Paths] <String[]>] [[-Node] <String>] [[-Value] <String>]\n [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -FilePath\n{{Fill FilePath Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Node\n{{Fill Node Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Paths\n{{Fill Paths Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Value\n{{Fill Value Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Show-Array.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Show-Array\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nShow-Array [[-List] <ArrayList>] [-WithType] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -List\n{{Fill List Description}}\n\n```yaml\nType: ArrayList\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -WithType\n{{Fill WithType Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Show-DataInVerbose.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Show-DataInVerbose\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nShow-DataInVerbose [[-Object] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Object\n{{Fill Object Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Show-TableVisualization.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Show-TableVisualization\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nShow-TableVisualization [[-Object] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Object\n{{Fill Object Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: True (ByPropertyName, ByValue)\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### System.Object\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Split-Array.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Split-Array\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSplit-Array [[-inArray] <Object>] [[-parts] <Int32>] [[-size] <Int32>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -inArray\n{{Fill inArray Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -parts\n{{Fill parts Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -size\n{{Fill size Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Split-ArrayEvery.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Split-ArrayEvery\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nSplit-ArrayEvery [[-list] <Object>] [[-count] <Int32>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -count\n{{Fill count Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -list\n{{Fill list Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Start-MyProgram.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Start-MyProgram\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nStart-MyProgram [[-Program] <String>] [[-CmdArgList] <String[]>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -CmdArgList\n{{Fill cmdArgList Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Program\n{{Fill Program Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Start-Runspace.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Start-Runspace\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nStart-Runspace [[-ScriptBlock] <String>] [[-Parameters] <IDictionary>] [[-RunspacePool] <RunspacePool>]\n [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Parameters\n{{Fill Parameters Description}}\n\n```yaml\nType: IDictionary\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -RunspacePool\n{{Fill RunspacePool Description}}\n\n```yaml\nType: RunspacePool\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ScriptBlock\n{{Fill ScriptBlock Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Start-TimeLog.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Start-TimeLog\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nStart-TimeLog [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Stop-Runspace.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Stop-Runspace\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nStop-Runspace [[-Runspaces] <Object[]>] [[-FunctionName] <String>] [[-RunspacePool] <RunspacePool>]\n [-ExtendedOutput] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ExtendedOutput\n{{Fill ExtendedOutput Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -FunctionName\n{{Fill FunctionName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -RunspacePool\n{{Fill RunspacePool Description}}\n\n```yaml\nType: RunspacePool\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Runspaces\n{{Fill Runspaces Description}}\n\n```yaml\nType: Object[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Stop-TimeLog.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Stop-TimeLog\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nStop-TimeLog [[-Time] <Stopwatch>] [[-Option] <String>] [-Continue] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Continue\n{{Fill Continue Description}}\n\n```yaml\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Option\n{{Fill Option Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\nAccepted values: OneLiner, Array\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Time\n{{Fill Time Description}}\n\n```yaml\nType: Stopwatch\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: True (ByValue)\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### System.Diagnostics.Stopwatch\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Test-AvailabilityCommands.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Test-AvailabilityCommands\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nTest-AvailabilityCommands [[-Commands] <String[]>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Commands\n{{Fill Commands Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Test-ComputerAvailability.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Test-ComputerAvailability\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nTest-ComputerAvailability [[-Servers] <String[]>] [[-Test] <Object>] [[-Ports] <Int32[]>]\n [[-PortsTimeout] <Int32>] [[-PingCount] <Int32>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -PingCount\n{{Fill PingCount Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 4\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Ports\n{{Fill Ports Description}}\n\n```yaml\nType: Int32[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -PortsTimeout\n{{Fill PortsTimeout Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Servers\n{{Fill Servers Description}}\n\n```yaml\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Test\n{{Fill Test Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\nAccepted values: All, Ping, WinRM, PortOpen, Ping+WinRM, Ping+PortOpen, WinRM+PortOpen\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Test-ComputerPort.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Test-ComputerPort\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nTest-ComputerPort [[-Server] <String>] [[-Ports] <Int32[]>] [[-TimeOut] <Int32>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -Ports\n{{Fill Ports Description}}\n\n```yaml\nType: Int32[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Server\n{{Fill Server Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -TimeOut\n{{Fill TimeOut Description}}\n\n```yaml\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Test-ConfigurationCredentials.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Test-ConfigurationCredentials\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nTest-ConfigurationCredentials [[-Configuration] <Object>] [[-AllowEmptyKeys] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -AllowEmptyKeys\n{{Fill AllowEmptyKeys Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -Configuration\n{{Fill Configuration Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Test-ForestConnectivity.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Test-ForestConnectivity\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nTest-ForestConnectivity [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Test-InstalledApplication.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Test-InstalledApplication\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nTest-InstalledApplication [[-DisplayName] <String>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -DisplayName\n{{Fill DisplayName Description}}\n\n```yaml\nType: String\nParameter Sets: (All)\nAliases: ApplicationName\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Test-Key.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Test-Key\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nTest-Key [[-ConfigurationTable] <Object>] [[-ConfigurationSection] <Object>] [[-ConfigurationKey] <Object>]\n [[-DisplayProgress] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ConfigurationKey\n{{Fill ConfigurationKey Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ConfigurationSection\n{{Fill ConfigurationSection Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -ConfigurationTable\n{{Fill ConfigurationTable Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### -DisplayProgress\n{{Fill DisplayProgress Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Test-ModuleAvailability.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Test-ModuleAvailability\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nTest-ModuleAvailability [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Test-WinRM.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Test-WinRM\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nTest-WinRM [[-ComputerName] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -ComputerName\n{{Fill ComputerName Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Docs/Uninstall-ApplicationClickOnce.md",
    "content": "---\nexternal help file: PSSharedGoods-help.xml\nModule Name: PSSharedGoods\nonline version:\nschema: 2.0.0\n---\n\n# Uninstall-ApplicationClickOnce\n\n## SYNOPSIS\n{{Fill in the Synopsis}}\n\n## SYNTAX\n\n```\nUninstall-ApplicationClickOnce [[-DisplayName] <Object>] [<CommonParameters>]\n```\n\n## DESCRIPTION\n{{Fill in the Description}}\n\n## EXAMPLES\n\n### Example 1\n```powershell\nPS C:\\> {{ Add example code here }}\n```\n\n{{ Add example description here }}\n\n## PARAMETERS\n\n### -DisplayName\n{{Fill DisplayName Description}}\n\n```yaml\nType: Object\nParameter Sets: (All)\nAliases: ApplicationName\n\nRequired: False\nPosition: 0\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n```\n\n### CommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\n## INPUTS\n\n### None\n\n## OUTPUTS\n\n### System.Object\n## NOTES\n\n## RELATED LINKS\n"
  },
  {
    "path": "Enums/RGBColors.ps1",
    "content": "Add-Type -TypeDefinition @\"\npublic enum RGBColors {\n    None,\n    Black,\n    Navy,\n    DarkBlue,\n    MediumBlue,\n    Blue,\n    DarkGreen,\n    Green,\n    Teal,\n    DarkCyan,\n    DeepSkyBlue,\n    DarkTurquoise,\n    MediumSpringGreen,\n    Lime,\n    SpringGreen,\n    Aqua,\n    Cyan,\n    MidnightBlue,\n    DodgerBlue,\n    LightSeaGreen,\n    ForestGreen,\n    SeaGreen,\n    DarkSlateGray,\n    DarkSlateGrey,\n    LimeGreen,\n    MediumSeaGreen,\n    Turquoise,\n    RoyalBlue,\n    SteelBlue,\n    DarkSlateBlue,\n    MediumTurquoise,\n    Indigo,\n    DarkOliveGreen,\n    CadetBlue,\n    CornflowerBlue,\n    MediumAquamarine,\n    DimGray,\n    DimGrey,\n    SlateBlue,\n    OliveDrab,\n    SlateGray,\n    SlateGrey,\n    LightSlateGray,\n    LightSlateGrey,\n    MediumSlateBlue,\n    LawnGreen,\n    Chartreuse,\n    Aquamarine,\n    Maroon,\n    Purple,\n    Olive,\n    Grey,\n    Gray,\n    //Grey,\n    SkyBlue,\n    LightSkyBlue,\n    BlueViolet,\n    DarkRed,\n    DarkMagenta,\n    SaddleBrown,\n    DarkSeaGreen,\n    LightGreen,\n    MediumPurple,\n    DarkViolet,\n    PaleGreen,\n    DarkOrchid,\n    YellowGreen,\n    Sienna,\n    Brown,\n    DarkGray,\n    DarkGrey,\n    LightBlue,\n    GreenYellow,\n    PaleTurquoise,\n    LightSteelBlue,\n    PowderBlue,\n    FireBrick,\n    DarkGoldenrod,\n    MediumOrchid,\n    RosyBrown,\n    DarkKhaki,\n    Silver,\n    MediumVioletRed,\n    IndianRed,\n    Peru,\n    Chocolate,\n    Tan,\n    LightGray,\n    LightGrey,\n    Thistle,\n    Orchid,\n    Goldenrod,\n    PaleVioletRed,\n    Crimson,\n    Gainsboro,\n    Plum,\n    BurlyWood,\n    LightCyan,\n    Lavender,\n    DarkSalmon,\n    Violet,\n    PaleGoldenrod,\n    LightCoral,\n    Khaki,\n    AliceBlue,\n    Honeydew,\n    Azure,\n    SandyBrown,\n    Wheat,\n    Beige,\n    WhiteSmoke,\n    MintCream,\n    GhostWhite,\n    Salmon,\n    AntiqueWhite,\n    Linen,\n    LightGoldenrodYellow,\n    OldLace,\n    Red,\n    Fuchsia,\n    Magenta,\n    DeepPink,\n    OrangeRed,\n    Tomato,\n    HotPink,\n    Coral,\n    DarkOrange,\n    LightSalmon,\n    Orange,\n    LightPink,\n    Pink,\n    Gold,\n    PeachPuff,\n    NavajoWhite,\n    Moccasin,\n    Bisque,\n    MistyRose,\n    BlanchedAlmond,\n    PapayaWhip,\n    LavenderBlush,\n    Seashell,\n    Cornsilk,\n    LemonChiffon,\n    FloralWhite,\n    Snow,\n    Yellow,\n    LightYellow,\n    Ivory,\n    White\n}\n\"@"
  },
  {
    "path": "Examples/CompareObjects.ps1",
    "content": "﻿Clear-Host\nImport-Module .\\PSSharedGoods.psd1 -Force\n\n$Object1 = [PSCustomObject] @{\n    \"Name\"        = \"Przemyslaw Klys\"\n    \"Age\"         = \"30\"\n    \"Test\"        = $null\n    \"EmptyArray\"  = @()\n    \"EmptyArray1\" = @()\n    \"Address\"     = @{\n        \"Street\"  = \"Kwiatowa\"\n        \"City\"    = \"Warszawa\"\n\n        \"Country\" = [ordered] @{\n            \"Name\" = \"Poland\"\n        }\n        List      = @(\n            [PSCustomObject] @{\n                \"Name\" = \"Adam Klys\"\n                \"Age\"  = \"32\"\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Justyna Klys\"\n                \"Age\"  = \"33\"\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Justyna Klys\"\n                \"Age\"  = 30\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Justyna Klys\"\n                \"Age\"  = $null\n            }\n        )\n    }\n    ListTest      = @(\n        [PSCustomObject] @{\n            \"Name\" = \"Sława Klys\"\n            \"Age\"  = \"33\"\n        }\n    )\n}\n$Object2 = [PSCustomObject] @{\n    \"Name\"       = \"Przemyslaw Klys\"\n    \"Age\"        = \"30\"\n    \"Test\"       = $null\n    \"EmptyArray\" = @()\n    \"Address\"    = @{\n        \"Street\"  = \"Kwiatowa\"\n        \"City\"    = \"Warszawa\"\n\n        \"Country\" = [ordered] @{\n            \"Name\" = \"Gruzja\"\n        }\n        List      = @(\n            [PSCustomObject] @{\n                \"Name\" = \"Adam Klys\"\n                \"Age\"  = \"32\"\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Pankracy Klys\"\n                \"Age\"  = \"33\"\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Justyna Klys\"\n                \"Age\"  = 30\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Justyna Klys\"\n                \"Age\"  = $null\n            }\n        )\n    }\n    ListTest     = @(\n        [PSCustomObject] @{\n            \"Name\" = \"Sława Klys\"\n            \"Age\"  = \"33\"\n        }\n    )\n}\n\n#Compare-MultipleObjects -Objects $Object1, $Object2 -FlattenObject -Summary -ObjectsName \"test\",'test1' | Format-Table *\nCompare-MultipleObjects -Objects $Object1, $null -FlattenObject -Summary -ObjectsName \"test\",'test1' | Format-Table *\n#Compare-MultipleObjects -Objects $Object1, $null -ObjectsName \"test\",'test1' | Format-Table *\n\n\n$Object1 = [PSCustomObject] @{\n    Value0 = $true\n    Value3 = \"old\"\n    Value1 = $null\n}\n$Object2 = [PSCustomObject] @{\n    Value0 = $true\n    Value3 = ''\n    Value2 = $false\n}\n\nCompare-MultipleObjects -Objects $Object1, $Object2 -ObjectsName \"test\", 'test1' -Summary| Format-Table *"
  },
  {
    "path": "Examples/CompareObjects2.ps1",
    "content": "﻿Import-Module .\\PSSharedGoods.psd1 -Force\n\n$Domain = 'ad.evotec.xyz'\n$DomainInformation = Get-ADDomain -Server $Domain\n$WellKnownFolders = $DomainInformation | Select-Object -Property UsersContainer, ComputersContainer, DomainControllersContainer, DeletedObjectsContainer, SystemsContainer, LostAndFoundContainer, QuotasContainer, ForeignSecurityPrincipalsContainer\n$CurrentWellKnownFolders = [ordered] @{ }\n\n$DomainDistinguishedName = $DomainInformation.DistinguishedName\n$DefaultWellKnownFolders = [ordered] @{\n    UsersContainer                     = \"CN=Users,$DomainDistinguishedName\"\n    ComputersContainer                 = \"CN=Computers,$DomainDistinguishedName\"\n    DomainControllersContainer         = \"OU=Domain Controllers,$DomainDistinguishedName\"\n    DeletedObjectsContainer            = \"CN=Deleted Objects,$DomainDistinguishedName\"\n    SystemsContainer                   = \"CN=System,$DomainDistinguishedName\"\n    LostAndFoundContainer              = \"CN=LostAndFound,$DomainDistinguishedName\"\n    QuotasContainer                    = \"CN=NTDS Quotas,$DomainDistinguishedName\"\n    ForeignSecurityPrincipalsContainer = \"CN=ForeignSecurityPrincipals,$DomainDistinguishedName\"\n}\nforeach ($_ in $WellKnownFolders.PSObject.Properties.Name) {\n    $CurrentWellKnownFolders[$_] = $DomainInformation.$_\n}\nCompare-MultipleObjects -Objects @($WellKnownFolders, $DefaultWellKnownFolders) -SkipProperties  | Format-Table"
  },
  {
    "path": "Examples/Computer-Time.ps1",
    "content": "﻿Import-Module .\\PSsharedGoods.psd1 -Force\n\nGet-ComputerTime -TimeTarget AD2, AD3, EVOWin | Format-Table"
  },
  {
    "path": "Examples/ComputerDetails.ps1",
    "content": "﻿Import-Module .\\PSSharedGoods.psd1 -Force\n\n$Data = Get-Computer -ComputerName EVOWIN, AD1,AD2 -Verbose\n$Data\n$Data.RAM\n\nreturn\n\nNew-HTML {\n    New-HTMLTableOption -DataStore JavaScript\n    New-HTMLTable -DataTable $Data.BIOS -Filtering\n    New-HTMLTable -DataTable $Data.CPU -Filtering\n    New-HTMLTable -DataTable $Data.RAM -Filtering\n    New-HTMLTable -DataTable $Data.Disk -Filtering {\n        New-HTMLTableCondition -Name 'FreePercent' -Value 32 -Color Red -ComparisonType number -Operator lt\n    }\n    New-HTMLTable -DataTable $Data.DiskLogical -Filtering {\n        New-HTMLTableCondition -Name 'FreePercent' -Value 32 -Color Red -ComparisonType number -Operator lt\n    }\n    New-HTMLTable -DataTable $Data.OperatingSystem -Filtering\n    New-HTMLTable -DataTable $Data.Services -Filtering\n    New-HTMLTable -DataTable $Data.System -Filtering\n    New-HTMLTable -DataTable $Data.Time -Filtering\n} -Online -FilePath $PSScriptRoot\\Reports\\ComputerInformation.html -ShowHTML"
  },
  {
    "path": "Examples/ComputerDetails01.ps1",
    "content": "﻿Import-Module .\\PSSharedGoods.psd1 -Force\n\n#Get-ComputerOperatingSystem -ComputerName AD1, AD2, AD3, DC1 -All #| ft -a *\n\nGet-ComputerTask | Format-Table\n\n#Get-ScheduledTask -TaskName 'Test' | fl *\n\n#Get-ScheduledTaskInfo -TaskName 'Test' | fl *"
  },
  {
    "path": "Examples/Connectivity.ps1",
    "content": "Clear-Host\nImport-Module PSSharedGoods -Force -Verbose\n\n$Configuration = @{\n    Options    = @{\n        LogsPath = 'C:\\Support\\Logs\\Automated.log'\n    }\n    Office365  = [ordered] @{\n        Credentials      = [ordered] @{\n            Username                  = 'przemyslaw.klys@evotec.pl'\n            Password                  = 'C:\\Support\\Important\\Password-O365-Evotec.txt'\n            PasswordAsSecure          = $true\n            PasswordFromFile          = $true\n            MultiFactorAuthentication = $false\n        }\n        Azure            = [ordered] @{\n            Use         = $false\n            SessionName = 'O365 Azure MSOL' # MSOL\n        }\n        AzureAD          = [ordered] @{\n            Use         = $false\n            SessionName = 'O365 Azure AD' # Azure\n            Prefix      = ''\n        }\n        ExchangeOnline   = [ordered] @{\n            Use            = $false\n            Authentication = 'Basic'\n            ConnectionURI  = 'https://outlook.office365.com/powershell-liveid/'\n            Prefix         = 'O365'\n            SessionName    = 'O365 Exchange'\n        }\n        SecurityCompliance = [ordered] @{\n            Use            = $true\n            Authentication = 'Basic'\n            ConnectionURI  = 'https://ps.compliance.protection.outlook.com/PowerShell-LiveId'\n            Prefix         = 'O365'\n            SessionName    = 'O365 Security And Compliance'\n        }\n        SharePointOnline = [ordered] @{\n            Use           = $false\n            ConnectionURI = 'https://evotecpoland-admin.sharepoint.com'\n        }\n        SkypeOnline      = [ordered] @{\n            Use         = $false\n            SessionName = 'O365 Skype'\n        }\n        Teams            = [ordered] @{\n            Use         = $false\n            Prefix      = ''\n            SessionName = 'O365 Teams'\n        }\n    }\n    OnPremises = @{\n        Credentials = [ordered] @{\n            Username         = 'przemyslaw.klys@evotec.pl'\n            Password         = 'C:\\Support\\Important\\Password-O365-Evotec.txt'\n            PasswordAsSecure = $true\n            PasswordFromFile = $true\n        }\n        Exchange    = [ordered] @{\n            Use            = $false\n            Authentication = 'Kerberos'\n            ConnectionURI  = 'http://PLKATO365Exch.evotec.pl/PowerShell'\n            Prefix         = ''\n            SessionName    = 'Exchange'\n        }\n    }\n}\n\n$Connected = @()\n\n$BundleCredentials = $Configuration.Office365.Credentials\n$BundleCredentialsOnPremises = $Configuration.OnPremises.Credentials\n\nif ($Configuration.Office365.Azure.Use) {\n    $Connected += Connect-WinAzure @BundleCredentials -Output -SessionName $Configuration.Office365.Azure.SessionName -Verbose\n}\nif ($Configuration.Office365.AzureAD.Use) {\n    $Connected += Connect-WinAzureAD @BundleCredentials -Output -SessionName $Configuration.Office365.AzureAD.SessionName -Verbose\n}\nif ($Configuration.Office365.ExchangeOnline.Use) {\n    $Connected += Connect-WinExchange @BundleCredentials -Output -SessionName $Configuration.Office365.ExchangeOnline.SessionName -ConnectionURI $Configuration.Office365.ExchangeOnline.ConnectionURI -Authentication $Configuration.Office365.ExchangeOnline.Authentication -Verbose\n}\nif ($Configuration.Office365.SecurityCompliance.Use) {\n    $Connected += Connect-WinSecurityCompliance @BundleCredentials -Output -SessionName $Configuration.Office365.SecurityCompliance.SessionName -ConnectionURI $Configuration.Office365.SecurityCompliance.ConnectionURI -Authentication $Configuration.Office365.SecurityCompliance.Authentication -Verbose\n}\nif ($Configuration.Office365.SkypeOnline.Use) {\n    $Connected += Connect-WinSkype @BundleCredentials -Output -SessionName $Configuration.Office365.SkypeOnline.SessionName -Verbose\n}\nif ($Configuration.Office365.SharePointOnline.Use) {\n    $Connected += Connect-WinSharePoint @BundleCredentials -Output -SessionName $Configuration.Office365.SharePointOnline.SessionName -ConnectionURI $Configuration.Office365.SharePointOnline.ConnectionURI -Verbose\n}\nif ($Configuration.Office365.MicrosoftTeams.Use) {\n    $Connected += Connect-WinTeams @BundleCredentials -Output -SessionName $Configuration.Office365.Teams.SessionName -Verbose\n}\nif ($Configuration.OnPremises.Exchange.Use) {\n    $Connected += Connect-WinExchange @BundleCredentialsOnPremises -Output -SessionName $Configuration.OnPremises.Exchange.SessionName -ConnectionURI $Configuration.OnPremises.Exchange.ConnectionURI -Authentication $Configuration.OnPremises.Exchange.Authentication -Verbose\n}\n\nif ($Connected.Status -contains $false) {\n    foreach ($C in $Connected | Where-Object { $_.Status -eq $false }) {\n        Write-Color -Text 'Connecting to tenant failed for ', $C.Output, ' with error ', $Connected.Extended -Color White, Red, White, Red -LogFile $Configuration.Options.LogsPath\n    }\n    return\n}"
  },
  {
    "path": "Examples/ConvertCountry.ps1",
    "content": "﻿Import-Module $PSScriptRoot\\..\\PSsharedGoods.psd1 -Force\n\nConvert-CountryToCountryCode -CountryName 'VIETNAM'\nConvert-CountryToCountryCode -CountryName 'KOREA'\nConvert-CountryToCountryCode -CountryName 'CZECH REPUBLIC'\nConvert-CountryToCountryCode -CountryName 'VIET NAM'\n\nConvert-CountryCodeToCountry 'VN'\nConvert-CountryCodeToCountry 'KR'\nConvert-CountryCodeToCountry 'CZ'\nConvert-CountryCodeToCountry 'VN'"
  },
  {
    "path": "Examples/ConvertFlatObject.ps1",
    "content": "﻿Clear-Host\nImport-Module \"C:\\Support\\GitHub\\PSSharedGoods\\PSSharedGoods.psd1\" -Force\n\n#$Object1 = Get-Content -Raw -LiteralPath \"C:\\Users\\przemyslaw.klys\\OneDrive - Evotec\\Desktop\\Comparison of Intune configuration\\Enrollment restrictions\\CS_Enrollment_Restrictions.json\" | ConvertFrom-Json\n#$Object2 = Get-Content -Raw -LiteralPath \"C:\\Users\\przemyslaw.klys\\OneDrive - Evotec\\Desktop\\Comparison of Intune configuration\\Enrollment restrictions\\CS_Enrollment_Restrictions (1).json\" | ConvertFrom-Json\n$Object3 = [ordered] @{\n    \"Name\"            = \"Przemyslaw Klys\"\n    \"Age\"             = \"30\"\n    \"TestEmptyArray\"  = @()\n    \"TestEmptyString\" = ''\n    \"TestNullValue\"   = $Null\n    \"Address\"         = [ordered] @{\n        \"Street\"  = \"Kwiatowa\"\n        \"City\"    = \"Warszawa\"\n\n        \"Country\" = [ordered] @{\n            \"Name\" = \"Poland\"\n        }\n        List      = @(\n            @{\n                \"Name\" = \"Poland\"\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Adam Klys\"\n                \"Age\"  = \"32\"\n                Super  = [ordered] @{\n                    New  = 1\n                    New2 = 3\n                }\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Justyna Klys\"\n                \"Age\"  = \"33\"\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Justyna Klys\"\n                \"Age\"  = 30\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Justyna Klys\"\n                \"Age\"  = $null\n            }\n        )\n    }\n    ListTest          = @(\n        [PSCustomObject] @{\n            \"Name\" = \"Sława Klys\"\n            \"Age\"  = \"33\"\n        }\n    )\n}\n\n@($Object3, $null) | ConvertTo-FlatObject -ExcludeProperty Oops, Other | Format-Table\nConvertTo-FlatObject -Objects @($Object3, $null) | Format-Table\nConvertTo-FlatObject -Objects @($Object3, $null) -ExcludeProperty Age, Name | Format-Table\n\n$OutputTest = $Object1, $Object2, $Object3 | ConvertTo-FlatObject -ExcludeProperty Age\n$OutputTest | Format-List"
  },
  {
    "path": "Examples/ConvertFlatObject02.ps1",
    "content": "﻿Clear-Host\nImport-Module .\\PSSharedGoods.psd1 -Force\n\n\n# $Object3 = [PSCustomObject] @{\n#     \"Name\" = \"Przemyslaw Klys\"\n#     \"Age\"  = \"30\"\n#     \"tEST\" = @(\"test\", 'test2')\n\n# }\n\n$MyObject = Get-AzureADMSConditionalAccessPolicy #| Where-Object { $_.DisplayName -eq \"All - Deny Basic authentication\" }\n$MyObject | ConvertTo-FlatObject"
  },
  {
    "path": "Examples/ConvertIdentity1.ps1",
    "content": "﻿\nImport-Module $PSScriptRoot\\..\\PSSharedGoods.psd1 -Force\n\nConvert-Identity -Identity \"NT SERVICE\\WdiServiceHost\" -Verbose\nConvert-Identity -Identity 'Guest' -Verbose\nConvert-Identity -Identity 'EvoXXX\\Guest' -Verbose\nConvert-Identity -Identity 'Everyone' -Verbose\nConvert-Identity -Identity 'Window Manager\\Window Manager Group' -Verbose\n\n@(\n    Convert-Identity -Identity 'przemyslaw.klys@evotec.pl' -Verbose\n    Convert-Identity -Identity 'test2'\n    Convert-Identity -Identity 'NT AUTHORITY\\NETWORK', 'NT AUTHORITY\\SYSTEM'\n    Convert-Identity -Identity 'S-1-5-21-853615985-2870445339-3163598659-519'\n    Convert-Identity -Identity 'TEST\\some'\n    Convert-Identity -Identity 'EVOTECPL\\Domain Admins'\n\n    Convert-Identity -Identity 'przemyslaw.klys@evotec.pl'\n    Convert-Identity -Identity 'S-1-5-21-853615985-2870445339-3163598659-1105'\n    Convert-Identity -Identity 'adm.pklys'\n    # Another forest SID\n    Convert-Identity -Identity 'TEST\\some'\n    Convert-Identity -Identity 'S-1-5-21-1928204107-2710010574-1926425344-1105'\n    Convert-Identity -Identity 'TEST\\TestUserIgnore'\n    Convert-Identity -Identity 'S-1-5-21-1928204107-2710010574-1926425344-1106'\n    ConvertTo-Identity -Identity 'S-1-5-21-853615985-2870445339-3163598659-519'\n    ConvertTo-Identity -Identity 'EVOTECPL\\Domain Admins'\n) | Format-Table\n\n@(\n    ConvertTo-SID -Identity 'S-1-5-21-1928204107-2710010574-1926425344-1106'\n    ConvertTo-SID -Identity 'EVOTEC\\Domain Admins', 'EVOTECPL\\Domain Admins', 'Domain Admins'\n    ConvertTo-SID -Identity 'NT AUTHORITY\\NETWORK', 'NT AUTHORITY\\SYSTEM'\n    ConvertTo-SID -Identity 'przemyslaw.klys@evotec.pl'\n) | Format-Table"
  },
  {
    "path": "Examples/ConvertIdentity2.ps1",
    "content": "﻿\nImport-Module $PSScriptRoot\\..\\PSSharedGoods.psd1 -Force\n\n@(\n    $DN = 'CN=S-1-5-21-1928204107-2710010574-1926425344-512,CN=ForeignSecurityPrincipals,DC=ad,DC=evotec,DC=xyz'\n    Convert-Identity -Identity $DN\n    $DN = 'CN=Test Test 2,OU=Users,OU=Production,DC=ad,DC=evotec,DC=pl'\n    Convert-Identity -Identity $DN\n    $Group = Get-ADGroup -Identity 'Test Local Group'\n    Convert-Identity -Identity $Group.SID.Value\n) | Format-Table"
  },
  {
    "path": "Examples/ConvertIdentity3.ps1",
    "content": "﻿Import-Module $PSScriptRoot\\..\\PSSharedGoods.psd1 -Force\n\n@(\n    Convert-Identity -Identity 'CN=S-1-5-21-1928204107-2710010574-1926425344-512,CN=ForeignSecurityPrincipals,DC=ad,DC=evotec,DC=xyz'\n    Convert-Identity -Identity 'CN=S-1-5-21-1928204107-2710010574-512,CN=ForeignSecurityPrincipals,DC=ad,DC=evotec,DC=xyz' -Verbose\n) | Format-Table"
  },
  {
    "path": "Examples/ConvertIdentity4.ps1",
    "content": "﻿Import-Module $PSScriptRoot\\..\\PSSharedGoods.psd1 -Force\n\n@(\n    Convert-Identity -Identity 'CN=Test Test 2,OU=Users,OU=Production,DC=ad,DC=evotec,DC=pl'\n    Convert-Identity -Identity 'NT AUTHORITY\\INTERACTIVE'\n    Convert-Identity -Identity 'INTERACTIVE'\n    Convert-Identity -Identity 'EVOTEC\\Domain Admins'\n    Convert-Identity -Identity 'EVOTECPL\\Domain Admins'\n    Convert-Identity -Identity 'Test\\Domain Admins'\n) | Format-Table"
  },
  {
    "path": "Examples/ConvertIdentity5.ps1",
    "content": "﻿Import-Module $PSScriptRoot\\..\\PSSharedGoods.psd1 -Force\n\n$Identity = @(\n    'S-1-5-4'\n    'S-1-5-4'\n    'S-1-5-11'\n    'S-1-5-32-549'\n    'S-1-5-32-550'\n    'S-1-5-32-548'\n    'S-1-5-64-10'\n    'S-1-5-64-14'\n    'S-1-5-64-21'\n    'S-1-5-18'\n    'S-1-5-19'\n    'S-1-5-32-544'\n    'S-1-5-20-20-10-51' # Wrong SID\n    'S-1-5-21-853615985-2870445339-3163598659-512'\n    'S-1-5-21-3661168273-3802070955-2987026695-512'\n    'S-1-5-21-1928204107-2710010574-1926425344-512'\n    'CN=Test Test 2,OU=Users,OU=Production,DC=ad,DC=evotec,DC=pl'\n    'Test Local Group'\n    'przemyslaw.klys@evotec.pl'\n    'test2'\n    'NT AUTHORITY\\NETWORK'\n    'NT AUTHORITY\\SYSTEM'\n    'S-1-5-21-853615985-2870445339-3163598659-519'\n    'TEST\\some'\n    'EVOTECPL\\Domain Admins'\n    'NT AUTHORITY\\INTERACTIVE'\n    'INTERACTIVE'\n    'EVOTEC\\Domain Admins'\n    'EVOTECPL\\Domain Admins'\n    'Test\\Domain Admins'\n    'EVOTECPL\\Backup Operators' # this will not return anything, in Get-WinADObject we solve it using different method\n    'EVOTECPL\\Print Operators' # this will not return anything, in Get-WinADObject we solve it using different method\n    'EVOTEC\\Print Operators' # this will not return anything, in Get-WinADObject we solve it using different method\n    'Print Operators' # this will not return anything, in Get-WinADObject we solve it using different method\n    'S-1-5-32-550'\n    'CN=S-1-5-21-1928204107-2710010574-1926425344-512,CN=ForeignSecurityPrincipals,DC=ad,DC=evotec,DC=xyz' # Valid\n    'CN=S-1-5-21-1928204107-2710010574-512,CN=ForeignSecurityPrincipals,DC=ad,DC=evotec,DC=xyz' # not valid\n    'CN=S-1-5-21-1928204107-2710010574-1926425344-512,CN=ForeignSecurityPrincipals,DC=ad,DC=evotec,DC=xyz' # cached\n)\n\n$TestOutput = Convert-Identity -Identity $Identity -Verbose\n$TestOutput | Format-Table\n\n$Identity.Count\n$TestOutput.Count"
  },
  {
    "path": "Examples/ConvertIdentity6.ps1",
    "content": "﻿Import-Module $PSScriptRoot\\..\\PSSharedGoods.psd1 -Force\n\n$Identities = @(\n    'S-1-0-0'\n    'S-1-1-0'\n    'S-1-2-0'\n    'S-1-2-1'\n    'S-1-3-0'\n    'S-1-3-1'\n    'S-1-3-2'\n    'S-1-3-3'\n    'S-1-3-4'\n    'S-1-5'\n    'S-1-5-1'\n    'S-1-5-2'\n    'S-1-5-3'\n    'S-1-5-4'\n    'S-1-5-5-x-y'\n    'S-1-5-6'\n    'S-1-5-7'\n    'S-1-5-8'\n    'S-1-5-9'\n    'S-1-5-10'\n    'S-1-5-11'\n    'S-1-5-12'\n    'S-1-5-13'\n    'S-1-5-14'\n    'S-1-5-15'\n    'S-1-5-17'\n    'S-1-5-18'\n    'S-1-5-19'\n    'S-1-5-20'\n    #   'S-1-5-21-<root domain>-498'\n    'S-1-5-21-0-0-0-496'\n    'S-1-5-21-0-0-0-497'\n    # 'S-1-5-21-<machine>-500'\n    # 'S-1-5-21-<machine>-501'\n    # 'S-1-5-21-<domain>-502'\n    # 'S-1-5-21-<domain>-512'\n    # 'S-1-5-21-<domain>-513'\n    # 'S-1-5-21-<domain>-514'\n    # 'S-1-5-21-<domain>-515'\n    # 'S-1-5-21-<domain>-516'\n    # 'S-1-5-21-<domain>-517'\n    # 'S-1-5-21-<root-domain>-518'\n    # 'S-1-5-21-<root-domain>-519'\n    # 'S-1-5-21-<domain>-520'\n    # 'S-1-5-21-<domain>-521'\n    # 'S-1-5-21-<domain>-522'\n    # 'S-1-5-21-<domain>-525'\n    # 'S-1-5-21-<domain>-526'\n    # 'S-1-5-21-<domain>-527'\n    # 'S-1-5-21-<domain>-553'\n    # 'S-1-5-21-<domain>-571'\n    # 'S-1-5-21-<domain>-572'\n    'S-1-5-32-544'\n    'S-1-5-32-545'\n    'S-1-5-32-546'\n    'S-1-5-32-547'\n    'S-1-5-32-548'\n    'S-1-5-32-549'\n    'S-1-5-32-550'\n    'S-1-5-32-551'\n    'S-1-5-32-552'\n    'S-1-5-32-554'\n    'S-1-5-32-555'\n    'S-1-5-32-556'\n    'S-1-5-32-557'\n    'S-1-5-32-558'\n    'S-1-5-32-559'\n    'S-1-5-32-560'\n    'S-1-5-32-561'\n    'S-1-5-32-562'\n    'S-1-5-32-568'\n    'S-1-5-32-569'\n    'S-1-5-32-573'\n    'S-1-5-32-574'\n    'S-1-5-32-575'\n    'S-1-5-32-576'\n    'S-1-5-32-577'\n    'S-1-5-32-578'\n    'S-1-5-32-579'\n    'S-1-5-32-580'\n    'S-1-5-33'\n    'S-1-5-64-10'\n    'S-1-5-64-14'\n    'S-1-5-64-21'\n    'S-1-5-65-1'\n    'S-1-5-80'\n    'S-1-5-84-0-0-0-0-0'\n    'S-1-5-113'\n    'S-1-5-114'\n    'S-1-5-1000'\n    'S-1-15-2-1'\n    'S-1-16-0'\n    'S-1-16-4096'\n    'S-1-16-8192'\n    'S-1-16-8448'\n    'S-1-16-12288'\n    'S-1-16-16384'\n    'S-1-16-20480'\n    'S-1-16-28672'\n    'S-1-18-1'\n    'S-1-18-2'\n    'S-1-18-3'\n    'S-1-18-4'\n    'S-1-18-5'\n    'S-1-18-6'\n)\n$Output = foreach ($I in $Identities) {\n    Write-Color -Text \"Going thru $I\" -Color Yellow\n    Convert-Identity -Identity $I\n}\n$Output | Format-Table"
  },
  {
    "path": "Examples/ConvertOffice365Licenses.ps1",
    "content": "#Import-Module .\\PSSharedGoods.psd1 -Force\n\nConvert-Office365License -License 'VISIOCLIENT','PROJECTONLINE_PLAN_1','test', 'tenant:VISIOCLIENT'\nConvert-Office365License -License \"Office 365 (Plan A3) for Faculty\",\"Office 365 (Enterprise Preview)\", 'test' -ToSku\n\n"
  },
  {
    "path": "Examples/ConvertTo-JSON/ConvertToJson01.ps1",
    "content": "﻿Import-Module .\\PSSharedGoods.psd1 -Force\n\nEnum Fruit{\n    Apple = 29\n    Pear = 30\n    Kiwi = 31\n}\n\n$ArrayGeneric = [System.Collections.Generic.List[string]]::new()\n$ArrayGeneric.Add(\"Apple\")\n$ArrayGeneric.Add(\"Pear\")\n$ArrayGeneric.Add(\"Kiwi\")\n\n$ArrayGenericDouble = [System.Collections.Generic.List[double]]::new()\n$ArrayGenericDouble.Add(29.0)\n$ArrayGenericDouble.Add(30.0)\n$ArrayGenericDouble.Add(31.4)\n\n\n$PSCustomObject = [PSCustomObject] @{\n    Int                    = '1'\n    Bool                   = $false\n    Date                   = $DateTime\n    Enum                   = [Fruit]::Kiwi\n    String                 = 'This a test, or maybe not;'\n    NewLine                = 'Test,' + [System.Environment]::NewLine + 'test2'\n    Quotes                 = 'OIo*`*sd\"`'\n    PathWithTrail          = 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n    PathWithoutSpaces      = 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n    PathWithSpaces         = \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    PathWithNetwork        = \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    PathWithNetworkAndDots = \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    EmptyArray             = @()\n    HashTable              = @{\n        NumberAgain        = 2\n        OrderedDictionary  = [ordered] @{\n            String    = 'test'\n            HashTable = @{\n                StringAgain = \"oops\"\n            }\n        }\n        Array              = @(\n            'C:\\Users\\1Password.exe'\n            \"C:\\Users\\Ooops.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        )\n        ArrayGeneric       = $ArrayGeneric\n        ArrayGenericDouble = $ArrayGenericDouble\n    }\n}\n\n$Output = $PSCustomObject | ConvertTo-JsonLiteral -Depth 5 -NumberAsString -ArrayJoin -ArrayJoinString \",\" | ConvertFrom-Json\n$Output"
  },
  {
    "path": "Examples/ConvertTo-JSON/ConvertToJson02.ps1",
    "content": "﻿Import-Module .\\PSSharedGoods.psd1 -Force\n\n$Test1 = [PSCustomObject] @{\n    Number     = 1\n    Bool       = $false\n    Array      = @(\n        'C:\\Users\\1Password.exe'\n        \"C:\\Users\\Ooops.exe\"\n        \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    )\n    EmptyArray = @()\n    EmptyList  = [System.Collections.Generic.List[string]]::new()\n    HashTable  = @{\n        NumberAgain       = 2\n        OrderedDictionary = [ordered] @{\n            String    = 'test'\n            HashTable = @{\n                StringAgain = \"oops\"\n            }\n        }\n        Array             = @(\n            'C:\\Users\\1Password.exe'\n            \"C:\\Users\\Ooops.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        )\n    }\n    DateTime   = Get-Date\n}\n\n$Test2 = @{\n    Test1 = 1\n    Test2 = 2\n    Test3 = 3\n}\n\n$Test1 | ConvertTo-JsonLiteral -Depth 1 | ConvertFrom-Json\n$Test2 | ConvertTo-JsonLiteral -Depth 1 | ConvertFrom-Json"
  },
  {
    "path": "Examples/ConvertTo-JSON/ConvertToJson03.ps1",
    "content": "﻿Import-Module .\\PSSharedGoods.psd1 -Force\n\n$Test = [PSCustomObject] @{\n    Number    = 1\n    Bool      = $false\n    Array     = @(\n        'C:\\Users\\1Password.exe'\n        \"C:\\Users\\Ooops.exe\"\n        \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    )\n    HashTable = @{\n        NumberAgain       = 2\n        OrderedDictionary = [ordered] @{\n            String    = 'test'\n            HashTable = @{\n                StringAgain = \"oops\"\n            }\n        }\n        Array             = @(\n            'C:\\Users\\1Password.exe'\n            \"C:\\Users\\Ooops.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        )\n    }\n}\n\nMeasure-Command {\n    for ($i = 0; $i -le 1000; $i++) {\n        $Test | ConvertTo-Json -Depth 1\n    }\n}\nMeasure-Command {\n    for ($i = 0; $i -le 1000; $i++) {\n        ConvertTo-JsonLiteral -Depth 1 -Object $Test\n    }\n}\n\nMeasure-Command {\n    for ($i = 0; $i -le 1000; $i++) {\n        $Test | ConvertTo-JsonLiteral -Depth 1\n    }\n}"
  },
  {
    "path": "Examples/ConvertTo-JSON/ConvertToJson04.ps1",
    "content": "﻿Import-Module .\\PSSharedGoods.psd1 -Force\n\n\n$Data = [PSCustomObject] @{\n    Test  = 1\n    Test2 = 2\n    Test3 = [PSCustomObject] @{\n        IdontWantThat = 1\n    }\n}\n\nNew-HTML {\n    New-HTMLTable -DataTable $Data -DataStore JavaScript\n} -FilePath $Env:USERPROFILE\\Desktop\\test.html -ShowHTML -Online\n\nreturn\n#Get-Process | Select-Object -First 2 | ConvertTo-JsonLiteral -Depth 0\n\nGet-Process | Select-Object -First 2 | ConvertTo-Json -Depth 1 #| ConvertFrom-Json\n\nreturn\n$Test = Get-Process | Select-Object -First 2 -Property Threads, TotalProcessorTime | ConvertTo-JsonLiteral -Depth 2 | ConvertFrom-Json\n$Test.Threads | Format-Table"
  },
  {
    "path": "Examples/ConvertTo-JSON/ConvertToJson05.ps1",
    "content": "﻿Import-Module .\\PSSharedGoods.psd1 -Force\n\n$Test = [PSCustomObject] @{\n    Number       = 1\n    Bool         = $false\n    'Test.Value1.2' = '5'\n    'Test.Value1.3' = '6'\n}\n\n$Test, $Test, $Test | ConvertTo-JsonLiteral\n\n\n$Test = [PSCustomObject] @{\n    Number       = 1\n    Bool         = $false\n    'Test.Value1.2' = '5'\n    'Test.Value1.3' = '6'\n}\n\n$Test | ConvertTo-Json"
  },
  {
    "path": "Examples/ConvertTo-JSON/ConvertToJson06.ps1",
    "content": "﻿Import-Module PSWriteHTML -Force\nImport-Module .\\PSSharedGoods.psd1 -Force\n\n$DataTable3 = @(\n    $PropertyName1 = 'Test' + [System.Environment]::NewLine + 'Test3';\n    $PropertyName2 = 'Test' + [System.Environment]::NewLine + 'Test3' + \"`n Test\"\n    [PSCustomObject] @{\n        'Test1'        = 'Test' + [System.Environment]::NewLine + 'test3';\n        'Test2'        = 'Test' + [System.Environment]::NewLine + 'test3' + \"`n test\"\n        'Test3'        = 'Test' + [System.Environment]::NewLine + 'test3' + \"`r`n test\"\n        'Test4'        = 'Test' + [System.Environment]::NewLine + 'test3' + \"`r test\"\n        'Test5'        = 'Test' + \"`r`n\" + 'test3' + \"test\"\n        'Test6'        = @\"\n        Test1\n        Test2\n        Test3\n\n        Test4\n\"@\n        'Test7'        = 'Test' + \"`n`n\" + \"Oops\"\n        'Test9'        = 'Test' + \"<Br>\" + \"Oops\"\n        'Test8\"Oopps\"' = 'MyTest \"Ofcourse\"'\n        \"Test9'Ooops'\" = \"MyTest 'Ofcourse'\"\n        $PropertyName1 = 'Test' + [System.Environment]::NewLine + 'test3';\n        $PropertyName2 = 'Test' + [System.Environment]::NewLine + 'test3';\n        'Property1' = 'Test1'\n        'property2' = 'Test2'\n    }\n)\n\n$DataTable3 | ConvertTo-JsonLiteral -NewLineFormat @{\n    NewLineCarriage = '<br>'\n    NewLine         = \"\\n\"\n    Carriage        = \"\\r\"\n}\n$DataTable3 | ConvertTo-JsonLiteral\n$DataTable3 | ConvertTo-Json\n\nNew-HTML {\n    New-HTMLTableOption -DataStore JavaScript #-NewLineCarriage '\\r\\n'\n    New-HTMLTable -DataTable $DataTable3\n} -ShowHTML -FilePath $PSScriptRoot\\Example7_DataStoreJavaScript02.html -Online\n#$DataTable3 | Out-HtmlView -DataStore JavaScript\n#$DataTable3 | Out-HtmlView -DataStore HTML -InvokeHTMLTags\n#$DataTable3 | ConvertTo-JsonLiteral | ConvertFrom-Json | Format-Table\n#$DataTable3 | ConvertTo-Json | ConvertFrom-Json | Format-Table"
  },
  {
    "path": "Examples/ConvertTo-JSON/ConvertToJson07.ps1",
    "content": "﻿#Import-Module PSWriteHTML -Force\nImport-Module .\\PSSharedGoods.psd1 -Force\n\n$DataTable3 = @(\n    [PSCustomObject] @{\n        'property1' = 'Test1'\n        'property2' = 'Test2'\n    }\n    [PSCustomObject] @{\n        'Property1' = 'Test1'\n        'Property2' = 'Test2'\n        'Property3' = 'Test3'\n    }\n)\n\n# This conversion shows how you can force JSON to use property names from either first element in array or even give it property names\n\n$DataTable3 | ConvertTo-JsonLiteral -Force | ConvertFrom-Json | Format-Table\n$DataTable3 | ConvertTo-JsonLiteral -PropertyName Property1, Property3 -Force | ConvertFrom-Json | Format-Table\n$DataTable3 | ConvertTo-JsonLiteral | ConvertFrom-Json | Format-Table\n$DataTable3 | ConvertTo-Json"
  },
  {
    "path": "Examples/ConvertTo-JSON/ConvertToJson08.ps1",
    "content": "﻿#Import-Module PSWriteHTML -Force\nImport-Module .\\PSSharedGoods.psd1 -Force\n\n$DataTable3 = @(\n    [PSCustomObject] @{\n        'property1' = 'Test1'\n        'property2' = 'Test2'\n        'property3' = @(\n            [PSCustomObject] @{\n                'Property1' = 'Test1'\n                'Property2' = 'Test2'\n                'Property3' = 'Test3'\n            }\n            [PSCustomObject] @{\n                'Property1' = 'Test1'\n                'Property2' = 'Test2'\n                'Property3' = 'Test3'\n            }\n            [PSCustomObject] @{\n                'property1' = 'Test1'\n                'property2' = 'Test2'\n                'property3' = 'Test3'\n            }\n        )\n    }\n    [PSCustomObject] @{\n        'Property1' = 'Test1'\n        'Property2' = 'Test2'\n        'Property3' = 'Test3'\n    }\n)\n\n# This conversion shows how you can force JSON to use property names from either first element in array or even give it property names\n\n$DataTable3 | ConvertTo-JsonLiteral -Force -Depth 2"
  },
  {
    "path": "Examples/ConvertTo-JSON/ConvertToJson09.ps1",
    "content": "﻿#import-module 'C:\\Support\\GitHub\\PSWriteHTML\\PSWriteHTML.psd1' -force\nImport-Module .\\PSSharedGoods.psd1 -Force\n\n$DataTable3 = @(\n    [PSCustomObject] @{\n        #'Tree Parent?'                                      = 'Testing Tree ?'\n        #'Other Tree (Rigth)'                                = 'Ok You mean Me (Test)'\n        #'Hierarchy Table Recaluculation interval (minutes)' = \"\\\\*\\NETLOGON\"\n        #\"Test\"                                              = \"\\\\Ooops\\C$\\Windows\\System32\\config\\netlogon.dns\"\n        #\"\\\\*\\SYSVOL\"                                        = 'Test me \\\\*\\SYSVOL and \\\\*\\NETLOGON shares.'\n        #\"\\\\*\\NETLOGON\"                                      = 'Test me \\\\*\\SYSVOL and \\\\*\\NETLOGON shares.'\n        #'Test^'                                             = 'Oops1'\n        #\"Hello+Motto\"                                       = 'Oops2'\n        #'Hello|Motto'                                       = 'Oops3'\n        #'Hello{Value}'                                      = 'Oops4'\n        #'Hello$Value'                                       = 'Oops5'\n        #'Hello.Value'                                       = 'Oops6'\n        #'Hello Value' = 'Oops7.Test $_'\n        #'mmm'         = '$ test'\n        'mm $_ eh'    = @(\n            'Test', 'oops'\n        )\n    }\n)\n$DataTable3 | ConvertTo-JsonLiteral -ArrayJoin -ArrayJoinString ','\n$DataTable3 | Out-HtmlView -DataStore JavaScript -FilePath $PSScriptRoot\\Example7_10_DataStoreJava.html -Online"
  },
  {
    "path": "Examples/ConvertTo-JSON/ConvertToJson10.ps1",
    "content": "﻿Import-Module .\\PSSharedGoods.psd1 -Force\n\n$T = Get-HotFix -ComputerName AD1 | Sort-Object -Property InstalledOn -Descending | Select-Object -First 1\n\n$T | ConvertTo-Json\n$T | ConvertTo-JsonLiteral"
  },
  {
    "path": "Examples/ConvertTo-JSON/ConvertToJson11.ps1",
    "content": "﻿\n\n[Array] $ConditionsContainer = @(\n    [ordered]@{\n        logic      = 'AND'\n        conditions = @(\n            [ordered] @{\n                columnName      = 'name'\n                columnId        = 5\n                operator        = 'eq'\n                type            = 'test'\n                value           = 1.23\n                dataStore       = 'html'\n                caseInsensitive = $false\n            }\n\n        )\n    }\n)\n\n$ConditionsContainer | ConvertTo-JsonLiteral -Depth 5 -AsArray"
  },
  {
    "path": "Examples/ConvertTo-JSON/ConvertToJson12.ps1",
    "content": "﻿Import-Module .\\PSSharedGoods.psd1 -Force\n\n$PSCustomObject = [PSCustomObject] @{\n    Test1 = 1\n    Test2 = 1.2\n    Test3 = 1.2, 1.3, 1.4\n    Test4 = 1, 2, 3, 4, 5\n    Test5 = 1, 1.2, 1.3, 4\n}\n\n$PSCustomObject | ConvertTo-JsonLiteral -Depth 2 | ConvertFrom-Json #-NumberAsString\n#$PSCustomObject | ConvertTo-Json"
  },
  {
    "path": "Examples/Converts.ps1",
    "content": "﻿Import-Module .\\PSSharedGoods.psd1 -Force\n\n#ConvertFrom-DistinguishedName -DistinguishedName 'CN=Users,DC=ad,DC=evotec,DC=xyz' -ToContainer\n#ConvertFrom-DistinguishedName -DistinguishedName 'CN=Group Policy Creator Owners,CN=Users,DC=ad,DC=evotec,DC=xyz' -ToContainer\n#ConvertFrom-DistinguishedName -DistinguishedName 'CN=Admin,OU=Servers,DC=ad,DC=evotec,DC=xyz' -ToContainer\n#ConvertFrom-DistinguishedName -DistinguishedName 'OU=Servers,DC=ad,DC=evotec,DC=xyz' -ToContainer\n#ConvertFrom-DistinguishedName -DistinguishedName 'CN=Windows Authorization Access Group,CN=Builtin,DC=ad,DC=evotec,DC=xyz' -ToContainer\n\n# ConvertFrom-DistinguishedName -ToFQDN -DistinguishedName \"CN=adcs,DC=ad,DC=evotec,DC=xyz\"\n\n# $OU = @(\n#     'CN=Certificate Service DCOM Access,CN=Builtin,DC=ad,DC=evotec,DC=pl'\n#     'CN=Builtin,DC=ad,DC=evotec,DC=pl'\n#     'CN=Test My\\, User,OU=US,OU=ITR01,DC=ad,DC=evotec,DC=xyz'\n#     'CN=Weird Name\\, with $\\,.,OU=SE2,OU=SE,OU=ITR01,DC=ad,DC=evotec,DC=xyz'\n#     'CN=Administrator,CN=Users,DC=ad,DC=evotec,DC=pl'\n# )\n\n# ConvertFrom-DistinguishedName -DistinguishedName $OU -ToOrganizationalUnit\n\n# ConvertFrom-DistinguishedName -DistinguishedName \"CN=Administrator,CN=Users,DC=ad,DC=evotec,DC=pl\"\n# ConvertFrom-DistinguishedName -DistinguishedName \"CN=Administrator,CN=Users,DC=ad,DC=evotec,DC=pl\" -ToOrganizationalUnit\n# ConvertFrom-DistinguishedName -DistinguishedName \"CN=Administrator,CN=Users,DC=ad,DC=evotec,DC=pl\" -ToDC\n# ConvertFrom-DistinguishedName -DistinguishedName \"CN=Administrator,CN=Users,DC=ad,DC=evotec,DC=pl\" -ToDomainCN\n# ConvertFrom-DistinguishedName -DistinguishedName \"CN=Administrator,CN=Users,DC=ad,DC=evotec,DC=pl\" -ToCanonicalName\n# ConvertFrom-DistinguishedName -DistinguishedName \"CN=Administrator,CN=Users,DC=ad,DC=evotec,DC=pl\" -ToMultipleOrganizationalUnit -IncludeParent\n\n#ConvertFrom-DistinguishedName -DistinguishedName \"CN=Administrator,CN=Users,DC=ad,DC=evotec,DC=pl\" -ToMultipleOrganizationalUnit -IncludeParent\n#ConvertFrom-DistinguishedName -DistinguishedName 'CN=Weird Name\\, with $\\,.,OU=SE2,OU=SE,OU=ITR01,DC=ad,DC=evotec,DC=xyz' -ToMultipleOrganizationalUnit -IncludeParent\n\n#ConvertFrom-DistinguishedName -DistinguishedName 'DC=ad,DC=evotec,DC=xyz' -ToCanonicalName\n#ConvertFrom-DistinguishedName -DistinguishedName 'OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz' -ToCanonicalName\n#ConvertFrom-DistinguishedName -DistinguishedName 'CN=test,OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz' -ToCanonicalName\n\n\n#ConvertFrom-DistinguishedName -DistinguishedName 'OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz' -ToMultipleOrganizationalUnit -IncludeParent\n#ConvertFrom-DistinguishedName -DistinguishedName 'CN=test,OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz'\n\n$Place = ConvertFrom-DistinguishedName -ToOrganizationalUnit -DistinguishedName \"CN=Four-PRINT-CLAY-SHIP-0004,CN=Four-PRINT,OU=FourServers,DC=FourAnyway,DC=com\"\n$Place\n\n#ConvertFrom-DistinguishedName -ToMultipleOrganizationalUnit -IncludeParent -DistinguishedName $Place\n\n\n\n# $DistinguishedName = @(\n#     'CN=Przemyslaw Klys,OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz'\n#     'CN=ITR03_AD Admins,OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n#     'CN=SADM Testing 2,OU=Special,OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz'\n# )\n# ConvertFrom-DistinguishedName -ToOrganizationalUnit -DistinguishedName $DistinguishedName\n\n\n<#\n$Oops = 'cn={55FB3860-74C9-4262-AD77-30197EAB9999},cn=policies,cn=system,DC=ad,DC=evotec,DC=xyz'\nConvertFrom-DistinguishedName -DistinguishedName $Oops -ToDomainCN | Format-Table -AutoSize\n\n$Con = @(\n    'CN=Windows Authorization Access Group,CN=Builtin,DC=ad,DC=evotec,DC=xyz'\n    'CN=Mmm,DC=elo,CN=nee,DC=RootDNSServers,CN=MicrosoftDNS,CN=System,DC=ad,DC=evotec,DC=xyz'\n    'CN=e6d5fd00-385d-4e65-b02d-9da3493ed850,CN=Operations,CN=DomainUpdates,CN=System,DC=ad,DC=evotec,DC=xyz'\n    'OU=Domain Controllers,DC=ad,DC=evotec,DC=pl'\n    'OU=Microsoft Exchange Security Groups,DC=ad,DC=evotec,DC=xyz'\n)\n\nforeach ($_ in $Con) {\n    ConvertFrom-DistinguishedName -DistinguishedName $_ -ToDC | Format-Table -AutoSize\n}\n\nforeach ($_ in $Con) {\n    ConvertFrom-DistinguishedName -DistinguishedName $_ -ToOrganizationalUnit | Format-Table -AutoSize\n}\n\n\nreturn\n\n\n$Search = '*DC=RootDNSServers*'\n$Server = 'ad.evotec.xyz'\n$DomainStructure = Get-ADObject -Filter * -Properties canonicalName -SearchScope OneLevel -Server $Server | Sort-Object canonicalName #| Select-Object objectClass, canonicalName, DistinguishedName\n$Output = foreach ($Structure in $DomainStructure) {\n\n    Get-ADObject -SearchBase $Structure.DistinguishedName -Filter * -Properties canonicalName -Server $Server -SearchScope Subtree | Sort-Object canonicalName\n}\n$Output | Where-Object { $_.DistinguishedName -like $Search } | ft -a\n#>"
  },
  {
    "path": "Examples/CopyDictionary.ps1",
    "content": "﻿Import-Module $PSScriptRoot\\..\\PSsharedGoods.psd1 -Force\n\n$ExtendedForestInformation = Get-WinADForestDetails -Extended\n$ExtendedForestInformation | Format-Table\n$New = Copy-Dictionary -Dictionary $ExtendedForestInformation\n$New | Format-Table"
  },
  {
    "path": "Examples/CopyDictionary1.ps1",
    "content": "﻿Import-Module $PSScriptRoot\\..\\PSsharedGoods.psd1 -Force\n\n$Object = @{\n    String        = 'test'\n    AnotherObject = [ordered] @{\n        Value1 = 1\n        Value2 = 2\n        Value3 = 2\n        Value4 = 2\n        Value5 = 2\n    }\n    SomethingElse = [PSCustomObject] @{\n        Value1 = 1\n        Value2 = 2\n    }\n    ScriptBlock   = {\n        Get-ChildItem\n    }\n}\n\n$NewObject = Copy-Dictionary -Dictionary $Object\n$NewObject.SomethingElse.Value1 = 5\n$NewObject.AnotherObject.Value1 = 5\n\n$NewObject.AnotherObject.Value1 | Should -Be 5\n$NewObject.SomethingElse.Value1 | Should -Be 5\n$NewObject.ScriptBlock | Should -Be $Object.ScriptBlock"
  },
  {
    "path": "Examples/Example-01-FileMetaData.ps1",
    "content": "﻿Import-Module $PSScriptRoot\\..\\PSsharedGoods.psd1 -Force\n\n# Option 1\nGet-ChildItem -Path $Env:USERPROFILE\\Desktop -Force | Get-FileMetaData -Signature -HashAlgorithm SHA256 | Out-HtmlView -ScrollX -Filtering -AllProperties\nreturn\n# Option 2\n$Files = \"$Env:USERPROFILE\\Desktop\\LAPS.x64.msi\", \"$Env:USERPROFILE\\Desktop\\DigiCertUtil.exe\"\n$Files | Get-FileMetaData -Signature -HashAlgorithm MD5 | Out-HtmlView -ScrollX -Filtering -AllProperties\n\n# Option 3\nGet-FileMetaData -File $Files -Signature | Out-HtmlView -ScrollX -Filtering -AllProperties\n\n# Option 4\nGet-ChildItem -Path $Env:USERPROFILE\\Desktop -Force | Where-Object { $_.Attributes -like '*Hidden*' } | Get-FileMetaData -Signature | Out-HtmlView -ScrollX -Filtering -AllProperties\n\n# Option 5\n$Files = \"$Env:USERPROFILE\\Desktop\\LAPS.x64.msi\", \"$Env:USERPROFILE\\Desktop\\DigiCertUtil.exe\"\n$Files | Get-FileMetaData -Signature | Format-List"
  },
  {
    "path": "Examples/Example-02-OperatingSystemTranslation.ps1",
    "content": "Import-Module $PSScriptRoot\\..\\PSsharedGoods.psd1 -Force\n\n$Computers = Get-ADComputer -Filter * -Properties OperatingSystem, OperatingSystemVersion | ForEach-Object {\n    $OPS = ConvertTo-OperatingSystem -OperatingSystem $_.OperatingSystem -OperatingSystemVersion $_.OperatingSystemVersion\n    Add-Member -MemberType NoteProperty -Name 'OperatingSystemTranslated' -Value $OPS -InputObject $_ -Force\n    $_\n}\n$Computers | Select-Object DNS*, Name, SamAccountName, Enabled, OperatingSystem*, DistinguishedName | Format-Table"
  },
  {
    "path": "Examples/File-Permissions.ps1",
    "content": "$Path = \"F:\\Shares\\PersonalTesting\"\n\nfunction Find-AndFixFolders {\n    param(\n        $Path\n    )\n    $folders = Get-ChildItem -Path $path -Directory | Select-Object Name, FullName\n    foreach ($folder in $folders) {\n        Set-FileInheritance $folder.FullName -DisableInheritance # -KeepInheritedAcl\n        #Remove-FilePermission $folder.FullName -UserOrGroup \"Domain\\srv.pklys\"\n        #Remove-FilePermission $folder.FullName -All\n        Set-FilePermission $folder.FullName -UserOrGroup \"Domain\\$($folder.Name)\" -AclRightsToAssign \"ReadAndExecute\"\n        Set-FilePermission $folder.FullName -UserOrGroup \"Domain\\Domain Admins\" -AclRightsToAssign \"FullControl\"\n        Set-FilePermission $folder.FullName -UserOrGroup \"BUILTIN\\Administrators\" -AclRightsToAssign \"FullControl\"\n        Set-FilePermission $folder.FullName -UserOrGroup \"BUILTIN\\Administrators\" -AclRightsToAssign \"FullControl\"\n        Set-FilePermission $folder.FullName -UserOrGroup \"SYSTEM\" -AclRightsToAssign \"FullControl\"\n        Set-FilePermission $folder.FullName -UserOrGroup \"Domain\\domain.pklys\" -AclRightsToAssign \"FullControl\"\n        Remove-FilePermission $folder.FullName -UserOrGroup \"BUILTIN\\Users\"\n    }\n}\n\nFind-AndFixFolders -Path $Path"
  },
  {
    "path": "Examples/File-Permissions01.ps1",
    "content": "﻿Import-Module $PSScriptRoot\\..\\PSsharedGoods.psd1 -Force\n\nGet-FilePermissions -Path '\\\\ad.evotec.xyz\\Netlogon\\New folder' -Extended | Format-Table\nGet-FilePermissions -Path '\\\\ad.evotec.pl\\Netlogon\\New folder (3)' -Extended | Format-Table\n#Get-FilePermissions -Path '\\\\ad.evotec.xyz\\Netlogon\\Signatures' | Format-Table"
  },
  {
    "path": "Examples/File-Permissions02.ps1",
    "content": "﻿Import-Module $PSScriptRoot\\..\\PSsharedGoods.psd1 -Force\n\n$Path = Get-ChildItem '\\\\ad.evotec.xyz\\SYSVOL\\ad.evotec.xyz\\scripts' -Recurse\n\nGet-FilePermission -Path $Path | Format-Table"
  },
  {
    "path": "Examples/Format-Stream1.ps1",
    "content": "$InvoiceEntry1 = [ordered] @{}\n$InvoiceEntry1.Description = 'IT Services 1'\n$InvoiceEntry1.Amount = '$200'\n\n$InvoiceEntry2 = @{}\n$InvoiceEntry2.Description = 'IT Services 2'\n$InvoiceEntry2.Amount = '$300'\n\n$InvoiceEntry3 = @{}\n$InvoiceEntry3.Description = 'IT Services 3'\n$InvoiceEntry3.Amount = '$288'\n\n$InvoiceEntry4 = @{}\n$InvoiceEntry4.Description = 'IT Services 4'\n$InvoiceEntry4.Amount = '$301'\n\n$InvoiceEntry5 = @{}\n$InvoiceEntry5.Description = 'IT Services 5'\n$InvoiceEntry5.Amount = '$299'\n\n$InvoiceData1 = @()\n$InvoiceData1 += $InvoiceEntry1\n$InvoiceData1 += $InvoiceEntry2\n$InvoiceData1 += $InvoiceEntry3\n$InvoiceData1 += $InvoiceEntry4\n$InvoiceData1 += $InvoiceEntry5\n\n\n$InvoiceData1 | Format-Stream -Transpose -TransposeSort ASC -Stream Host -Color Green,Red -ColorRow 2,4"
  },
  {
    "path": "Examples/Format-Stream2.ps1",
    "content": "#get-process | Select-Object -First 5 | Format-Stream Name, PriorityClass, HandleCount -List -Stream Output # | Add-Content -Path 'C:\\Test.txt'\nGet-Process | Select-Object -First 5 | Format-Stream Name, PriorityClass, HandleCount -List -Stream Debug\nGet-Process | Select-Object -First 5 | Format-Stream Name, PriorityClass, HandleCount -Stream Output | Add-Content -Path 'C:\\Test.txt'\n\n#get-process | Select-Object -First 5 | Format-TableVerbose Name, PriorityClass, HandleCount #, FileVersion, Handles, Id, Si , StartInfo, MainModule\nGet-Process | Select-Object -First 5 | Format-Stream Name, PriorityClass, HandleCount , FileVersion, Handles, Id, Si , StartInfo, MainModule -Stream 'Warning'\nGet-Process | Select-Object -First 5 | Format-Stream Id, Si , StartInfo, MainModule -Stream Information\n\nGet-Process | Select-Object -First 5 | Format-Stream *\n\nGet-Process | Select-Object -First 5 | Format-Stream * -HideTableHeaders # Id, Si , StartInfo, MainModule\n\nGet-Process | Select-Object -First 5 | Format-Stream * -AlignRight  # Id, Si , StartInfo, MainModule\n\n$Process = Get-Process | Select-Object -First 5\nFormat-Stream -InputObject $Process -ExcludeProperty Company, CPU -ColumnHeaderSize 15"
  },
  {
    "path": "Examples/Format-Stream3.ps1",
    "content": "Clear-Host\nGet-Process | Select-Object -First 5 | Format-Stream * -Stream Host -ForegroundColor Green,Red, Yellow -ForegroundColorRow 2,4,5\nGet-Process | Select-Object -First 5 | Format-Stream Name,ID -Stream Host -ForegroundColor Green,Red, Yellow -ForegroundColorRow 2,4,5\nGet-Process | Select-Object -First 5 | Format-Stream Name,ID -Stream Host -List"
  },
  {
    "path": "Examples/FunTest.ps1",
    "content": "Function Show-FirstExample {\n    param(\n        [string[]] $Test\n    )  \n    foreach ($my in $Test) {\n        $my\n    }\n}\n\nWrite-Color 'Example 1' -Color Cyan\n\n$Value1 = Show-FirstExample -Test 'one', 'two'\n$Value1 -is [array]\n\n$Value2 = Show-FirstExample -Test 'one'\n$Value2 -is [array]\n\nfunction Show-SecondExample {\n    param(\n        [string[]] $Test\n    )  \n    [Array] $Output = foreach ($my in $Test) {\n        $my\n    }\n    # I want to do something with value before returning\n    if ($Output -is [array]) {\n        Write-Color 'Array' -Color Green\n    }\n    # Actually returning\n    $Output\n\n}\n\nWrite-Color 'Example 2' -Color Cyan\n\n$Value1 = Show-SecondExample -Test 'one', 'two'\n$Value1 -is [array]\n$Value2 = Show-SecondExample -Test 'one'\n$Value2 -is [array]\n\nfunction Show-ThirdExample {\n    param(\n        [string[]] $Test\n    )  \n    $Output = foreach ($my in $Test) {\n        $my\n    }\n    # I want to do something with value before returning\n    if ($Output -is [array]) {\n        Write-Color 'Array' -Color Green\n    }\n    # Actually returning\n    , $Output\n}\n\nWrite-Color 'Example 3' -Color Cyan\n\n$Value1 = Show-ThirdExample -Test 'one', 'two'\n$Value1 -is [array]\n\n$Value2 = Show-ThirdExample -Test 'one'\n$Value2 -is [array]\n\nfunction Show-FourthExample {\n    param(\n        [string[]] $Test\n    )  \n    [Array] $Output1 = foreach ($my in $Test) {\n        $my\n    }\n    [Array] $Output2 = foreach ($my in $Test) {\n        $my\n    }\n    # I want to do something with value before returning\n    if (($Output1 + $Output2) -is [array]) {\n        Write-Color 'Array' -Color Green\n    }\n    # Actually returning\n    , ($Output1 + $Output2) \n}\n\nWrite-Color 'Example 4' -Color Cyan\n\n$Value1 = Show-FourthExample -Test 'one', 'two'\n$Value1 -is [array]\n\n$Value2 = Show-FourthExample -Test 'one'\n$Value2 -is [array]\n\n\nfunction Show-FifthExample {\n    param(\n        [string[]] $Test\n    )  \n    if ($Test -contains 'one') {\n        'one'\n    }\n    if ($Test -contains 'two') {\n        'two'\n    }\n}\n\nWrite-Color 'Example 5' -Color Cyan\n\n$Value1 = Show-FifthExample -Test 'one', 'two'\n$Value1 -is [array]\n\n$Value2 = Show-FifthExample -Test 'one'\n$Value2 -is [array]\n\n\nfunction Show-FifthExampleComplicated {\n    param(\n        [string[]] $Test\n    )  \n    $Value = @()\n    if ($Test -contains 'one') {\n        $Value += 'one'\n    }\n    if ($Test -contains 'two') {\n        $Value += 'two'\n    }\n\n    # Do something with $Value\n    if ($Value.Count -eq 2) {\n        Write-Color 'Happy ', 'Birthday' -Color Red, Yellow\n    }\n    , $Value\n}\n\n\nWrite-Color 'Example 5 Complicated' -Color Cyan\n\n$Value1 = Show-FifthExampleComplicated -Test 'one', 'two'\n$Value1 -is [array]\n\n$Value2 = Show-FifthExampleComplicated -Test 'one'\n$Value2 -is [array]\n\n\n#>\n\n<#\nfunction Show-SixthExample {\n    param(\n        [string[]] $Test\n    )\n    $Output = @(\n        if ($Test -contains 'one') {\n            'one'\n        }\n        if ($Test -contains 'two') {\n            'two'\n        }\n    )\n    , $Output\n}\n\nWrite-Color 'Example 6' -Color Cyan\n\n$Value1 = Show-SixthExample -Test 'one', 'two'\n$Value1 -is [array]\n\n$Value2 = Show-SixthExample -Test 'one'\n$Value2 -is [array]\n\n#>\n\nfunction Show-SeventhExample {\n    param(\n        [string[]] $Test\n    )\n    $Output = @(\n        if ($Test -contains 'one') {\n            'one'\n        }\n        if ($Test -contains 'two') {\n            'two'\n        }\n        foreach ($T in $Test) {\n            \"modified$T\"\n        }\n        $i = 1\n        do {\n            $i++\n            'one'\n        } while ($i -le 5)\n    )\n\n    # Now we can process whole output with just one assingment\n    if ($Output.Count -eq 4) {\n        Write-Color 'Hurray' -Color Red\n    }\n\n    , $Output\n}\n\nWrite-Color 'Example 7' -Color Cyan\n\n$Value1 = Show-SeventhExample -Test 'one', 'two'\n$Value1 -is [array]\n$Value1.Count\nWrite-Color 'Example 7', ' - ', 'Value 1 output in one line' -Color DarkMagenta, White, Green\n$Value1 -join ','\n\n$Value2 = Show-SeventhExample -Test 'one'\n$Value2 -is [array]\n$Value2.Count\nWrite-Color 'Example 7', ' - ', 'Value 2 output in one line' -Color DarkMagenta, White, Yellow\n$Value2 -join ','"
  },
  {
    "path": "Examples/FunTest0.ps1",
    "content": "# Some input data - simplified for example purposes\n$SomeData = @('be', 'me', 'one', 'more', 'time')\n\n$GenericList1 = [System.Collections.Generic.List[Object]]::new()\n$GenericList2 = [System.Collections.Generic.List[Object]]::new()\n\nforeach ($Something in $SomeData) {\n    $GenericList1.Add(\"MyValue $Something\")\n    $GenericList2.Add(\"Other $Something\")\n}\n\n$GenericList1.Count\n$GenericList2.Count\n\n$GenericList1.Remove('MyValue be')\n$GenericList1.Count\n$GenericList1 -join ','\n"
  },
  {
    "path": "Examples/FunTest2.ps1",
    "content": "\n\n$Test = @{\n    Name    = 'Przemek'\n    Surname = 'Klys'\n    Job     = 'IT'\n    Other   = 'Some random comment'\n    Other1  = 'Some random comment'\n    Other2  = 'Some random comment'\n    Other3  = 'Some random comment'\n    Other4  = 'Some random comment'\n    Other5  = 'Some random comment'\n    Other6  = 'Some random comment'\n}\n\n\n$Test1 = [ordered] @{\n    Name    = 'Przemek'\n    Surname = 'Klys'\n    Job     = 'IT'\n    Other   = 'Some random comment'\n    Other1  = 'Some random comment'\n    Other2  = 'Some random comment'\n    Other3  = 'Some random comment'\n    Other4  = 'Some random comment'\n    Other5  = 'Some random comment'\n    Other6  = 'Some random comment'\n}\n\nfunction Get-ProcessMyTable {\n    param(\n        [System.Collections.IDictionary] $Table\n    )\n    $Table | Format-Table -AutoSize\n}\n\n#Get-ProcessMyTable -Table $Test\n#Get-ProcessMyTable -Table $Test1\n\n\n\n$MyValue = @('1', 1, 5)\n[string[]] $SmallArray = 'one', '2', '3'\n[int[]] $SmallInt = 1, 5, 7, 9\n\nfunction Get-ProcessMyArray {\n    param(\n        [Array] $Array\n    )\n\n    foreach ($A in $Array) {\n        if ($A -is [string]) {\n            Write-Color 'String' -Color Green\n        } elseIf ($A -is [int]) {\n            Write-Color 'Int' -Color Red\n        } else {\n            Write-Color 'shouldnt happen' -Color Yellow\n        }\n    }\n    $Array | Format-Table -AutoSize\n}\n\n\nfunction Get-ProcessMyIntArray {\n    param(\n        [int[]] $Array\n    )\n\n    foreach ($A in $Array) {\n        if ($A -is [string]) {\n            Write-Color 'String' -Color Green\n        } elseIf ($A -is [int]) {\n            Write-Color 'Int' -Color Red\n        } else {\n            Write-Color 'shouldnt happen' -Color Yellow\n        }\n    }\n    $Array | Format-Table -AutoSize\n}\n\nfunction Get-ProcessMyStringArray {\n    param(\n        [string[]] $Array\n    )\n\n    foreach ($A in $Array) {\n        if ($A -is [string]) {\n            Write-Color 'String' -Color Green\n        } elseIf ($A -is [int]) {\n            Write-Color 'Int' -Color Red\n        } else {\n            Write-Color 'shouldnt happen' -Color Yellow\n        }\n    }\n    $Array | Format-Table -AutoSize\n}\n\n\n\nWrite-Color 'Example 1 - Array' -Color Blue -LinesBefore 1\nGet-ProcessMyArray -Array $MyValue\nWrite-Color 'Example 2 - Array' -Color Blue -LinesAfter 1\nGet-ProcessMyArray -Array $SmallArray\nWrite-Color 'Example 3 - Array' -Color Blue -LinesAfter 1\nGet-ProcessMyArray -Array $SmallInt\n\n\nWrite-Color 'Example 1 - INT Array' -Color Blue -LinesBefore 1\nGet-ProcessMyIntArray -Array $MyValue\nWrite-Color 'Example 2 - INT Array' -Color Blue -LinesAfter 1\nGet-ProcessMyIntArray -Array $SmallArray\nWrite-Color 'Example 3 - INT Array' -Color Blue -LinesAfter 1\nGet-ProcessMyIntArray -Array $SmallInt\n\n\nWrite-Color 'Example 1 - STRING Array' -Color Blue -LinesBefore 1\nGet-ProcessMyStringArray -Array $MyValue\nWrite-Color 'Example 2 - STRING Array' -Color Blue -LinesAfter 1\nGet-ProcessMyStringArray -Array $SmallArray\nWrite-Color 'Example 3 - STRING Array' -Color Blue -LinesAfter 1\nGet-ProcessMyStringArray -Array $SmallInt\n"
  },
  {
    "path": "Examples/FunTest3.ps1",
    "content": "﻿$Object1 = @{\n    Name   = 'Test1'\n    Status = 1\n}\n$Object2 = @{\n    Name   = 'Tests2'\n    Status = $null\n}\n\n$Array = @($Object1, $Object2)\n\n$Test1 = While ($Array.Status -ne $null) {\n    $true\n    foreach ($A in $Array) {\n        $A.Status = $null\n    }\n}\n\n$Test1\n\n$Test2 = While ($null -ne $Array.Status) {\n    $true\n    foreach ($A in $Array) {\n        $A.Status = $null\n    }\n}\n\n# This will never end....\n\n$Test2"
  },
  {
    "path": "Examples/Get-ComputerInformation.ps1",
    "content": "#Win32_PhysicalMemory\n#Win32_ComputerSystemProcessor\n\n#Get-CimData -Class 'Win32_SystemUsers'\n#Get-CimData -Class 'Win32_ComputerSystemProcessor'\n#Get-CimData -Class 'Win32_PhysicalMemory'\n#Get-ComputerOperatingSystem\n\n#Get-WmiObject win32_processor | select LoadPercentage  |fl\n#Get-WmiObject win32_processor | Measure-Object -property LoadPercentage -Average | Select Average\n\n<#\n\nGet-Counter '\\Process(*)\\% Processor Time' `\n    | Select-Object -ExpandProperty countersamples `\n    | Select-Object -Property instancename, cookedvalue `\n    | Sort-Object -Property cookedvalue -Descending | Select-Object -First 20 `\n    | ft InstanceName, @{L = 'CPU'; E = {($_.Cookedvalue / 100).toString('P')}} -AutoSize\n\n#>\n#Get-Counter '\\Memory\\Available MBytes'\n\n#Get-WmiObject win32_processor | Measure-Object -property LoadPercentage -Average | Select Average | ft\n\n\n#$Processor = Get-CimData -Class 'win32_processor' -ComputerName AD1,AD3,AD2,EVO1 | Select-Object PSComputerName, Name, DeviceID, Caption, SystemName, CurrentClockSpeed, MaxClockSpeed, ProcessorID, ThreadCount, Architecture, Status, LoadPercentage, L3CacheSize, Manufacturer, VirtualizationFirmwareEnabled, NumberOfCores, NumberOfEnabledCore, NumberOfLogicalProcessors\n#$Processor | ft *\n\n\n$Classes = Get-CimClass\n$Classes[0] #| Select-Object -First 15 | Format-Table -AutoSize NameSpace, CimClassName, CimClassProperties\n#Get-ComputerCPU -ComputerName AD1,AD2, AD2019, EVO1 | ft *\n\n\n\n<#1\nGet-Counter -ListSet *memory* | Select-Object -ExpandProperty  Counter\n#>\n\nFunction Test-MemoryUsage {\n    [cmdletbinding()]\n    Param()\n\n    $os = Get-CimInstance Win32_OperatingSystem\n    $pctFree = [math]::Round(($os.FreePhysicalMemory / $os.TotalVisibleMemorySize) * 100, 2)\n\n    if ($pctFree -ge 45) {\n        $Status = \"OK\"\n    } elseif ($pctFree -ge 15 ) {\n        $Status = \"Warning\"\n    } else {\n        $Status = \"Critical\"\n    }\n\n    $os | Select-Object @{Name = \"Status\"; Expression = { $Status } },\n    @{Name = \"PctFree\"; Expression = { $pctFree } },\n    @{Name = \"FreeGB\"; Expression = { [math]::Round($_.FreePhysicalMemory / 1mb, 2) } },\n    @{Name = \"TotalGB\"; Expression = { [int]($_.TotalVisibleMemorySize / 1mb) } }\n\n}\n\nFunction Show-MemoryUsage {\n\n    [cmdletbinding()]\n    Param()\n\n    #get memory usage data\n    $data = Test-MemoryUsage\n\n    Switch ($data.Status) {\n        \"OK\" { $color = \"Green\" }\n        \"Warning\" { $color = \"Yellow\" }\n        \"Critical\" { $color = \"Red\" }\n    }\n\n    $title = @\"\n\n    Memory Check\n    ------------\n\"@\n\n    Write-Host $title -ForegroundColor Cyan\n\n    $data | Format-Table -AutoSize | Out-String | Write-Host -ForegroundColor $color\n\n}\n\n\nTest-MemoryUsage\nShow-MemoryUsage"
  },
  {
    "path": "Examples/GetDomainControllers.ps1",
    "content": "﻿Import-Module .\\PSsharedGoods.psd1 -Force\n\n$ForestInformation = Get-WinADForestDetails -Extended #-IncludeDomains 'ad.evotec.pl' -ExcludeDomainControllers adpreview2019\n#$ForestInformation.ForestDomainControllers | ft -AutoSize\n$F2 = Copy-Dictionary $ForestInformation\n\n$F = Get-WinADForestDetails -ExtendedForestInformation $ForestInformation -IncludeDomains 'ad.evotec.pl' -ExcludeDomainControllers adpreview2019\n$F.ForestDomainControllers | Format-Table -AutoSize\n\n$F2 = Copy-Dictionary $F\n\nGet-WinADForestDetails -ExtendedForestInformation $F2 #-IncludeDomains 'ad.evotec.pl' -ExcludeDomainControllers adpreview2019"
  },
  {
    "path": "Examples/GetDotNet.ps1",
    "content": "﻿\n$PSVersionTable\n$PSVersionTable.DotNetVersion = [System.Runtime.InteropServices.RuntimeInformation]::FrameworkDescription\n$PSVersionTable.OSArchitecture = [System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture\n\n[version]([System.Runtime.InteropServices.RuntimeInformation]::FrameworkDescription -split '\\s' | Select-Object -Last 1)\n\n[version][regex]::Match([System.Runtime.InteropServices.RuntimeInformation]::FrameworkDescription, '(\\d\\.?){3,}$').Value"
  },
  {
    "path": "Examples/OperatingSystemsVersions.ps1",
    "content": "﻿Import-Module .\\PSsharedGoods.psd1 -Force\n\nGet-OperatingSystem | Format-Table\n\nGet-OperatingSystem | Out-HtmlView {\n\n} -DateTimeSortingFormat 'DD.MM.YYYY HH:mm:ss'\n\n\nGet-OperatingSystem -Version '10.0 (19043)' | Format-Table"
  },
  {
    "path": "Examples/Permissions.ps1",
    "content": "﻿Import-Module $PSScriptRoot\\..\\PSsharedGoods.psd1 -Force\n\n#Get-ChildItem -Path '\\\\ad1\\c$\\Windows\\SYSVOL\\sysvol\\ad.evotec.xyz\\scripts\\Signatures\\New folder' | ForEach-Object {\n#    Get-FilePermission -path $_ -ResolveTypes\n#} | Format-Table *\n$Test = '\\\\ad1\\c$\\Windows\\SYSVOL\\sysvol\\ad.evotec.xyz\\scripts\\Signatures\\New folder'\n$Test = '\\\\ad.evotec.xyz\\NETLOGON'\n\nGet-FileOwner -Path $Test -Resolve\nGet-FilePermission -Path $Test -Resolve -IncludeACLObject | Format-Table *\n#Get-WinADShare -Path $Test | Format-Table *\n\n#Get-WinADShare -Type NetLogon -Owner | Format-Table *"
  },
  {
    "path": "Examples/RegistryGet.ps1",
    "content": "﻿Clear-Host\n\nImport-Module $PSScriptRoot\\..\\PSsharedGoods.psd1 -Force\n\nGet-PSRegistry -RegistryPath \"HKEY_CURRENT_USER\\Tests\" -Key \"\"\nGet-PSRegistry -RegistryPath \"HKEY_CURRENT_USER\\Tests\" -DefaultKey\nGet-PSRegistry -RegistryPath \"HKEY_USERS\" | Format-Table\nGet-PSRegistry -RegistryPath \"HKUDU:\\Tests\" -ComputerName AD1, EVOPOWER | Format-Table\nGet-PSRegistry -RegistryPath \"HKUDUD\\Tests\" -ComputerName AD1, EVOPOWER | Format-Table\nGet-PSRegistry -RegistryPath \"HKEY_ALL_DOMAIN_USERS\\Tests\" -ComputerName AD1 | Format-Table\nGet-PSRegistry -RegistryPath \"HKUDU\\Test\" -Key \"Ok\" -ComputerName AD1, 'EVOPOWER' | Format-Table\nGet-PSRegistry -RegistryPath \"HKUDU\\Test\" -Key \"Ok\" -ComputerName AD1, 'EVOPOWER' | Format-Table\nGet-PSRegistry -RegistryPath \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Ok\\MaybeNot\\More\" | Format-Table\nGet-PSRegistry -RegistryPath \"HKEY_USER S\\S-1-5-18\\Test\", 'HKEY_USERS\\S-1-5-19\\Test' -Key \"Ok\" -ComputerName AD1, 'EVOPOWER' | Format-Table\nGet-PSRegistry -RegistryPath \"HKEY_CLASSES_ROOT\" -Key 'test' | Format-Table\nGet-PSRegistry -RegistryPath \"HKEY_USERS\" | Format-Table\n\n$Output = Get-PSRegistry -RegistryPath \"HKEY_LOCAL_MACHINE\\SOFTWARE\"\n$Output | Format-Table\n\nGet-PSRegistry -RegistryPath \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Ok\\MaybeNot\\More\" -Advanced -ComputerName AD1, EVOPower | Format-Table\n\n$Registry = @(\n    \"HKEY_LOCAL_MACHINE\\SOFTWARE\\7-Zip\"\n    \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Adobe\\Adobe Acrobat\"\n)\nGet-PSRegistry -RegistryPath $Registry | Format-Table\n\nGet-PSRegistry -RegistryPath \"HKLM:\\SOFTWARE\\Ok\\MaybeNot\\More\" -ComputerName AD1 | Format-Table"
  },
  {
    "path": "Examples/RegistryGetDefault.ps1",
    "content": "﻿Clear-Host\n\nImport-Module $PSScriptRoot\\..\\PSsharedGoods.psd1 -Force\n\n$Registry = Get-PSRegistry -Path \"HKEY_CURRENT_USER\\Printers\\ConvertUserDevModesCount\"\n$FoundKeys = foreach ($R in $Registry.PSObject.Properties.Name) {\n    if ($R -like \"*EVO*\") {\n        $R\n    }\n}\nforeach ($Key in $FoundKeys) {\n    Remove-PSRegistry -RegistryPath \"HKEY_CURRENT_USER\\Printers\\ConvertUserDevModesCount\" -Key $Key\n}\n\n#Get-PSRegistry -RegistryPath \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\"\n\n#Get-PSRegistry -RegistryPath \"HKEY_USERS\" | Format-Table\n#Get-PSRegistry -RegistryPath \"HKUDUO:\\Environment\" -Key \"OneDrive\" -Verbose | Format-Table\n#Get-PSRegistry -RegistryPath \"HKUDUDO:\\Environment\" -Key \"OneDrive\" -Verbose | Format-Table\n#Get-PSRegistry -RegistryPath \"HKUDUDO\\Environment\" -Key \"OneDrive\" -Verbose | Format-Table\n#Get-PSRegistry -RegistryPath \"HKEY_ALL_DOMAIN_USERS_OTHER_DEFAULT:\\Environment\" -Key \"OneDrive\" -Verbose | Format-Table\n#Get-PSRegistry -RegistryPath \"HKEY_ALL_DOMAIN_USERS_OTHER_DEFAULT\\Environment\" -Key \"TEMP\" -Verbose | Format-Table\n#Get-PSRegistry -RegistryPath \"HKUDUDO:\\Software\\\\Policies1\\\\Microsoft\\\\Windows\\\\CloudContent\" -Key \"DisableTailoredExperiencesWithDiagnosticData\" -Verbose | Format-Table\n#Set-PSRegistry -Verbose -RegistryPath \"HKUDUDO:\\Software\\\\Policies1\\\\Microsoft\\\\Windows\\\\CloudContent\" -Key 'DisableTailoredExperiencesWithDiagnosticData' -Type dword -Value 1 | Format-Table\n#Set-PSRegistry -RegistryPath 'Users\\Offline_test.1\\Software\\Policies1\\Microsoft\\Windows\\CloudContent' -Key 'DisableTailoredExperiencesWithDiagnosticData' -Type dword -Value 1 | Format-Table\n\n#Get-PSRegistry -Verbose -RegistryPath \"Users\\Offline_test.1\\Software\\Policies1\\Microsoft\\Windows\\CloudContent\" -Key 'DisableTailoredExperiencesWithDiagnosticData' | Format-Table\n#Set-PSRegistry -Verbose -RegistryPath 'HKU:\\Offline_Przemek\\Software\\Policies1\\Microsoft\\Windows\\CloudContent' -Key 'DisableTailoredExperiencesWithDiagnosticData' -Type dword -Value 1 | Format-Table\n#Set-PSRegistry -Verbose -RegistryPath 'HKEY_USERS:\\Offline_Przemek\\Software\\Policies1\\Microsoft\\Windows\\CloudContent' -Key 'DisableTailoredExperiencesWithDiagnosticData' -Type dword -Value 1 | Format-Table\n#Set-PSRegistry -RegistryPath 'Users\\.DEFAULT_USER\\Software\\Policies1\\Microsoft\\Windows\\CloudContent' -Key 'DisableTailoredExperiencesWithDiagnosticData' -Type dword -Value 1 | Format-Table\n#Get-PSRegistry -RegistryPath \"HKUDUD:\\Environment\" | Format-Table\n#Get-PSRegistry -RegistryPath \"HKUD:\\Test1\" | Format-Table\n#Get-PSRegistry -RegistryPath \"HKEY_DEFAULT_USER\\Test1\" | Format-Table\n\n#Get-PSRegistry -RegistryPath \"HKEY_USERS\\S-1-5-21-853615985-2870445339-3163598659-1105\\Control Panel\\Mouse\" | Format-Table\n#Get-PSRegistry -RegistryPath \"HKUDUO:\\Control Panel\\Mouse\" -Verbose | Format-Table\n#Get-PSRegistry -RegistryPath \"HKEY_DEFAULT_USER\\Test1\" -Key '' | Format-Table\n\n# for ($i = 0; $i -lt 20; $i++) {\n#     New-PSRegistry -RegistryPath \"HKUD:\\Test$i\"\n#     Remove-PSRegistry -RegistryPath \"HKUD:\\Test$i\"\n# }\n\n# Set-PSRegistry -RegistryPath \"HKUD:\\Test1\" -Type REG_DWORD -Key \"TestMe\" -Value 5\n\n# Get-PSRegistry -RegistryPath \"HKUDUD:\\Software\\\\Policies\\\\Microsoft\\\\Windows\\\\CloudContent\" #-Key 'ConfigureWindowsSpotlight'\n# Set-PSRegistry -RegistryPath \"HKUDUD:\\Software\\\\Policies\\\\Microsoft\\\\Windows\\\\CloudContent\" -Key 'ConfigureWindowsSpotlight' -Type dword -Value 2\n# Set-PSRegistry -RegistryPath \"Users\\.DEFAULT_USER\\Software\\Policies\\Microsoft\\Windows\\CloudContent\" -Key 'DisableThirdPartySuggestions' -Type dword -Value 1\n# Get-PSRegistry -RegistryPath \"Users\\.DEFAULT_USER\\Software\\Policies\\Microsoft\\Windows\\CloudContent\" | Format-List\n\n# Get the domain name from the first line of $results.DuplicatePasswordGroups"
  },
  {
    "path": "Examples/RegistryNew.ps1",
    "content": "﻿Import-Module $PSScriptRoot\\..\\PSsharedGoods.psd1 -Force\n\nNew-PSRegistry -RegistryPath \"HKCU:\\\\Tests1\\CurrentControlSet\\Control\\Lsa\" -Verbose -WhatIf | Format-Table\nGet-PSRegistry -RegistryPath \"HKCU:\\\\Tests1\\CurrentControlSet\\Control\\Lsa\" -Verbose | Format-Table\n\nNew-PSRegistry -RegistryPath \"HKUDUO:\\\\Tests1\\CurrentControlSet\\Control\\Lsa\" -WhatIf | Format-Table\nGet-PSRegistry -RegistryPath \"HKUDUO:\\Tests1\\CurrentControlSet\\Control\\Lsa\" | Format-Table"
  },
  {
    "path": "Examples/RegistryRemove.ps1",
    "content": "﻿Import-Module $PSScriptRoot\\..\\PSsharedGoods.psd1 -Force\n\nRemove-PSRegistry -RegistryPath \"HKEY_CURRENT_USER\\Tests\\Ok\\MaybeNot\" -Key \"LimitBlankPass1wordUse\" -WhatIf\nRemove-PSRegistry -RegistryPath \"HKCU:\\Tests\\Ok\" -WhatIf\n\nRemove-PSRegistry -RegistryPath \"HKUDUO:\\\\Tests1\\CurrentControlSet\\Control\\Lsa\" -WhatIf | Format-Table\nGet-PSRegistry -RegistryPath \"HKUDUO:\\Tests1\\CurrentControlSet\\Control\\Lsa\" | Format-Table"
  },
  {
    "path": "Examples/RegistrySet.ps1",
    "content": "﻿Clear-Host\nImport-Module $PSScriptRoot\\..\\PSsharedGoods.psd1 -Force\n\n#Get-PSRegistry -RegistryPath \"HKEY_LOCAL_MACHINE\\\\Software\\\\Policies\\\\Microsoft\\\\Windows\\\\Installer\" -Key \"EnableUserControl\"\n#Get-PSRegistry -RegistryPath \"HKCU:\\\\\\\\Tests\" -Key 'LimitBlankPasswordUse'\n#Set-PSRegistry -RegistryPath \"HKEY_LOCAL_MACHINE\\\\Software\\\\Microsoft\\\\Windows NT\\\\CurrentVersion\\\\Winlogon\" -Key 'ForceUnlockLogon' -Value 1 -Type dword -WhatIf\n#Set-PSRegistry -RegistryPath \"Users\\.DEFAULT\\Tests\" -Key 'LimitBlankPasswordUse' -Value '1' -Type dword\n\nGet-PSRegistry -RegistryPath \"HKUDUO:\\Tests1\\CurrentControlSet\\Control\\Lsa\" | Format-Table\nSet-PSRegistry -RegistryPath \"HKUDUO:\\Tests1\\CurrentControlSet\\Control\\Lsa\" -Key 'LimitBlankPasswordUse' -Value '1' -Type dword\nreturn\n\nSet-PSRegistry -RegistryPath \"HKEY_DEFAULT_USER\\\\Tests\\CurrentControlSet\\Control\\Lsa\" -Key \"LimitBlankPasswordUse\" -Value \"0\" -Type REG_DWORD -ComputerName EVOPOWER | Format-Table\nSet-PSRegistry -RegistryPath \"HKUA:\\\\Tests\\CurrentControlSet\\Control\\Lsa\" -Key \"LimitBlankPasswordUse\" -Value \"0\" -Type REG_DWORD -ComputerName EVOPOWER | Format-Table\nSet-PSRegistry -RegistryPath \"HKUAD:\\\\Tests\\CurrentControlSet\\Control\\Lsa\" -Key \"LimitBlankPasswordUse\" -Value \"0\" -Type REG_DWORD -ComputerName EVOPOWER | Format-Table\n\n#Set-PSRegistry -RegistryPath \"HKCU:\\\\Tests\\CurrentControlSet\\Control\\Lsa\" -Key \"LimitBlankPasswordUse\" -Value \"0\" -Type REG_DWORD -ComputerName AD1, EVOPower\n#Set-PSRegistry -RegistryPath \"HKCU:\\\\Tests\\CurrentControlSet\\Control\\Lsa\" -Key \"LimitBlankPasswordUse\" -Value \"0\" -Type REG_DWORD -ComputerName EVOPower #, EVOPower\n\nreturn\n\nSet-PSRegistry -RegistryPath \"HKCU:\\\\Tests\\CurrentControlSet\\Control\\Lsa\" -Key \"LimitBlankPasswordUse\" -Value \"0\" -Type REG_DWORD -WhatIf\nSet-PSRegistry -RegistryPath \"HKCU:\\\\Tests\\CurrentControlSet\\Control\\Lsa\" -Key \"LimitBlankPasswordUse\" -Value \"0\" -Type REG_DWORD -WhatIf\nSet-PSRegistry -RegistryPath \"HKCU:\\\\Tests\" -Key \"LimitBlankPass1wordUse\" -Value \"0\" -Type REG_DWORD -WhatIf\nSet-PSRegistry -RegistryPath \"HKCU:\\\\Tests\\MoreTests\\Tests1\" -Key \"LimitBlankPass1wordUse\" -Value \"0\" -Type REG_DWORD -WhatIf\n\nTest-PSRegistry -RegistryPath \"HKEY_CURRENT_USER\\Tests\\Ok\\MaybeNot\\More\\AndMore\"\nTest-PSRegistry -RegistryPath \"HKEY_CURRENT_USER\\Tests\\Ok\\MaybeNot\\More\\AndMore\" -Key \"LimitBlankPass1wordUse\"\nTest-PSRegistry -RegistryPath \"HKEY_CURRENT_USER\\Tests\\Ok\\MaybeNot\\More\\AndMore\" -Key \"LimitBlankPasswordUse2\"\n\nGet-PSRegistry -RegistryPath 'HKLM\\SYSTEM\\CurrentControlSet\\Services\\Netlogon\\Parameters' -ComputerName AD1 | Format-Table *\n\nSet-PSRegistry -RegistryPath 'HKLM\\SYSTEM\\CurrentControlSet\\Services\\NTDS\\Diagnostics' -Type REG_DWORD -Key \"16 LDAP Interface Events\" -Value 2 -ComputerName AD1 -WhatIf\nSet-PSRegistry -RegistryPath 'HKLM\\SYSTEM\\CurrentControlSet\\Services\\NTDS\\Diagnostics' -Type REG_SZ -Key \"LDAP Interface Events\" -Value 'test' -ComputerName AD1 -WhatIf\nSet-PSRegistry -RegistryPath 'HKLM\\SYSTEM\\CurrentControlSet\\Services\\NTDS\\Diagnostics' -Type REG_EXPAND_SZ -Key \"LDAP12 Interface Events\" -Value 'test' -ComputerName AD1 -WhatIf\nSet-PSRegistry -RegistryPath 'HKLM\\SYSTEM\\CurrentControlSet\\Services\\NTDS\\Diagnostics' -Type REG_MULTI_SZ -Key \"LDAP12123 Interface Events\" -Value @('test', 'ok') -ComputerName AD1 -WhatIf\n\nSet-PSRegistry -RegistryPath \"HKEY_CURRENT_USER\\Tests\\Ok\\MaybeNot\\More\\AndMore\" -Key \"LimitBlankPasswordUse2\" -Value 0 -Type REG_DWORD -WhatIf\nSet-PSRegistry -RegistryPath \"HKLM\\Software\\Ok\\MaybeNot\\More\\AndMore\" -Key \"LimitBlankPasswordUse2\" -Value 0 -Type REG_DWORD -ComputerName 'AD1' -WhatIf\n\nSet-PSRegistry -RegistryPath \"HKEY_CURRENT_USER\\Tests\\CurrentControlSet\\Control\\Lsa\" -Key \"LimitBlankPasswordUse\" -Value \"0\" -Type REG_DWORD -WhatIf"
  },
  {
    "path": "Examples/RemoveFiles.ps1",
    "content": "﻿Import-Module .\\PSSharedGoods.psd1 -Force\n\nRemove-FileItem -Paths \"C:\\Temp\\New folder\" -DeleteMethod RecycleBin -Recursive -Passthru #-SkipFolder"
  },
  {
    "path": "Examples/Services.ps1",
    "content": "Import-Module $PSScriptRoot\\..\\PSsharedGoods.psd1 -Force\n\n$DomainController = 'ad1.ad.evotec.xyz', 'ad2'\n$Services = @('ADWS', 'DNS', 'DFS', 'DFSR', 'Eventlog', 'EventSystem', 'KDC', 'LanManWorkstation', 'LanManServer', 'NetLogon', 'NTDS', 'RPCSS', 'SAMSS', 'Spooler', 'W32Time', 'XblGameSave', 'XblAuthManager')\nGet-PSService -Computers $DomainController -Services $Services | Format-Table"
  },
  {
    "path": "Examples/SpeedTest.ps1",
    "content": "﻿# Helper function\nfunction Measure-Collection {\n    param(\n        [string] $Name,\n        [ScriptBlock] $ScriptBlock\n    )\n    $Time = [System.Diagnostics.Stopwatch]::StartNew()\n    $Output = Invoke-Command -ScriptBlock $ScriptBlock\n    $Time.Stop()\n    \"Name: $Name, Elements: $Output - $($Time.Elapsed.Days) days, $($Time.Elapsed.Hours) hours, $($Time.Elapsed.Minutes) minutes, $($Time.Elapsed.Seconds) seconds, $($Time.Elapsed.Milliseconds) milliseconds, ticks $($Time.Elapsed.Ticks)\"\n}\n\n# Gather data for testing\nif ($null -eq $Files) {\n    # get large data sets\n    $Files = Get-ChildItem -Path 'C:\\' -File -Recurse -ErrorAction SilentlyContinue\n    $Files.Count\n}\n\n\nMeasure-Collection -Name 'Where-Object but not full name' {\n    $LargeFiles = $Files | Where { $_.Length -gt 1MB }\n    $LargeFiles.Count\n}\n\n\nMeasure-Collection -Name 'Where-Object' {\n    $LargeFiles = $Files | Where-Object { $_.Length -gt 1MB }\n    $LargeFiles.Count\n}\n\nMeasure-Collection -Name 'ForEach-Object but without full name' {\n    $LargeFiles = $Files | ForEach {\n        if ($_.Length -gt 1MB) {\n            $_\n        }\n    }\n    $LargeFiles.Count\n}\n\nMeasure-Collection -Name 'ForEach-Object' {\n    $LargeFiles = $Files | ForEach-Object {\n        if ($_.Length -gt 1MB) {\n            $_\n        }\n    }\n    $LargeFiles.Count\n}\n\nMeasure-Collection -Name 'Process' {\n    $LargeFiles = $Files | & {\n        process {\n            if ($_.Length -gt 1MB)\n            { $_ }\n        }\n    }\n    $LargeFiles.Count\n}\nMeasure-Collection -Name 'ForEach' {\n    $LargeFiles = ForEach ($_ in $Files) {\n        if ($_.Length -gt 1MB) {\n            $_\n        }\n    }\n    $LargeFiles.Count\n}\nMeasure-Collection -Name 'ForEach With Named Variable' {\n    $LargeFiles = ForEach ($F in $Files) {\n        if ($F.Length -gt 1MB) {\n            $F\n        }\n    }\n    $LargeFiles.Count\n}\n\nMeasure-Collection -Name 'For Loop' {\n    $LargeFiles = For ($i = 0; $i -le $Files.Count; $i++) {\n        if ($Files[$i].Length -gt 1MB) {\n            $Files[$i]\n        }\n    }\n    $LargeFiles.Count\n}"
  },
  {
    "path": "Examples/TestIP.ps1",
    "content": "﻿Import-Module .\\PSSharedGoods.psd1 -Force\n\n$CidrObject = @{\n    Ip            = '10.2.10.0'\n    NetworkLength = 24\n}\nGet-IPAddressRangeInformation -CIDRObject $CidrObject | Format-Table\n\nGet-IPAddressRangeInformation -Network '10.2.10.0/24' | Format-Table\n\nGet-IPAddressRangeInformation -IPAddress '10.2.10.0' -NetworkLength 24 | Format-Table"
  },
  {
    "path": "Examples/TransposeTable.ps1",
    "content": "﻿Clear-Host\n\nImport-Module .\\PSSharedGoods.psd1 -Force\n\n# $T = [PSCustomObject] @{\n#     Test   = 1\n#     Test2  = 7\n#     Ole    = 'bole'\n#     Trolle = 'A'\n#     Alle   = 'sd'\n# }\n\n# $T1 = [PSCustomObject] @{\n#     Test   = 1\n#     Test2  = 7\n#     Ole    = 'bole'\n#     Trolle = 'A'\n#     Alle   = 'sd'\n# }\n\n# $T2 = [ordered] @{\n#     Test   = 1\n#     Test2  = 7\n#     Ole    = 'bole'\n#     Trolle = 'A'\n#     Alle   = 'sd'\n# }\n# $T3 = @{\n#     Test   = 1\n#     Test2  = 7\n#     Ole    = 'bole'\n#     Trolle = 'A'\n#     Alle   = 'sd'\n# }\n\n# Format-TransposeTable -Object @($T) -Sort ASC -Legacy | Format-Table\n# Format-TransposeTable -Object @($T) -Sort DESC -Legacy | Format-Table\n# Format-TransposeTable -Object @($T) -Legacy | Format-Table\n\n# Format-TransposeTable -Object @($T2) -Sort ASC -Legacy | Format-Table\n# Format-TransposeTable -Object @($T2) -Sort DESC -Legacy | Format-Table\n# Format-TransposeTable -Object @($T2) -Legacy | Format-Table\n\n$T = [PSCustomObject] @{\n    Onet   = 'Test'\n    Name   = \"Server 1\"\n    Test   = 1\n    Test2  = 7\n    Ole    = 'bole'\n    Trolle = 'A'\n    Alle   = 'sd'\n}\n$T1 = [PSCustomObject] @{\n    Name   = \"Server 2\"\n    Test   = 2\n    Test2  = 3\n    Ole    = '1bole'\n    Trolle = 'A'\n    Alle   = 'sd'\n}\n\nFormat-TransposeTable -Object @($T, $T1) -Property \"Name\" | Format-Table\n\n$T2 = [ordered] @{\n    Onet   = 'Test'\n    Name   = \"Server 1\"\n    Test   = 1\n    Test2  = 7\n    Ole    = 'bole'\n    Trolle = 'A'\n    Alle   = 'sd'\n}\n$T3 = [ordered] @{\n    Name   = \"Server 2\"\n    Test   = 2\n    Test2  = 3\n    Ole    = '1bole'\n    Trolle = 'A'\n    Alle   = 'sd'\n}\n\n$Test = Format-TransposeTable -Object @($T2, $T3)\n$Test | Format-Table\n\n\n# Format-TransposeTable -Object @($T) | Format-Table"
  },
  {
    "path": "License",
    "content": "MIT License\n\nCopyright (c) 2018 Evotec\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "PSSharedGoods.Tests.ps1",
    "content": "﻿$ModuleName = (Get-ChildItem $PSScriptRoot\\*.psd1).BaseName\n$PrimaryModule = Get-ChildItem -Path $PSScriptRoot -Filter '*.psd1' -Recurse -ErrorAction SilentlyContinue -Depth 1\nif (-not $PrimaryModule) {\n    throw \"Path $PSScriptRoot doesn't contain PSD1 files. Failing tests.\"\n}\nif ($PrimaryModule.Count -ne 1) {\n    throw 'More than one PSD1 files detected. Failing tests.'\n}\n$PSDInformation = Import-PowerShellDataFile -Path $PrimaryModule.FullName\n$RequiredModules = @(\n    'Pester'\n    'PSWriteColor'\n    if ($PSDInformation.RequiredModules) {\n        $PSDInformation.RequiredModules\n    }\n)\nforeach ($Module in $RequiredModules) {\n    if ($Module -is [System.Collections.IDictionary]) {\n        $Exists = Get-Module -ListAvailable -Name $Module.ModuleName\n        if (-not $Exists) {\n            Write-Warning \"$ModuleName - Downloading $($Module.ModuleName) from PSGallery\"\n            Install-Module -Name $Module.ModuleName -Force -SkipPublisherCheck\n        }\n    } else {\n        $Exists = Get-Module -ListAvailable $Module -ErrorAction SilentlyContinue\n        if (-not $Exists) {\n            Install-Module -Name $Module -Force -SkipPublisherCheck\n        }\n    }\n}\n\nWrite-Color 'ModuleName: ', $ModuleName, ' Version: ', $PSDInformation.ModuleVersion -Color Yellow, Green, Yellow, Green -LinesBefore 2\nWrite-Color 'PowerShell Version: ', $PSVersionTable.PSVersion -Color Yellow, Green\nWrite-Color 'PowerShell Edition: ', $PSVersionTable.PSEdition -Color Yellow, Green\nWrite-Color 'Required modules: ' -Color Yellow\nforeach ($Module in $PSDInformation.RequiredModules) {\n    if ($Module -is [System.Collections.IDictionary]) {\n        Write-Color '   [>] ', $Module.ModuleName, ' Version: ', $Module.ModuleVersion -Color Yellow, Green, Yellow, Green\n    } else {\n        Write-Color '   [>] ', $Module -Color Yellow, Green\n    }\n}\nWrite-Color\n\nImport-Module $PSScriptRoot\\*.psd1 -Force\n$result = Invoke-Pester -Script $PSScriptRoot\\Tests -Verbose -EnableExit\n\nif ($result.FailedCount -gt 0) {\n    throw \"$($result.FailedCount) tests failed.\"\n}"
  },
  {
    "path": "PSSharedGoods.psd1",
    "content": "﻿@{\r\n    AliasesToExport      = @('Get-WinADDomainGUIDs', 'Get-WinADForestGUIDs', 'Get-WinADDomainControllers', 'Get-ComputerApplications', 'Get-ComputerNetworkCard', 'Get-RDPSecurity', 'Get-ServerRoles', 'Get-ComputerServices', 'Get-ComputerTasks', 'Get-MyIP', 'Convert-ExchangeRecipientDetails', 'Convert-FromColor', 'Get-PSPermissions', 'Get-FilePermissions', 'Remove-ItemAlternative', 'Copy-Hashtable', 'Copy-OrderedHashtable', 'Sort-Dictionary', 'FS', 'Format-TableStream', 'Format-ListStream', 'Format-AddSpaceToSentence', 'FV', 'Format-Verbose', 'Format-Debug', 'Format-Warning', 'Join-Url', 'Join-UrlQuery', 'Remove-EmptyValues', 'Remove-StringLatinCharacters', 'Test-IsDN', 'Dismount-RegistryPath', 'Mount-RegistryPath', 'Set-Recovery', 'Get-TimeSynchronization')\r\n    Author               = 'Przemyslaw Klys'\r\n    CmdletsToExport      = @()\r\n    CompanyName          = 'Evotec'\r\n    CompatiblePSEditions = @('Desktop', 'Core')\r\n    Copyright            = '(c) 2011 - 2026 Przemyslaw Klys @ Evotec. All rights reserved.'\r\n    Description          = 'Module covering functions that are shared within multiple projects'\r\n    FunctionsToExport    = @('Convert-ADGuidToSchema', 'Convert-ADSchemaToGuid', 'Get-ADEncryptionTypes', 'Get-ADTrustAttributes', 'Get-WinADDSAGuid', 'Get-WinADForestControllers', 'Get-WinADForestDetails', 'Get-WinADForestOptions', 'Get-CimData', 'Get-Computer', 'Get-ComputerApplication', 'Get-ComputerBios', 'Get-ComputerCPU', 'Get-ComputerCulture', 'Get-ComputerDevice', 'Get-ComputerDisk', 'Get-ComputerDiskLogical', 'Get-ComputerFirewall', 'Get-ComputerInstalledUpdates', 'Get-ComputerMemory', 'Get-ComputerMissingDrivers', 'Get-ComputerNetFramework', 'Get-ComputerNetwork', 'Get-ComputerOemInformation', 'Get-ComputerOperatingSystem', 'Get-ComputerPorts', 'Get-ComputerRAM', 'Get-ComputerRDP', 'Get-ComputerRoles', 'Get-ComputerService', 'Get-ComputerSMB', 'Get-ComputerSMBShare', 'Get-ComputerSMBShareList', 'Get-ComputerSMBSharePermissions', 'Get-ComputerStartup', 'Get-ComputerSystem', 'Get-ComputerTask', 'Get-ComputerTime', 'Get-ComputerTimeNtp', 'Get-ComputerWindowsFeatures', 'Get-ComputerWindowsUpdates', 'Get-OperatingSystem', 'Get-IPAddressInformation', 'Get-MyIpAddress', 'Set-PasswordRemotely', 'Convert-BinaryToHex', 'Convert-BinaryToString', 'Convert-Color', 'Convert-CountryCodeToCountry', 'Convert-CountryToContinent', 'Convert-CountryToCountryCode', 'Convert-DomainFqdnToNetBIOS', 'Convert-DomainToSid', 'Convert-ExchangeEmail', 'Convert-ExchangeItems', 'Convert-ExchangeRecipient', 'Convert-ExchangeSize', 'ConvertFrom-Color', 'Convert-HexToBinary', 'Convert-Identity', 'Convert-IpAddressToPtr', 'Convert-KeyToKeyValue', 'Convert-Office365License', 'Convert-Size', 'Convert-TimeToDays', 'Convert-ToDateTime', 'Convert-ToTimeSpan', 'Convert-TwoArraysIntoOne', 'Convert-UAC', 'Convert-UserAccountControl', 'ConvertFrom-DistinguishedName', 'ConvertFrom-ErrorRecord', 'ConvertFrom-LanguageCode', 'ConvertFrom-NetbiosName', 'ConvertFrom-ObjectToString', 'ConvertFrom-OperationType', 'ConvertFrom-ScriptBlock', 'ConvertFrom-SID', 'ConvertFrom-X500Address', 'ConvertTo-DistinguishedName', 'ConvertTo-FlatHashtable', 'ConvertTo-FlatObject', 'ConvertTo-Identity', 'ConvertTo-ImmutableID', 'ConvertTo-JsonLiteral', 'ConvertTo-NormalizedString', 'ConvertTo-OperatingSystem', 'ConvertTo-OrderedDictionary', 'ConvertTo-PrettyObject', 'ConvertTo-SID', 'Set-DnsServerIpAddress', 'Convert-FileEncoding', 'Convert-FolderEncoding', 'Get-FileEncoding', 'Get-FileInformation', 'Get-FileMetaData', 'Get-FileName', 'Get-FileOwner', 'Get-FilePermission', 'Get-FilesInFolder', 'Get-FileSize', 'Get-FolderEncoding', 'Get-PathSeparator', 'Get-PathTemporary', 'Get-TemporaryDirectory', 'Remove-FileItem', 'Remove-FilePermission', 'Set-FileInheritance', 'Set-FileOwner', 'Set-FilePermission', 'Get-ProtocolDefaults', 'Get-GitHubLatestRelease', 'Get-GitHubVersion', 'Get-IPAddressRangeInformation', 'Set-LoggingCapabilities', 'Set-ReportingCapabilities', 'Clear-DataInformation', 'Compare-MultipleObjects', 'Compare-ObjectsAdvanced', 'Compare-ObjectProperties', 'Copy-Dictionary', 'Copy-DictionaryManual', 'Format-Dictionary', 'Format-FirstXChars', 'Format-PSTable', 'Format-Stream', 'Format-StringToSentence', 'Format-ToTitleCase', 'Format-TransposeTable', 'Format-View', 'Get-Colors', 'Get-DataInformation', 'Get-MimeType', 'Get-Types', 'Join-Uri', 'Join-UriQuery', 'Merge-Array', 'Merge-Objects', 'Remove-DuplicateObjects', 'Remove-EmptyValue', 'Remove-ObjectsExistingInTarget', 'Remove-WhiteSpace', 'Rename-LatinCharacters', 'Rename-UserValuesFromHash', 'Select-Properties', 'Split-Array', 'Test-IsDistinguishedName', 'Find-MyProgramData', 'Initialize-ModulePortable', 'Invoke-CommandCustom', 'Start-InternalFunction', 'Start-MyProgram', 'Get-RandomCharacters', 'Get-RandomFileName', 'Get-RandomPassword', 'Get-RandomStringName', 'Dismount-PSRegistryPath', 'Get-PSRegistry', 'Mount-PSRegistryPath', 'New-PSRegistry', 'Remove-PSRegistry', 'Set-PSRegistry', 'Test-PSRegistry', 'New-Runspace', 'Start-Runspace', 'Stop-Runspace', 'Get-PSService', 'Set-ServiceRecovery', 'Find-TypesNeeded', 'Get-ModulesAvailability', 'Search-Command', 'Test-AvailabilityCommands', 'Test-ComputerAvailability', 'Test-ComputerPort', 'Test-ConfigurationCredentials', 'Test-ForestConnectivity', 'Test-Key', 'Test-ModuleAvailability', 'Test-WinRM', 'Get-TimeSettings', 'Get-TimeZoneAdvanced', 'Get-TimeZoneLegacy', 'Measure-Collection', 'Set-TimeSynchronization', 'Start-TimeLog', 'Stop-TimeLog', 'Show-Array', 'Show-DataInVerbose', 'Show-TableVisualization', 'Save-XML', 'Set-XML')\r\n    GUID                 = 'ee272aa8-baaa-4edf-9f45-b6d6f7d844fe'\r\n    ModuleVersion        = '0.0.313'\r\n    PowerShellVersion    = '5.1'\r\n    PrivateData          = @{\r\n        PSData = @{\r\n            IconUri                    = 'https://evotec.xyz/wp-content/uploads/2018/10/PSSharedGoods-Alternative.png'\r\n            ProjectUri                 = 'https://github.com/EvotecIT/PSSharedGoods'\r\n            RequireLicenseAcceptance   = $false\r\n            Tags                       = @('Windows', 'MacOS', 'Linux', 'Shared', 'Useful', 'Email', 'Format', 'Azure', 'ActiveDirectory')\r\n            ExternalModuleDependencies = @()\r\n        }\r\n    }\r\n    RequiredModules      = @(@{\r\n            Guid            = '0b0ba5c5-ec85-4c2b-a718-874e55a8bc3f'\r\n            ModuleName      = 'PSWriteColor'\r\n            ModuleVersion   = '1.0.3'\r\n        })\r\n    RootModule           = 'PSSharedGoods.psm1'\r\n    ScriptsToProcess     = @()\r\n}"
  },
  {
    "path": "PSSharedGoods.psm1",
    "content": "﻿#Get public and private function definition files.\r\n$Public = @( Get-ChildItem -Path $PSScriptRoot\\Public\\*.ps1 -ErrorAction SilentlyContinue -Recurse )\r\n$Private = @( Get-ChildItem -Path $PSScriptRoot\\Private\\*.ps1 -ErrorAction SilentlyContinue -Recurse )\r\n\r\n$AssemblyFolders = Get-ChildItem -Path $PSScriptRoot\\Lib -Directory -ErrorAction SilentlyContinue\r\nif ($AssemblyFolders.BaseName -contains 'Standard') {\r\n    $Assembly = @( Get-ChildItem -Path $PSScriptRoot\\Lib\\Standard\\*.dll -ErrorAction SilentlyContinue )\r\n} else {\r\n    if ($PSEdition -eq 'Core') {\r\n        $Assembly = @( Get-ChildItem -Path $PSScriptRoot\\Lib\\Core\\*.dll -ErrorAction SilentlyContinue )\r\n    } else {\r\n        $Assembly = @( Get-ChildItem -Path $PSScriptRoot\\Lib\\Default\\*.dll -ErrorAction SilentlyContinue )\r\n    }\r\n}\r\n$FoundErrors = @(\r\n    foreach ($Import in @($Assembly)) {\r\n        try {\r\n            Add-Type -Path $Import.Fullname -ErrorAction Stop\r\n        } catch [System.Reflection.ReflectionTypeLoadException] {\r\n            Write-Warning \"Processing $($Import.Name) Exception: $($_.Exception.Message)\"\r\n            $LoaderExceptions = $($_.Exception.LoaderExceptions) | Sort-Object -Unique\r\n            foreach ($E in $LoaderExceptions) {\r\n                Write-Warning \"Processing $($Import.Name) LoaderExceptions: $($E.Message)\"\r\n            }\r\n            $true\r\n            #Write-Error -Message \"StackTrace: $($_.Exception.StackTrace)\"\r\n        } catch {\r\n            Write-Warning \"Processing $($Import.Name) Exception: $($_.Exception.Message)\"\r\n            $LoaderExceptions = $($_.Exception.LoaderExceptions) | Sort-Object -Unique\r\n            foreach ($E in $LoaderExceptions) {\r\n                Write-Warning \"Processing $($Import.Name) LoaderExceptions: $($E.Message)\"\r\n            }\r\n            $true\r\n            #Write-Error -Message \"StackTrace: $($_.Exception.StackTrace)\"\r\n        }\r\n    }\r\n    #Dot source the files\r\n    foreach ($Import in @($Private + $Public)) {\r\n        try {\r\n            . $Import.Fullname\r\n        } catch {\r\n            Write-Error -Message \"Failed to import functions from $($import.Fullname): $_\"\r\n            $true\r\n        }\r\n    }\r\n)\r\n\r\nif ($FoundErrors.Count -gt 0) {\r\n    $ModuleName = (Get-ChildItem $PSScriptRoot\\*.psd1).BaseName\r\n    Write-Warning \"Importing module $ModuleName failed. Fix errors before continuing.\"\r\n    break\r\n}\r\n\r\nExport-ModuleMember -Function '*' -Alias '*'"
  },
  {
    "path": "Private/Convert-BinaryToIP.ps1",
    "content": "﻿function Convert-BinaryToIP {\n    <#\n    .SYNOPSIS\n    Converts a binary string to an IP address format.\n\n    .DESCRIPTION\n    This function takes a binary string as input and converts it to an IP address format. The binary string must be evenly divisible by 8.\n\n    .PARAMETER Binary\n    The binary string to convert to an IP address format.\n\n    .EXAMPLE\n    Convert-BinaryToIP -Binary \"01000001000000100000000100000001\"\n    Output: 65.0.1.1\n    #>\n    [cmdletBinding()]\n    param(\n        [string] $Binary\n    )\n    $Binary = $Binary -replace '\\s+'\n    if ($Binary.Length % 8) {\n        Write-Warning -Message \"Convert-BinaryToIP - Binary string '$Binary' is not evenly divisible by 8.\"\n        return $Null\n    }\n    [int] $NumberOfBytes = $Binary.Length / 8\n    $Bytes = @(foreach ($i in 0..($NumberOfBytes - 1)) {\n            try {\n                #$Bytes += # skipping this and collecting \"outside\" seems to make it like 10 % faster\n                [System.Convert]::ToByte($Binary.Substring(($i * 8), 8), 2)\n            } catch {\n                Write-Warning -Message \"Convert-BinaryToIP - Error converting '$Binary' to bytes. `$i was $i.\"\n                return $Null\n            }\n        })\n    return $Bytes -join '.'\n}"
  },
  {
    "path": "Private/Convert-FileEncodingSingle.ps1",
    "content": "function Convert-FileEncodingSingle {\n    <#\n    .SYNOPSIS\n    Converts a single file from one encoding to another with validation and rollback protection.\n\n    .DESCRIPTION\n    Internal helper function that converts a single file's encoding with comprehensive validation.\n    Includes content verification and automatic rollback on mismatch to prevent data corruption.\n\n    .PARAMETER FilePath\n    Full path to the file to convert.\n\n    .PARAMETER SourceEncoding\n    Expected source encoding of the file.\n\n    .PARAMETER TargetEncoding\n    Target encoding to convert the file to.\n\n    .PARAMETER Force\n    Convert file even if detected encoding doesn't match SourceEncoding.\n\n    .PARAMETER NoRollbackOnMismatch\n    Skip rolling back changes when content verification fails.\n\n    .PARAMETER CreateBackup\n    Create a backup file before conversion for additional safety.\n    #>\n    [CmdletBinding(SupportsShouldProcess)]\n    param(\n        [Parameter(Mandatory)]\n        [string] $FilePath,\n\n        [Parameter(Mandatory)]\n        [System.Text.Encoding] $SourceEncoding,\n\n        [Parameter(Mandatory)]\n        [System.Text.Encoding] $TargetEncoding,\n\n        [switch] $Force,\n        [switch] $NoRollbackOnMismatch,\n        [switch] $CreateBackup\n    )\n\n    $bytesBefore = $null\n    $backupPath = $null\n\n    try {\n        # Get current file encoding\n        $detectedObj = Get-FileEncoding -Path $FilePath -AsObject\n        $detected = $detectedObj.Encoding\n        $detectedName = $detectedObj.EncodingName\n\n        # More robust encoding comparison using encoding names from our detection\n        $sourceExpected = if ($SourceEncoding -is [System.Text.UTF8Encoding] -and $SourceEncoding.GetPreamble().Length -eq 3) { 'UTF8BOM' }\n                         elseif ($SourceEncoding -is [System.Text.UTF8Encoding]) { 'UTF8' }\n                         elseif ($SourceEncoding -is [System.Text.UnicodeEncoding]) { 'Unicode' }\n                         elseif ($SourceEncoding -is [System.Text.UTF7Encoding]) { 'UTF7' }\n                         elseif ($SourceEncoding -is [System.Text.UTF32Encoding]) { 'UTF32' }\n                         elseif ($SourceEncoding -is [System.Text.ASCIIEncoding]) { 'ASCII' }\n                         elseif ($SourceEncoding -is [System.Text.BigEndianUnicodeEncoding]) { 'BigEndianUnicode' }\n                         else { $SourceEncoding.WebName }\n\n        # Check if source encoding matches detected encoding\n        if ($detectedName -ne $sourceExpected -and -not $Force) {\n            Write-Verbose \"Skipping $FilePath because detected encoding '$detectedName' does not match expected '$sourceExpected'.\"\n            return @{\n                FilePath = $FilePath\n                Status = 'Skipped'\n                Reason = \"Encoding mismatch: detected '$detectedName', expected '$sourceExpected'\"\n                DetectedEncoding = $detectedName\n            }\n        }\n\n        # Check if already target encoding\n        $targetExpected = if ($TargetEncoding -is [System.Text.UTF8Encoding] -and $TargetEncoding.GetPreamble().Length -eq 3) { 'UTF8BOM' }\n                         elseif ($TargetEncoding -is [System.Text.UTF8Encoding]) { 'UTF8' }\n                         elseif ($TargetEncoding -is [System.Text.UnicodeEncoding]) { 'Unicode' }\n                         elseif ($TargetEncoding -is [System.Text.UTF7Encoding]) { 'UTF7' }\n                         elseif ($TargetEncoding -is [System.Text.UTF32Encoding]) { 'UTF32' }\n                         elseif ($TargetEncoding -is [System.Text.ASCIIEncoding]) { 'ASCII' }\n                         elseif ($TargetEncoding -is [System.Text.BigEndianUnicodeEncoding]) { 'BigEndianUnicode' }\n                         else { $TargetEncoding.WebName }\n\n        if ($detectedName -eq $targetExpected) {\n            Write-Verbose \"Skipping $FilePath because encoding is already '$targetExpected'.\"\n            return @{\n                FilePath = $FilePath\n                Status = 'Skipped'\n                Reason = \"Already target encoding '$targetExpected'\"\n                DetectedEncoding = $detectedName\n            }\n        }\n\n        if ($PSCmdlet.ShouldProcess($FilePath, \"Convert from '$detectedName' to '$targetExpected'\")) {\n            # Read original content and create backup\n            $content = [System.IO.File]::ReadAllText($FilePath, $detected)\n            $bytesBefore = [System.IO.File]::ReadAllBytes($FilePath)\n\n            if ($CreateBackup) {\n                $backupPath = \"$FilePath.backup\"\n                $counter = 1\n                while (Test-Path $backupPath) {\n                    $backupPath = \"$FilePath.backup$counter\"\n                    $counter++\n                }\n                [System.IO.File]::WriteAllBytes($backupPath, $bytesBefore)\n                Write-Verbose \"Created backup at: $backupPath\"\n            }\n\n            # Convert the file\n            [System.IO.File]::WriteAllText($FilePath, $content, $TargetEncoding)\n\n            # Verify conversion\n            $convertedContent = [System.IO.File]::ReadAllText($FilePath, $TargetEncoding)\n            if ($convertedContent -ne $content) {\n                $warningMsg = \"Content verification failed for $FilePath - characters may have been lost during conversion\"\n                Write-Warning $warningMsg\n\n                if (-not $NoRollbackOnMismatch) {\n                    [System.IO.File]::WriteAllBytes($FilePath, $bytesBefore)\n                    Write-Warning \"Reverted changes to $FilePath due to content mismatch\"\n\n                    return @{\n                        FilePath = $FilePath\n                        Status = 'Failed'\n                        Reason = 'Content verification failed - reverted'\n                        DetectedEncoding = $detectedName\n                        BackupPath = $backupPath\n                    }\n                } else {\n                    return @{\n                        FilePath = $FilePath\n                        Status = 'Converted'\n                        Reason = 'Content verification failed but conversion kept'\n                        DetectedEncoding = $detectedName\n                        TargetEncoding = $targetExpected\n                        BackupPath = $backupPath\n                        Warning = $warningMsg\n                    }\n                }\n            }\n\n            Write-Verbose \"Successfully converted $FilePath from '$detectedName' to '$targetExpected'\"\n            return @{\n                FilePath = $FilePath\n                Status = 'Converted'\n                Reason = 'Successfully converted'\n                DetectedEncoding = $detectedName\n                TargetEncoding = $targetExpected\n                BackupPath = $backupPath\n            }\n        }\n    } catch {\n        $errorMsg = \"Failed to convert ${FilePath}: $_\"\n        Write-Warning $errorMsg\n\n        # Attempt rollback on error\n        if (-not $NoRollbackOnMismatch -and $bytesBefore) {\n            try {\n                [System.IO.File]::WriteAllBytes($FilePath, $bytesBefore)\n                Write-Verbose \"Rolled back $FilePath due to conversion error\"\n            } catch {\n                Write-Warning \"Failed to rollback $FilePath after error: $_\"\n            }\n        }\n\n        return @{\n            FilePath = $FilePath\n            Status = 'Error'\n            Reason = $errorMsg\n            DetectedEncoding = $detectedName\n            BackupPath = $backupPath\n        }\n    }\n}\n"
  },
  {
    "path": "Private/Convert-GenericRightsToFileSystemRights.ps1",
    "content": "﻿function Convert-GenericRightsToFileSystemRights {\n    <#\n    .SYNOPSIS\n    Converts generic rights to file system rights for a given set of original rights.\n    \n    .DESCRIPTION\n    This function maps generic rights to corresponding file system rights based on the provided original rights.\n    \n    .PARAMETER OriginalRights\n    Specifies the original generic rights to be converted to file system rights.\n    \n    .EXAMPLE\n    Convert-GenericRightsToFileSystemRights -OriginalRights GENERIC_READ\n    Converts the generic read rights to file system rights.\n    \n    .NOTES\n    This function is based on the mapping provided in the blog post: https://blog.cjwdev.co.uk/2011/06/28/permissions-not-included-in-net-accessrule-filesystemrights-enum/\n    \n    .LINK\n    https://blog.cjwdev.co.uk/2011/06/28/permissions-not-included-in-net-accessrule-filesystemrights-enum/\n    #>\n    [cmdletBinding()]\n    param(\n        [System.Security.AccessControl.FileSystemRights] $OriginalRights\n    )\n    Begin {\n        $FileSystemRights = [System.Security.AccessControl.FileSystemRights]\n        $GenericRights = @{\n            GENERIC_READ    = 0x80000000;\n            GENERIC_WRITE   = 0x40000000;\n            GENERIC_EXECUTE = 0x20000000;\n            GENERIC_ALL     = 0x10000000;\n            FILTER_GENERIC  = 0x0FFFFFFF;\n        }\n        $MappedGenericRights = @{\n            FILE_GENERIC_EXECUTE = $FileSystemRights::ExecuteFile -bor $FileSystemRights::ReadPermissions -bor $FileSystemRights::ReadAttributes -bor $FileSystemRights::Synchronize\n            FILE_GENERIC_READ    = $FileSystemRights::ReadAttributes -bor $FileSystemRights::ReadData -bor $FileSystemRights::ReadExtendedAttributes -bor $FileSystemRights::ReadPermissions -bor $FileSystemRights::Synchronize\n            FILE_GENERIC_WRITE   = $FileSystemRights::AppendData -bor $FileSystemRights::WriteAttributes -bor $FileSystemRights::WriteData -bor $FileSystemRights::WriteExtendedAttributes -bor $FileSystemRights::ReadPermissions -bor $FileSystemRights::Synchronize\n            FILE_GENERIC_ALL     = $FileSystemRights::FullControl\n        }\n    }\n    Process {\n        $MappedRights = [System.Security.AccessControl.FileSystemRights]::new()\n        if ($OriginalRights -band $GenericRights.GENERIC_EXECUTE) {\n            $MappedRights = $MappedRights -bor $MappedGenericRights.FILE_GENERIC_EXECUTE\n        }\n        if ($OriginalRights -band $GenericRights.GENERIC_READ) {\n            $MappedRights = $MappedRights -bor $MappedGenericRights.FILE_GENERIC_READ\n        }\n        if ($OriginalRights -band $GenericRights.GENERIC_WRITE) {\n            $MappedRights = $MappedRights -bor $MappedGenericRights.FILE_GENERIC_WRITE\n        }\n        if ($OriginalRights -band $GenericRights.GENERIC_ALL) {\n            $MappedRights = $MappedRights -bor $MappedGenericRights.FILE_GENERIC_ALL\n        }\n        (($OriginalRights -bAND $GenericRights.FILTER_GENERIC) -bOR $MappedRights) -as $FileSystemRights\n    }\n    End {\n\n    }\n}"
  },
  {
    "path": "Private/Convert-IPToBinary.ps1",
    "content": "﻿function Convert-IPToBinary {\n    <#\n    .SYNOPSIS\n    Converts an IPv4 address to binary format.\n\n    .DESCRIPTION\n    This function takes an IPv4 address as input and converts it to binary format.\n\n    .PARAMETER IP\n    Specifies the IPv4 address to convert to binary format.\n\n    .EXAMPLE\n    Convert-IPToBinary -IP \"192.168.1.1\"\n    Converts the IPv4 address \"192.168.1.1\" to binary format.\n\n    .EXAMPLE\n    Convert-IPToBinary -IP \"10.0.0.1\"\n    Converts the IPv4 address \"10.0.0.1\" to binary format.\n\n    #>\n    [cmdletBinding()]\n    param(\n        [string] $IP\n    )\n    $IPv4Regex = '(?:(?:0?0?\\d|0?[1-9]\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)\\.){3}(?:0?0?\\d|0?[1-9]\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)'\n    $IP = $IP.Trim()\n    if ($IP -match \"\\A${IPv4Regex}\\z\") {\n        try {\n            return ($IP.Split('.') | ForEach-Object { [System.Convert]::ToString([byte] $_, 2).PadLeft(8, '0') }) -join ''\n        } catch {\n            Write-Warning -Message \"Convert-IPToBinary - Error converting '$IP' to a binary string: $_\"\n            return $Null\n        }\n    } else {\n        Write-Warning -Message \"Convert-IPToBinary - Invalid IP detected: '$IP'. Conversion failed.\"\n        return $Null\n    }\n}"
  },
  {
    "path": "Private/ConvertFrom-HTML.ps1",
    "content": "﻿function ConvertFrom-HTML {\n    <#\n    .SYNOPSIS\n    Converts HTML strings to plain text.\n\n    .DESCRIPTION\n    This function converts HTML strings to plain text. It can also remove HTML tags if specified.\n\n    .PARAMETER HTML\n    Specifies the HTML strings to convert.\n\n    .PARAMETER RemoveTags\n    Indicates whether to remove HTML tags from the input HTML strings.\n\n    .EXAMPLE\n    ConvertFrom-HTML -HTML \"<p>Hello, <b>World</b>!</p>\" -RemoveTags\n    This example converts the HTML string \"<p>Hello, <b>World</b>!</p>\" to plain text and removes the HTML tags.\n\n    #>\n    [alias('Convert-HTMLToString')]\n    [CmdletBinding()]\n    param(\n        [string[]] $HTML,\n        [switch] $RemoveTags\n    )\n    foreach ($H in $HTML) {\n        if ($RemoveTags) {\n            # this removes things like between brackets like </p>  or <p>\n            $H = $H -replace '<[^>]+>', ''\n        }\n        # This replaces chars to their clean equivalent\n        $H -replace '&#8220;', '\"' -replace '&#8217;', \"'\" -replace '&#8221;', '\"' -replace '&#8230;', '...' -replace '&#8212;', '-' -replace '&#8211;', '-'\n    }\n}"
  },
  {
    "path": "Private/ConvertTo-HkeyUser.ps1",
    "content": "﻿function ConvertTo-HkeyUser {\n    <#\n    .SYNOPSIS\n    Converts registry paths based on specified criteria.\n\n    .DESCRIPTION\n    This function converts registry paths based on the provided HiveDictionary, SubKeys, DictionaryKey, and RegistryPath parameters.\n\n    .PARAMETER HiveDictionary\n    Specifies the dictionary containing the criteria for converting registry paths.\n\n    .PARAMETER SubKeys\n    Specifies an array of subkeys to process.\n\n    .PARAMETER DictionaryKey\n    Specifies the key in the RegistryPath to be replaced.\n\n    .PARAMETER RegistryPath\n    Specifies the original registry path to be converted.\n\n    .EXAMPLE\n    ConvertTo-HkeyUser -HiveDictionary @{ 'Key1' = 'AllDomain'; 'Key2' = 'All+Default' } -SubKeys @('S-1-5-21-123456789-123456789-123456789-1001', '.DEFAULT') -DictionaryKey 'Key1' -RegistryPath 'HKLM:\\Software\\Key1\\SubKey'\n\n    Description:\n    Converts the RegistryPath based on the specified criteria in the HiveDictionary for the provided SubKeys.\n\n    .EXAMPLE\n    ConvertTo-HkeyUser -HiveDictionary @{ 'Key1' = 'Users'; 'Key2' = 'AllDomain+Other' } -SubKeys @('S-1-5-21-123456789-123456789-123456789-1001', 'Offline_User1') -DictionaryKey 'Key2' -RegistryPath 'HKLM:\\Software\\Key2\\SubKey'\n\n    Description:\n    Converts the RegistryPath based on the specified criteria in the HiveDictionary for the provided SubKeys.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [System.Collections.IDictionary] $HiveDictionary,\n        [Array] $SubKeys,\n        [string] $DictionaryKey,\n        [string] $RegistryPath\n    )\n    $OutputRegistryKeys = foreach ($Sub in $Subkeys) {\n        if ($HiveDictionary[$DictionaryKey] -eq 'All') {\n            if ($Sub -notlike \"*_Classes*\" -and $Sub -ne '.DEFAULT') {\n                $RegistryPath.Replace($DictionaryKey, \"Users\\$Sub\")\n            }\n        } elseif ($HiveDictionary[$DictionaryKey] -eq 'All+Default') {\n            if ($Sub -notlike \"*_Classes*\") {\n                if (-not $Script:DefaultRegistryMounted) {\n                    $Script:DefaultRegistryMounted = Mount-DefaultRegistryPath\n                }\n                if ($Sub -eq '.DEFAULT') {\n                    $RegistryPath.Replace($DictionaryKey, \"Users\\.DEFAULT_USER\")\n                } else {\n                    $RegistryPath.Replace($DictionaryKey, \"Users\\$Sub\")\n                }\n            }\n        } elseif ($HiveDictionary[$DictionaryKey] -eq 'Default') {\n            if ($Sub -eq '.DEFAULT') {\n                if (-not $Script:DefaultRegistryMounted) {\n                    $Script:DefaultRegistryMounted = Mount-DefaultRegistryPath\n                }\n                $RegistryPath.Replace($DictionaryKey, \"Users\\.DEFAULT_USER\")\n            }\n        } elseif ($HiveDictionary[$DictionaryKey] -eq 'AllDomain+Default') {\n            if (($Sub.StartsWith(\"S-1-5-21\") -and $Sub -notlike \"*_Classes*\") -or $Sub -eq '.DEFAULT') {\n                if (-not $Script:DefaultRegistryMounted) {\n                    $Script:DefaultRegistryMounted = Mount-DefaultRegistryPath\n                }\n                if ($Sub -eq '.DEFAULT') {\n                    $RegistryPath.Replace($DictionaryKey, \"Users\\.DEFAULT_USER\")\n                } else {\n                    $RegistryPath.Replace($DictionaryKey, \"Users\\$Sub\")\n                }\n            }\n        } elseif ($HiveDictionary[$DictionaryKey] -eq 'AllDomain+Other') {\n            if (($Sub.StartsWith(\"S-1-5-21\") -and $Sub -notlike \"*_Classes*\")) {\n                if (-not $Script:OfflineRegistryMounted) {\n                    $Script:OfflineRegistryMounted = Mount-AllRegistryPath\n                    foreach ($Key in $Script:OfflineRegistryMounted.Keys) {\n                        $RegistryPath.Replace($DictionaryKey, \"Users\\$Key\")\n                    }\n                }\n                $RegistryPath.Replace($DictionaryKey, \"Users\\$Sub\")\n            }\n        } elseif ($HiveDictionary[$DictionaryKey] -eq 'AllDomain+Other+Default') {\n            if (($Sub.StartsWith(\"S-1-5-21\") -and $Sub -notlike \"*_Classes*\") -or $Sub -eq '.DEFAULT') {\n                if (-not $Script:DefaultRegistryMounted) {\n                    $Script:DefaultRegistryMounted = Mount-DefaultRegistryPath\n                }\n                if (-not $Script:OfflineRegistryMounted) {\n                    $Script:OfflineRegistryMounted = Mount-AllRegistryPath\n                    foreach ($Key in $Script:OfflineRegistryMounted.Keys) {\n                        $RegistryPath.Replace($DictionaryKey, \"Users\\$Key\")\n                    }\n                }\n                if ($Sub -eq '.DEFAULT') {\n                    $RegistryPath.Replace($DictionaryKey, \"Users\\.DEFAULT_USER\")\n                } else {\n                    $RegistryPath.Replace($DictionaryKey, \"Users\\$Sub\")\n                }\n            }\n        } elseif ($HiveDictionary[$DictionaryKey] -eq 'AllDomain') {\n            if ($Sub.StartsWith(\"S-1-5-21\") -and $Sub -notlike \"*_Classes*\") {\n                $RegistryPath.Replace($DictionaryKey, \"Users\\$Sub\")\n            }\n        } elseif ($HiveDictionary[$DictionaryKey] -eq 'Users') {\n            if ($Sub -like \"Offline_*\") {\n                $Script:OfflineRegistryMounted = Mount-AllRegistryPath -MountUsers $Sub\n                foreach ($Key in $Script:OfflineRegistryMounted.Keys) {\n                    if ($Script:OfflineRegistryMounted[$Key].Status -eq $true) {\n                        $RegistryPath\n                    }\n                }\n            }\n        }\n    }\n    $OutputRegistryKeys | Sort-Object -Unique\n}"
  },
  {
    "path": "Private/ConvertTo-StringByType.ps1",
    "content": "﻿function ConvertTo-StringByType {\n    <#\n    .SYNOPSIS\n    Private function to use within ConvertTo-JsonLiteral\n\n    .DESCRIPTION\n    Private function to use within ConvertTo-JsonLiteral\n\n    .PARAMETER Value\n    Value to convert to JsonValue\n\n     .PARAMETER Depth\n    Specifies how many levels of contained objects are included in the JSON representation. The default value is 0.\n\n    .PARAMETER AsArray\n    Outputs the object in array brackets, even if the input is a single object.\n\n    .PARAMETER DateTimeFormat\n    Changes DateTime string format. Default \"yyyy-MM-dd HH:mm:ss\"\n\n    .PARAMETER NumberAsString\n    Provides an alternative serialization option that converts all numbers to their string representation.\n\n    .PARAMETER BoolAsString\n    Provides an alternative serialization option that converts all bool to their string representation.\n\n    .PARAMETER PropertyName\n    Uses PropertyNames provided by user (only works with Force)\n\n    .PARAMETER ArrayJoin\n    Forces any array to be a string regardless of depth level\n\n    .PARAMETER ArrayJoinString\n    Uses defined string or char for array join. By default it uses comma with a space when used.\n\n    .PARAMETER Force\n    Forces using property names from first object or given thru PropertyName parameter\n\n    .EXAMPLE\n    $Value = ConvertTo-StringByType -Value $($Object[$a][$i]) -DateTimeFormat $DateTimeFormat\n\n    .NOTES\n    General notes\n    #>\n    [cmdletBinding()]\n    param(\n        [Object] $Value,\n        [int] $Depth,\n        [int] $MaxDepth,\n        [string] $DateTimeFormat,\n        [switch] $NumberAsString,\n        [switch] $BoolAsString,\n        [System.Collections.IDictionary] $NewLineFormat = @{\n            NewLineCarriage = '\\r\\n'\n            NewLine         = \"\\n\"\n            Carriage        = \"\\r\"\n        },\n        [System.Collections.IDictionary] $NewLineFormatProperty = @{\n            NewLineCarriage = '\\r\\n'\n            NewLine         = \"\\n\"\n            Carriage        = \"\\r\"\n        },\n        [System.Collections.IDictionary] $AdvancedReplace,\n        [System.Text.StringBuilder] $TextBuilder,\n        [string[]] $PropertyName,\n        [switch] $ArrayJoin,\n        [string] $ArrayJoinString,\n        [switch] $Force\n    )\n    process {\n        if ($null -eq $Value) {\n            \"`\"`\"\"\n        } elseif ($Value -is [string]) {\n            $Value = $Value.Replace('\\', \"\\\\\").Replace('\"', '\\\"').Replace([System.Environment]::NewLine, $NewLineFormat.NewLineCarriage).Replace(\"`n\", $NewLineFormat.NewLine).Replace(\"`r\", $NewLineFormat.Carriage)\n            #$Value = $Value.Replace('.', '\\.').Replace('$', '\\$')\n            foreach ($Key in $AdvancedReplace.Keys) {\n                $Value = $Value.Replace($Key, $AdvancedReplace[$Key])\n            }\n            \"`\"$Value`\"\"\n        } elseif ($Value -is [DateTime]) {\n            \"`\"$($($Value).ToString($DateTimeFormat))`\"\"\n        } elseif ($Value -is [bool]) {\n            if ($BoolAsString) {\n                \"`\"$($Value)`\"\"\n            } else {\n                $Value.ToString().ToLower()\n            }\n        } elseif ($Value -is [System.Collections.IDictionary]) {\n            if ($MaxDepth -eq 0 -or $Depth -eq $MaxDepth) {\n                \"`\"$($Value)`\"\"\n            } else {\n                $Depth++\n                $null = $TextBuilder.AppendLine(\"{\")\n                for ($i = 0; $i -lt ($Value.Keys).Count; $i++) {\n                    $Property = ([string[]]$Value.Keys)[$i]\n                    $DisplayProperty = $Property.Replace('\\', \"\\\\\").Replace('\"', '\\\"').Replace([System.Environment]::NewLine, $NewLineFormatProperty.NewLineCarriage).Replace(\"`n\", $NewLineFormatProperty.NewLine).Replace(\"`r\", $NewLineFormatProperty.Carriage)\n                    $null = $TextBuilder.Append(\"`\"$DisplayProperty`\":\")\n                    $OutputValue = ConvertTo-StringByType -Value $Value[$Property] -DateTimeFormat $DateTimeFormat -NumberAsString:$NumberAsString -BoolAsString:$BoolAsString -Depth $Depth -MaxDepth $MaxDepth -TextBuilder $TextBuilder -Force:$Force -ArrayJoinString $ArrayJoinString -ArrayJoin:$ArrayJoin.IsPresent\n                    $null = $TextBuilder.Append(\"$OutputValue\")\n                    if ($i -ne ($Value.Keys).Count - 1) {\n                        $null = $TextBuilder.AppendLine(',')\n                    }\n                }\n                $null = $TextBuilder.Append(\"}\")\n            }\n        } elseif ($Value -is [System.Collections.IList] -or $Value -is [System.Collections.ReadOnlyCollectionBase]) {\n            if ($ArrayJoin) {\n                $Value = $Value -join $ArrayJoinString\n                $Value = \"$Value\".Replace('\\', \"\\\\\").Replace('\"', '\\\"').Replace([System.Environment]::NewLine, $NewLineFormatProperty.NewLineCarriage).Replace(\"`n\", $NewLineFormatProperty.NewLine).Replace(\"`r\", $NewLineFormatProperty.Carriage)\n                \"`\"$Value`\"\"\n            } else {\n                if ($MaxDepth -eq 0 -or $Depth -eq $MaxDepth) {\n                    $Value = \"$Value\".Replace('\\', \"\\\\\").Replace('\"', '\\\"').Replace([System.Environment]::NewLine, $NewLineFormatProperty.NewLineCarriage).Replace(\"`n\", $NewLineFormatProperty.NewLine).Replace(\"`r\", $NewLineFormatProperty.Carriage)\n                    \"`\"$Value`\"\"\n                } else {\n                    $CountInternalObjects = 0\n                    $null = $TextBuilder.Append(\"[\")\n                    foreach ($V in $Value) {\n                        $CountInternalObjects++\n                        if ($CountInternalObjects -gt 1) {\n                            $null = $TextBuilder.Append(',')\n                        }\n                        if ($Force -and -not $PropertyName) {\n                            $PropertyName = $V.PSObject.Properties.Name\n                        } elseif ($Force -and $PropertyName) {\n\n                        } else {\n                            $PropertyName = $V.PSObject.Properties.Name\n                        }\n                        $OutputValue = ConvertTo-StringByType -Value $V -DateTimeFormat $DateTimeFormat -NumberAsString:$NumberAsString -BoolAsString:$BoolAsString -Depth $Depth -MaxDepth $MaxDepth -TextBuilder $TextBuilder -Force:$Force -PropertyName $PropertyName -ArrayJoinString $ArrayJoinString -ArrayJoin:$ArrayJoin.IsPresent\n                        $null = $TextBuilder.Append($OutputValue)\n                    }\n                    $null = $TextBuilder.Append(\"]\")\n                }\n            }\n        } elseif ($Value -is [System.Enum] -or $Value.PSTypeNames -contains 'Deserialized.System.Enum') {\n            \"`\"$($($Value).ToString())`\"\"\n        } elseif (($Value | IsNumeric) -eq $true) {\n            $Value = $($Value).ToString().Replace(',', '.')\n            if ($NumberAsString) {\n                \"`\"$Value`\"\"\n            } else {\n                $Value\n            }\n        } elseif ($Value -is [PSObject]) {\n            if ($MaxDepth -eq 0 -or $Depth -eq $MaxDepth) {\n                \"`\"$($Value)`\"\"\n            } else {\n                $Depth++\n                $CountInternalObjects = 0\n                $null = $TextBuilder.AppendLine(\"{\")\n                if ($Force -and -not $PropertyName) {\n                    $PropertyName = $Value.PSObject.Properties.Name\n                } elseif ($Force -and $PropertyName) {\n\n                } else {\n                    $PropertyName = $Value.PSObject.Properties.Name\n                }\n                foreach ($Property in $PropertyName) {\n                    $CountInternalObjects++\n                    if ($CountInternalObjects -gt 1) {\n                        $null = $TextBuilder.AppendLine(',')\n                    }\n                    $DisplayProperty = $Property.Replace('\\', \"\\\\\").Replace('\"', '\\\"').Replace([System.Environment]::NewLine, $NewLineFormatProperty.NewLineCarriage).Replace(\"`n\", $NewLineFormatProperty.NewLine).Replace(\"`r\", $NewLineFormatProperty.Carriage)\n                    $null = $TextBuilder.Append(\"`\"$DisplayProperty`\":\")\n                    $OutputValue = ConvertTo-StringByType -Value $Value.$Property -DateTimeFormat $DateTimeFormat -NumberAsString:$NumberAsString -BoolAsString:$BoolAsString -Depth $Depth -MaxDepth $MaxDepth -TextBuilder $TextBuilder -Force:$Force -ArrayJoinString $ArrayJoinString -ArrayJoin:$ArrayJoin.IsPresent\n                    $null = $TextBuilder.Append(\"$OutputValue\")\n                }\n                $null = $TextBuilder.Append(\"}\")\n            }\n        } else {\n            $Value = $Value.ToString().Replace('\\', \"\\\\\").Replace('\"', '\\\"').Replace([System.Environment]::NewLine, $NewLineFormatProperty.NewLineCarriage).Replace(\"`n\", $NewLineFormatProperty.NewLine).Replace(\"`r\", $NewLineFormatProperty.Carriage)\n            \"`\"$Value`\"\"\n        }\n    }\n}"
  },
  {
    "path": "Private/Deprecated/ActiveDirectory/Add-WinADUserGroups.ps1",
    "content": "<#\nOutput of Get-ADPrincipalGroupmembership:\n\ndistinguishedName : CN=Organization Management,OU=Microsoft Exchange Security Groups,DC=ad,DC=evotec,DC=xyz\nGroupCategory     : Security\nGroupScope        : Universal\nname              : Organization Management\nobjectClass       : group\nobjectGUID        : 551c2400-f0d2-4aa6-8dbf-f9722ceb8675\nSamAccountName    : Organization Management\nSID               : S-1-5-21-853615985-2870445339-3163598659-1117\n\n#>\n\nfunction Add-WinADUserGroups {\n    <#\n    .SYNOPSIS\n    Adds a user to specified Active Directory groups.\n\n    .DESCRIPTION\n    This function adds a user to the specified Active Directory groups. It retrieves the user's current group memberships and adds the user to the specified groups if they are not already a member.\n\n    .PARAMETER User\n    The user object to add to the groups.\n\n    .PARAMETER Groups\n    An array of group names to add the user to.\n\n    .PARAMETER FieldSearch\n    The field to search for group names. Default is 'Name'.\n\n    .PARAMETER WhatIf\n    Specifies whether to perform a test run without making any changes.\n\n    .EXAMPLE\n    Add-WinADUserGroups -User $UserObject -Groups @(\"Group1\", \"Group2\")\n\n    Adds the user specified by $UserObject to the groups \"Group1\" and \"Group2\".\n\n    .EXAMPLE\n    Add-WinADUserGroups -User $UserObject -Groups @(\"Group1\", \"Group2\") -FieldSearch 'SamAccountName'\n\n    Adds the user specified by $UserObject to the groups \"Group1\" and \"Group2\" using 'SamAccountName' for group name search.\n\n    .NOTES\n    File Name      : Add-WinADUserGroups.ps1\n    Prerequisite   : Requires Active Directory module.\n    #>\n    [CmdletBinding()]\n    [alias(\"Add-ADUserGroups\")]\n    param(\n        [parameter(Mandatory = $true)][Object] $User,\n        [string[]] $Groups,\n        [string] $FieldSearch = 'Name',\n        [switch] $WhatIf\n    )\n    $Object = @()\n    try {\n        $ADgroups = Get-ADPrincipalGroupMembership -Identity $User.DistinguishedName | Where-Object {$_.Name -ne \"Domain Users\" }\n    } catch {\n        $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n        $Object += @{ Status = $false; Output = $Group.Name; Extended = $ErrorMessage }\n    }\n    if ($Groups) {\n        foreach ($Group in $Groups) {\n            if ($ADgroups.$FieldSearch -notcontains $Group) {\n                try {\n                    if (-not $WhatIf) {\n                        Add-ADGroupMember -Identity $Group -Members $User.DistinguishedName -ErrorAction Stop\n                    }\n                    $Object += @{ Status = $true; Output = $Group; Extended = 'Added to group.' }\n\n                } catch {\n                    $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n                    $Object += @{ Status = $false; Output = $Group; Extended = $ErrorMessage }\n                }\n            } else {\n                # Turned off to not clutter view, may required turning back on.\n                #$Object += @{ Status = $false; Output = $Group; Extended = 'Already exists.' }\n            }\n        }\n    }\n    return $Object\n}"
  },
  {
    "path": "Private/Deprecated/ActiveDirectory/Find-ADConnectServer.ps1",
    "content": "function Find-ADConnectServer {\n    <#\n    .SYNOPSIS\n    Finds and retrieves information about AD Connect servers based on user descriptions.\n\n    .DESCRIPTION\n    This function searches for AD Connect servers based on user descriptions containing specific patterns. It extracts server name, tenant name, installation ID, and type of account created.\n\n    .PARAMETER Description\n    Specifies the user description to search for AD Connect server information.\n\n    .EXAMPLE\n    Find-ADConnectServer -Description \"Account created by John Doe on computer Server1 to tenant Contoso. This is the installation identifier 12345 running on Server1 configured.\"\n\n    Retrieves information about the AD Connect server named Server1 with tenant Contoso, installation ID 12345, and account created by John Doe.\n\n    .NOTES\n    File Name      : Find-ADConnectServer.ps1\n    Prerequisite   : Requires Active Directory module.\n    #>\n    [alias('Find-ADSyncServer')]\n    param(\n\n    )\n    $Description = Get-ADUser -Filter { Name -like \"MSOL*\" } -Properties Description | Select-Object Description -ExpandProperty Description\n\n    foreach ($Desc in $Description) {\n        $PatternType = \"(?<=(Account created by ))(.*)(?=(with installation identifier))\"\n        $PatternServerName = \"(?<=(on computer ))(.*)(?=(configured))\"\n        $PatternTenantName = \"(?<=(to tenant ))(.*)(?=(. This))\"\n        $PatternInstallationID = \"(?<=(installation identifier ))(.*)(?=( running on ))\"\n        if ($Desc -match $PatternServerName) {\n            $ServerName = ($Matches[0]).Replace(\"'\", '').Replace(' ', '')\n\n            if ($Desc -match $PatternTenantName) {\n                $TenantName = ($Matches[0]).Replace(\"'\", '').Replace(' ', '')\n            } else {\n                $TenantName = ''\n            }\n            if ($Desc -match $PatternInstallationID) {\n                $InstallationID = ($Matches[0]).Replace(\"'\", '').Replace(' ', '')\n            } else {\n                $InstallationID = ''\n            }\n            if ($Desc -match $PatternType) {\n                $Type = ($Matches[0]).Replace(\"'\", '').Replace('by ', '').Replace('the ', '')\n            } else {\n                $Type = ''\n            }\n\n\n            $Data = Get-ADComputer -Identity $ServerName\n            [PSCustomObject] @{\n                Name              = $Data.Name\n                FQDN              = $Data.DNSHostName\n                DistinguishedName = $Data.DistinguishedName\n                Type              = $Type\n                TenantName        = $TenantName\n                InstallatioNID    = $InstallationID \n            }\n        }\n    }\n}"
  },
  {
    "path": "Private/Deprecated/ActiveDirectory/Find-ExchangeServer.ps1",
    "content": "function Find-ExchangeServer {\n    <#\n    .SYNOPSIS\n    Find Exchange Servers in Active Directory\n\n    .DESCRIPTION\n    Find Exchange Servers in Active Directory\n\n    .EXAMPLE\n    Find-ExchangeServer\n\n    .NOTES\n    General notes\n    #>\n    [CmdletBinding()]\n    param(\n\n    )\n    $ExchangeServers = Get-ADGroup -Identity \"Exchange Servers\"  \n    foreach ($Server in $ExchangeServers) {\n        $Data = Get-ADComputer -Identity $Server.SamAccountName -Properties Name, DNSHostName, OperatingSystem, DistinguishedName, ServicePrincipalName\n        [PSCustomObject] @{\n            Name              = $Data.Name\n            FQDN              = $Data.DNSHostName\n            OperatingSystem   = $Data.OperatingSystem\n            DistinguishedName = $Data.DistinguishedName\n            Enabled           = $Data.Enabled\n        }\n    }\n}"
  },
  {
    "path": "Private/Deprecated/ActiveDirectory/Find-HyperVServer.ps1",
    "content": "function Find-HyperVServer {\n    <#\n    .SYNOPSIS\n    Finds Hyper-V servers in Active Directory.\n\n    .DESCRIPTION\n    This function retrieves information about Hyper-V servers from Active Directory service connection points.\n\n    .EXAMPLE\n    Find-HyperVServer\n    Retrieves information about all Hyper-V servers in Active Directory.\n\n    #>          \n    [cmdletbinding()]            \n    param()            \n    try {            \n        $ADObjects = Get-ADObject -Filter 'ObjectClass -eq \"serviceConnectionPoint\" -and Name -eq \"Microsoft Hyper-V\"' -ErrorAction Stop            \n    } catch {            \n        Write-Error \"Error: $_\"            \n    }            \n    foreach ($Server in $ADObjects) {            \n        $Temporary = $Server.DistinguishedName.split(\",\")            \n        $DistinguishedName = $Temporary[1..$Temporary.Count] -join \",\"        \n        $Data = Get-ADComputer -Identity $DistinguishedName -Properties Name, DNSHostName, OperatingSystem, DistinguishedName, ServicePrincipalName       \n        [PSCustomObject] @{\n            Name              = $Data.Name\n            FQDN              = $Data.DNSHostName\n            OperatingSystem   = $Data.OperatingSystem\n            DistinguishedName = $Data.DistinguishedName\n            Enabled           = $Data.Enabled\n        }\n    }      \n}\n"
  },
  {
    "path": "Private/Deprecated/ActiveDirectory/Find-ServerTypes.ps1",
    "content": "\nfunction Find-ServerTypes {\n    <#\n    .SYNOPSIS\n    Finds different types of servers in the Active Directory forest.\n\n    .DESCRIPTION\n    This function retrieves information about different types of servers in the Active Directory forest based on the specified server types.\n\n    .PARAMETER Type\n    Specifies the type of servers to retrieve. Valid values are 'All', 'ADConnect', 'DomainController', 'Exchange', 'Hyper-V', 'RDSLicense', 'SQL', and 'VirtualMachine'.\n\n    .EXAMPLE\n    Find-ServerTypes -Type Exchange\n    Retrieves information about Exchange servers in the Active Directory forest.\n\n    .EXAMPLE\n    Find-ServerTypes -Type DomainController\n    Retrieves information about Domain Controller servers in the Active Directory forest.\n    #>\n    [cmdletbinding()]\n    param(\n        [string[]][ValidateSet('All', 'ADConnect', 'DomainController', 'Exchange', 'Hyper-V', 'RDSLicense', 'SQL', 'VirtualMachine')] $Type = 'All'\n    )\n    $Forest = Get-ADForest\n\n    foreach ($Domain in $Forest.Domains) {\n        try {\n            $DomainInformation = Get-ADDomain -Server $Domain -ErrorAction Stop\n        } catch {\n            Write-Warning \"Find-ServerTypes - Domain $Domain couldn't be reached. Skipping\"\n            continue\n        }\n\n        try {\n            $ServiceConnectionPoint = Get-ADObject -Filter 'ObjectClass -eq \"serviceConnectionPoint\"' -ErrorAction Stop -Server $Domain\n            foreach ($Point in $ServiceConnectionPoint) {  \n                $Temporary = $Point.DistinguishedName.split(\",\")            \n                $DistinguishedName = $Temporary[1..$Temporary.Count] -join \",\"    \n                $Point | Add-Member -MemberType 'NoteProperty' -Name 'DN' -Value $DistinguishedName -Force\n            }\n        } catch {\n            Write-Error \"Find-ServerTypes - Get-ADObject command failed. Terminating. Error $_\"\n            return\n        }\n\n        $ADConnect = Find-ADConnectServer\n        $Computers = Get-ADComputer -Filter * -Properties Name, DNSHostName, OperatingSystem, DistinguishedName, ServicePrincipalName -Server $Domain\n        $Servers = foreach ($Computer in $Computers) {\n            $Services = foreach ($Service in $Computer.servicePrincipalName) {\n                ($Service -split '/')[0]\n            }\n            [PSCustomObject] @{\n                Name                   = $Computer.Name\n                FQDN                   = $Computer.DNSHostName\n                OperatingSystem        = $Computer.OperatingSystem\n                DistinguishedName      = $Computer.DistinguishedName\n                Enabled                = $Computer.Enabled\n                IsExchange             = if ($Services -like '*ExchangeMDB*' -or $Services -like '*ExchangeRFR*') { $true } else { $false }\n                IsSql                  = if ($Services -like '*MSSql*') { $true } else { $false }\n                IsVM                   = if ($ServiceConnectionPoint.DN -eq $Computer.DistinguishedName -and $ServiceConnectionPoint.Name -eq 'Windows Virtual Machine') { $true } else { $false } \n                IsHyperV               = if ($Services -like '*Hyper-V Replica*') { $true } else { $false }\n                IsSPHyperV             = if ($ServiceConnectionPoint.DN -eq $Computer.DistinguishedName -and $ServiceConnectionPoint.Name -eq 'Microsoft Hyper-V') { $true } else { $false } \n                IsRDSLicense           = if ($ServiceConnectionPoint.DN -eq $Computer.DistinguishedName -and $ServiceConnectionPoint.Name -eq 'TermServLicensing') { $true } else { $false } \n                #IsDC                   = if ($Services -like '*ldap*' -and $Services -like '*DNS*') { $true } else { $false }\n                IsDC                   = if ($DomainInformation.ReplicaDirectoryServers -contains $Computer.DNSHostName) { $true } else { $false }  \n                IsADConnect            = if ($ADConnect.FQDN -eq $Computer.DNSHostName) { $true } else { $false }\n                Forest                 = $Forest.Name\n                Domain                 = $Domain\n                ServicePrincipalName   = ($Services | Sort-Object -Unique) -Join ','\n                ServiceConnectionPoint = ($ServiceConnectionPoint | Where-Object { $_.DN -eq $Computer.DistinguishedName }).Name -join ','\n            }\n        }\n        if ($Type -eq 'All') {\n            $Servers\n        } else {\n            if ($Type -contains 'SQL') {\n                $Servers | Where-Object { $_.IsSql -eq $true }\n            }\n            if ($Type -contains 'Exchange' ) {\n                $Servers | Where-Object { $_.IsExchange -eq $true } \n            }\n            if ($Type -contains 'Hyper-V') {\n                $Servers | Where-Object { $_.IsHyperV -eq $true -or $_.IsSPHyperV -eq $true } \n            }\n            if ($Type -contains 'VirtualMachine') {\n                $Servers | Where-Object { $_.IsVM -eq $true } \n            }\n            if ($Type -contains 'RDSLicense') {\n                $Servers | Where-Object { $_.IsRDSLicense -eq $true } \n            }\n            if ($Type -contains 'DomainController') {\n                $Servers | Where-Object { $_.IsDC -eq $true } \n            }\n            if ($Type -contains 'DomainController') {\n                $Servers | Where-Object { $_.IsDC -eq $true } \n            }\n            if ($Type -contains 'ADConnect') {\n                $Servers | Where-Object { $_.IsADConnect -eq $true } \n            }\n        }\n    }\n}"
  },
  {
    "path": "Private/Deprecated/ActiveDirectory/Find-UserProxyAddressesStatus.ps1",
    "content": "# not sure why I have it, or where it's used. Need to find out\nfunction Find-UsersProxyAddressesStatus {\n    <#\n    .SYNOPSIS\n    This function checks the status of user proxy addresses.\n\n    .DESCRIPTION\n    The function takes a user object as input and determines the status of their proxy addresses. It checks if the user has any proxy addresses, if the primary proxy address is missing, if there are multiple primary proxy addresses, or if all proxy addresses are correctly set up.\n\n    .PARAMETER User\n    Specifies the user object for which the proxy addresses status needs to be checked.\n\n    .EXAMPLE\n    Find-UsersProxyAddressesStatus -User $user\n    Checks the proxy addresses status for the specified user object.\n\n    .NOTES\n    File Name      : Find-UserProxyAddressesStatus.ps1\n    Prerequisite   : This function requires a valid user object with proxy addresses.\n    #>\n    param(\n        $User\n    )\n    $status = 'No proxy'\n    if ($null -ne $user.proxyAddresses) {\n        $count = 0\n        foreach ($proxy in $($user.ProxyAddresses)) {\n            if ($proxy.SubString(0, 4) -ceq 'SMTP') { $count++ }\n        }\n        if ($count -eq 0) {\n            $status = 'Missing primary proxy'\n        } elseif ($count -gt 1) {\n            $status = 'Multiple primary proxy'\n        } else {\n            $status = 'All OK'\n        }\n    } else {\n        $status = 'Missing all proxy'\n    }\n    return $status\n}"
  },
  {
    "path": "Private/Deprecated/ActiveDirectory/Get-ADAdministrativeGroups.ps1",
    "content": "﻿function Get-ADADministrativeGroups {\n    <#\n    .SYNOPSIS\n    Retrieves administrative groups information from Active Directory.\n\n    .DESCRIPTION\n    This function retrieves information about administrative groups in Active Directory based on the specified parameters.\n\n    .PARAMETER Type\n    Specifies the type of administrative groups to retrieve. Valid values are 'DomainAdmins' and 'EnterpriseAdmins'.\n\n    .PARAMETER Forest\n    Specifies the name of the forest to query for administrative groups.\n\n    .PARAMETER ExcludeDomains\n    Specifies an array of domains to exclude from the query.\n\n    .PARAMETER IncludeDomains\n    Specifies an array of domains to include in the query.\n\n    .PARAMETER ExtendedForestInformation\n    Specifies additional information about the forest to include in the query.\n\n    .EXAMPLE\n    Get-ADADministrativeGroups -Type DomainAdmins, EnterpriseAdmins\n\n    Output (Where VALUE is Get-ADGroup output):\n    Name                           Value\n    ----                           -----\n    ByNetBIOS                      {EVOTEC\\Domain Admins, EVOTEC\\Enterprise Admins, EVOTECPL\\Domain Admins}\n    ad.evotec.xyz                  {DomainAdmins, EnterpriseAdmins}\n    ad.evotec.pl                   {DomainAdmins}\n\n    .NOTES\n    This function requires Active Directory module to be installed on the system.\n    #>\n    [cmdletBinding()]\n    param(\n        [parameter(Mandatory)][validateSet('DomainAdmins', 'EnterpriseAdmins')][string[]] $Type,\n        [alias('ForestName')][string] $Forest,\n        [string[]] $ExcludeDomains,\n        [alias('Domain', 'Domains')][string[]] $IncludeDomains,\n        [System.Collections.IDictionary] $ExtendedForestInformation\n    )\n    $ADDictionary = [ordered] @{ }\n    $ADDictionary['ByNetBIOS'] = [ordered] @{ }\n    $ADDictionary['BySID'] = [ordered] @{ }\n\n    $ForestInformation = Get-WinADForestDetails -Forest $Forest -IncludeDomains $IncludeDomains -ExcludeDomains $ExcludeDomains -ExtendedForestInformation $ExtendedForestInformation\n    foreach ($Domain in $ForestInformation.Domains) {\n        $ADDictionary[$Domain] = [ordered] @{ }\n        $QueryServer = $ForestInformation['QueryServers'][$Domain]['HostName'][0]\n        $DomainInformation = Get-ADDomain -Server $QueryServer\n\n        if ($Type -contains 'DomainAdmins') {\n            Get-ADGroup -Filter \"SID -eq '$($DomainInformation.DomainSID)-512'\" -Server $QueryServer -ErrorAction SilentlyContinue | ForEach-Object {\n                $ADDictionary['ByNetBIOS'][\"$($DomainInformation.NetBIOSName)\\$($_.Name)\"] = $_\n                $ADDictionary[$Domain]['DomainAdmins'] = \"$($DomainInformation.NetBIOSName)\\$($_.Name)\"\n                $ADDictionary['BySID'][$_.SID.Value] = $_\n            }\n        }\n    }\n    # We need to treat EnterpriseAdmins separatly as it should be always available, not only when requested specific domain\n    foreach ($Domain in $ForestInformation.Forest.Domains) {\n        if (-not $ADDictionary[$Domain]) {\n            $ADDictionary[$Domain] = [ordered] @{ }\n        }\n        if ($Type -contains 'EnterpriseAdmins') {\n            $QueryServer = $ForestInformation['QueryServers'][$Domain]['HostName'][0]\n            $DomainInformation = Get-ADDomain -Server $QueryServer\n\n            Get-ADGroup -Filter \"SID -eq '$($DomainInformation.DomainSID)-519'\" -Server $QueryServer -ErrorAction SilentlyContinue | ForEach-Object {\n                $ADDictionary['ByNetBIOS'][\"$($DomainInformation.NetBIOSName)\\$($_.Name)\"] = $_\n                $ADDictionary[$Domain]['EnterpriseAdmins'] = \"$($DomainInformation.NetBIOSName)\\$($_.Name)\"\n                $ADDictionary['BySID'][$_.SID.Value] = $_ #\"$($DomainInformation.NetBIOSName)\\$($_.Name)\"\n            }\n        }\n    }\n    return $ADDictionary\n}\n\n#Get-WinADForestDetails -IncludeDomains 'ad.evotec.xyz'\n#Get-ADADministrativeGroups -Type DomainAdmins, EnterpriseAdmins -IncludeDomains 'ad.evotec.pl'"
  },
  {
    "path": "Private/Deprecated/ActiveDirectory/Get-WinADOrganizationalUnitData.ps1",
    "content": "function Get-WinADOrganizationalUnitData {\n    <#\n    .SYNOPSIS\n    Retrieves detailed information about Active Directory Organizational Units.\n\n    .DESCRIPTION\n    This function retrieves detailed information about the specified Active Directory Organizational Units, including properties like CanonicalName, City, Country, Description, and more.\n\n    .PARAMETER OrganizationalUnit\n    Specifies the Organizational Units to retrieve information for.\n\n    .EXAMPLE\n    Get-WinADOrganizationalUnitData -OrganizationalUnit 'OU=Users-O365,OU=Production,DC=ad,DC=evotec,DC=xyz'\n    Retrieves information for the specified Organizational Unit 'Users-O365' under 'Production' in the Active Directory domain 'ad.evotec.xyz'.\n\n    .NOTES\n    Output of function:\n        CanonicalName                   : ad.evotec.xyz/Production/Users-O365\n        City                            :\n        CN                              :\n        Country                         : PL\n        Created                         : 09.11.2018 17:38:32\n        Description                     : OU for Synchronization of Users to Office 365\n        DisplayName                     :\n        DistinguishedName               : OU=Users-O365,OU=Production,DC=ad,DC=evotec,DC=xyz\n        LinkedGroupPolicyObjects        : {cn={74D09C6F-35E9-4743-BCF7-F87D7010C60D},cn=policies,cn=system,DC=ad,DC=evotec,DC=xyz}\n        ManagedBy                       :\n        Modified                        : 19.11.2018 22:54:47\n        Name                            : Users-O365\n        PostalCode                      :\n        ProtectedFromAccidentalDeletion : True\n        State                           :\n        StreetAddress                   :\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string[]] $OrganizationalUnit\n    )\n    $Output = foreach ($OU in $OrganizationalUnit) {\n        $Data = Get-ADOrganizationalUnit -Identity $OU -Properties CanonicalName, City, CN, Country, Created, Description, DisplayName, DistinguishedName, ManagedBy, Modified, Name, OU, PostalCode, ProtectedFromAccidentalDeletion, State, StreetAddress\n\n        [PsCustomobject][Ordered] @{\n            CanonicalName                   = $Data.CanonicalName\n            City                            = $Data.City\n            CN                              = $Data.CN\n            Country                         = $Data.Country\n            Created                         = $Data.Created\n            Description                     = $Data.Description\n            DisplayName                     = $Data.DisplayName\n            DistinguishedName               = $Data.DistinguishedName\n            LinkedGroupPolicyObjects        = $Data.LinkedGroupPolicyObjects\n            ManagedBy                       = Get-WinADUsersByDN -DistinguishedName $U.ManagedBy\n            Modified                        = $Data.Modified\n            Name                            = $Data.Name\n            PostalCode                      = $Data.PostalCode\n            ProtectedFromAccidentalDeletion = $Data.ProtectedFromAccidentalDeletion\n            State                           = $Data.State\n            StreetAddress                   = $Data.StreetAddress\n        }\n    }\n    return $Output\n}"
  },
  {
    "path": "Private/Deprecated/ActiveDirectory/Get-WinADOrganizationalUnitFromDN.ps1",
    "content": "function Get-WinADOrganizationalUnitFromDN {\n    <#\n    .SYNOPSIS\n    This function extracts the Organizational Unit (OU) from a given Distinguished Name (DN).\n\n    .DESCRIPTION\n    This function takes a Distinguished Name (DN) as input and returns the Organizational Unit (OU) part of it.\n\n    .PARAMETER DistinguishedName\n    Specifies the Distinguished Name (DN) from which to extract the Organizational Unit (OU).\n\n    .EXAMPLE\n    Extract the Organizational Unit (OU) from a Distinguished Name.\n    \n    $DistinguishedName = 'CN=Przemyslaw Klys,OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz'\n    Get-WinADOrganizationalUnitFromDN -DistinguishedName $DistinguishedName\n\n    .NOTES\n    This function uses regular expressions to extract the Organizational Unit (OU) from the given Distinguished Name (DN).\n    #>\n    [CmdletBinding()]\n    param(\n        $DistinguishedName\n    )\n    return [Regex]::Match($DistinguishedName,'(?=OU)(.*\\n?)(?<=.)').Value\n}"
  },
  {
    "path": "Private/Deprecated/ActiveDirectory/Get-WinADUserSnapshot.ps1",
    "content": "function Get-WinADUserSnapshot {\n    <#\n    .SYNOPSIS\n    Retrieves a snapshot of Active Directory user information and saves it to an XML file.\n\n    .DESCRIPTION\n    The Get-WinADUserSnapshot function retrieves detailed information about an Active Directory user and saves it to an XML file specified by the XmlPath parameter.\n\n    .PARAMETER User\n    Specifies the Active Directory user object for which to retrieve the snapshot.\n\n    .PARAMETER XmlPath\n    Specifies the path where the XML snapshot file will be saved.\n\n    .PARAMETER WhatIf\n    Indicates whether the operation should only be simulated without actually saving the snapshot.\n\n    .EXAMPLE\n    Get-WinADUserSnapshot -User $userObject -XmlPath \"C:\\Snapshots\" -WhatIf\n    Retrieves a snapshot of the user object and simulates saving it to the specified path.\n\n    .EXAMPLE\n    Get-WinADUserSnapshot -User $userObject -XmlPath \"C:\\Snapshots\"\n    Retrieves a snapshot of the user object and saves it to the specified path.\n\n    #>\n    [CmdletBinding()]\n    [alias(\"Get-ADUserSnapshot\")]\n    param (\n        [parameter(Mandatory = $true)][Object] $User,\n        [string] $XmlPath,\n        [switch] $WhatIf\n    )\n    $Object = @()\n    try {\n        $FullData = Get-ADUser -Identity $User.DistinguishedName -Properties *\n        if (($XmlPath) -and (Test-Path $XmlPath)) {\n            $FullPath = [IO.Path]::Combine($XmlPath, \"$($User.SamAccountName).xml\") #\n            if (-not $WhatIf) {\n                $FullData | Export-Clixml -Path $FullPath -ErrorAction Stop\n            }\n            $Object += @{ Status = $true; Output = $User.SamAccountName; Extended = \"Saved to $FullPath\" }\n\n        } else {\n            $Object += @{ Status = $false; Output = $User.SamAccountName; Extended = 'XmlPath Incorrect' }\n        }\n    } catch {\n        $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n        $Object += @{ Status = $false; Output = $User.SamAccountName; Extended = $ErrorMessage }\n    }\n    return $Object\n}"
  },
  {
    "path": "Private/Deprecated/ActiveDirectory/Get-WinADUsersByOU.ps1",
    "content": "function Get-WinADUsersByOU {\n    <#\n    .SYNOPSIS\n    Retrieves Active Directory users within a specified Organizational Unit.\n\n    .DESCRIPTION\n    This function retrieves Active Directory users within the specified Organizational Unit.\n    \n    .PARAMETER OrganizationalUnit\n    Specifies the Organizational Unit from which to retrieve users.\n\n    .EXAMPLE\n    Get-WinADUsersByOU -OrganizationalUnit \"OU=Sales,DC=Contoso,DC=com\"\n    Retrieves all users within the Sales Organizational Unit in the Contoso domain.\n\n    #>\n    [CmdletBinding()]\n    param (\n        $OrganizationalUnit\n    )\n    $OU = Get-ADOrganizationalUnit $OrganizationalUnit\n    if ($OU.ObjectClass -eq 'OrganizationalUnit') {\n        try {\n            $Users = Get-ADUser -SearchBase $OU -Filter * -Properties $Script:UserProperties\n        } catch {\n            Write-Color @Script:WriteParameters -Text '[i]', ' One or more properties are invalid - Terminating', ' Terminating' -Color Yellow, White, Red\n            return\n        }\n    }\n    return $Users\n}"
  },
  {
    "path": "Private/Deprecated/ActiveDirectory/Get-WinADusersByDN.ps1",
    "content": "function Get-WinADUsersByDN {\n    <#\n    .SYNOPSIS\n    Retrieves Active Directory user information based on the provided DistinguishedName(s).\n\n    .DESCRIPTION\n    This function retrieves Active Directory user information based on the provided DistinguishedName(s). It returns specific user properties for the given DistinguishedName(s).\n\n    .PARAMETER DistinguishedName\n    Specifies the DistinguishedName(s) of the user(s) to retrieve information for.\n\n    .PARAMETER Field\n    Specifies the specific field to return for each user. Default value is 'DisplayName'.\n\n    .PARAMETER All\n    Indicates whether to return all properties of the user(s).\n\n    .EXAMPLE\n    Get-WinADUsersByDN -DistinguishedName \"CN=John Doe,OU=Users,DC=contoso,DC=com\"\n    Retrieves the DisplayName of the user with the specified DistinguishedName.\n\n    .EXAMPLE\n    Get-WinADUsersByDN -DistinguishedName \"CN=Jane Smith,OU=Users,DC=contoso,DC=com\" -Field \"EmailAddress\"\n    Retrieves the EmailAddress of the user with the specified DistinguishedName.\n\n    .EXAMPLE\n    Get-WinADUsersByDN -DistinguishedName \"CN=Admin,OU=Users,DC=contoso,DC=com\" -All\n    Retrieves all properties of the user with the specified DistinguishedName.\n\n    #>\n    param(\n        [alias('DN')][string[]]$DistinguishedName,\n        [string] $Field = 'DisplayName', # return field\n        [switch] $All\n    )\n    $Properties = 'DistinguishedName', 'Enabled', 'GivenName', 'Name', 'SamAccountName', 'SID', 'Surname', 'UserPrincipalName', 'EmailAddress', 'DisplayName'\n\n    $Users = foreach ($DN in $DistinguishedName) {\n        try {\n            get-aduser -Identity $DN -Properties $Properties\n        } catch {\n            # returns empty, basically ignores stuff\n        }\n    }\n\n    if ($All) {\n        return $Users #.PSObject.Properties.Name\n    } else {\n        return $Users.$Field\n    }\n}"
  },
  {
    "path": "Private/Deprecated/ActiveDirectory/Remove-WinADUserGroups.ps1",
    "content": "function Remove-WinADUserGroups {\n    <#\n    .SYNOPSIS\n    Removes specified Active Directory groups from a user.\n\n    .DESCRIPTION\n    This function removes specified Active Directory groups from a user account. It provides options to remove groups based on category, scope, or all groups.\n\n    .PARAMETER User\n    The user object from which groups will be removed.\n\n    .PARAMETER GroupCategory\n    Specifies the category of groups to remove. Valid values are \"Distribution\" and \"Security\".\n\n    .PARAMETER GroupScope\n    Specifies the scope of groups to remove. Valid values are \"DomainLocal\", \"Global\", and \"Universal\".\n\n    .PARAMETER Groups\n    An array of specific group names to remove.\n\n    .PARAMETER All\n    If specified, removes all groups from the user.\n\n    .PARAMETER WhatIf\n    Shows what would happen if the command runs without actually running it.\n\n    .EXAMPLE\n    Remove-WinADUserGroups -User $User -All\n    Removes all groups from the specified user account.\n\n    .EXAMPLE\n    Remove-WinADUserGroups -User $User -GroupCategory \"Security\" -GroupScope \"Global\"\n    Removes all security groups with a global scope from the specified user account.\n    #>\n    [CmdletBinding()]\n    [alias(\"Remove-ADUserGroups\")]\n    param(\n        [parameter(Mandatory = $true)][Object] $User,\n        [ValidateSet(\"Distribution\", \"Security\")][String] $GroupCategory ,\n        [ValidateSet(\"DomainLocal\", \"Global\", \"Universal\")][String] $GroupScope,\n        [string[]] $Groups,\n        [switch] $All,\n        [switch] $WhatIf\n    )\n    $Object = @()\n    try {\n        $ADgroups = Get-ADPrincipalGroupMembership -Identity $User.DistinguishedName -ErrorAction Stop | Where-Object { $_.Name -ne \"Domain Users\" }\n    } catch {\n        $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n        $Object += @{ Status = $false; Output = $Group.Name; Extended = $ErrorMessage }\n    }\n    if ($ADgroups) {\n        if ($All) {\n            #Write-Color @Script:WriteParameters -Text '[i]', ' Removing groups ', ($ADgroups.Name -join ', '), ' from user ', $User.DisplayName -Color White, Yellow, Green, White, Yellow\n            foreach ($Group in $ADgroups) {\n                try {\n                    if (-not $WhatIf) {\n                        Remove-ADPrincipalGroupMembership -Identity $User.DistinguishedName -MemberOf $Group -Confirm:$false -ErrorAction Stop\n                    }\n                    $Object += @{ Status = $true; Output = $Group.Name; Extended = 'Removed from group.' }\n                } catch {\n                    $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n                    $Object += @{ Status = $false; Output = $Group.Name; Extended = $ErrorMessage }\n                }\n            }\n        }\n        if ($GroupCategory) {\n            $ADGroupsByCategory = $ADgroups | Where-Object { $_.GroupCategory -eq $GroupCategory }\n            if ($ADGroupsByCategory) {\n                #Write-Color @Script:WriteParameters -Text '[i]', ' Removing groups (by category - ', $GroupCategory, \") \", ($ADGroupsByCategory.Name -join ', '), ' from user ', $User.DisplayName -Colo White, Yellow, Green, White, Yellow, White, Blue\n                foreach ($Group in $ADGroupsByCategory) {\n                    try {\n                        if (-not $WhatIf) {\n                            Remove-ADPrincipalGroupMembership -Identity $User.DistinguishedName -MemberOf $Group -Confirm:$false -ErrorAction Stop\n                        }\n                        $Object += @{ Status = $true; Output = $Group.Name; Extended = 'Removed from group.' }\n                    } catch {\n                        $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n                        $Object += @{ Status = $false; Output = $Group.Name; Extended = $ErrorMessage }\n                    }\n                }\n            }\n        }\n        if ($GroupScope) {\n            $ADGroupsByScope = $ADgroups | Where-Object { $_.GroupScope -eq $GroupScope }\n            if ($ADGroupsByScope) {\n                #Write-Color @Script:WriteParameters -Text '[i]', ' Removing groups (by scope ', \" - $GroupScope) \", ($ADGroupsByScope.Name -join ', '), ' from user ', $User.DisplayName -Color White, Yellow, Green, White, Yellow, White, Blue\n                foreach ($Group in $ADGroupsByScope) {\n                    try {\n                        if (-not $WhatIf) {\n                            Remove-ADPrincipalGroupMembership -Identity $User.DistinguishedName -MemberOf $Group -Confirm:$false -ErrorAction Stop\n                        }\n                        $Object += @{ Status = $true; Output = $Group.Name; Extended = 'Removed from group.' }\n                    } catch {\n                        $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n                        $Object += @{ Status = $false; Output = $Group.Name; Extended = $ErrorMessage }\n                    }\n                }\n            }\n        }\n        if ($Groups) {\n            foreach ($Group in $Groups) {\n                $ADGroupsByName = $ADgroups | Where-Object { $_.Name -like $Group }\n                if ($ADGroupsByName) {\n                    #Write-Color @Script:WriteParameters -Text '[i]', ' Removing groups (by name) ', ($ADGroupsByName.Name -join ', '), ' from user ', $User.DisplayName -Color White, Yellow, Green, White, Yellow, White, Yellow\n                    try {\n                        if (-not $WhatIf) {\n                            Remove-ADPrincipalGroupMembership -Identity $User.DistinguishedName -MemberOf $ADGroupsByName -Confirm:$false -ErrorAction Stop\n                        }\n                        $Object += @{ Status = $true; Output = $Group.Name; Extended = 'Removed from group.' }\n                    } catch {\n                        $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n                        $Object += @{ Status = $false; Output = $Group.Name; Extended = $ErrorMessage }\n                    }\n                } else {\n                    $Object += @{ Status = $false; Output = $Group.Name; Extended = 'Not available on user.' }\n                }\n            }\n        }\n    }\n    return $Object\n}\n"
  },
  {
    "path": "Private/Deprecated/ActiveDirectory/Set-WinADGroupSynchronization.ps1",
    "content": "<#\n\n$Group1 = 'GDS-TestGroup1'\n$Group2 = 'GDS-TestGroup2'\n\nSet-WinADGroupSynchronization -GroupFrom $Group1 -GroupTo $Group2 -Type 'All' -Recursive None\n#>\n\nfunction Set-WinADGroupSynchronization {\n    <#\n    .SYNOPSIS\n    Sets up synchronization between two Active Directory groups.\n\n    .DESCRIPTION\n    This function sets up synchronization between two Active Directory groups by copying members from one group to another based on specified criteria.\n\n    .PARAMETER GroupFrom\n    The name of the source Active Directory group from which members will be synchronized.\n\n    .PARAMETER GroupTo\n    The name of the target Active Directory group to which members will be synchronized.\n\n    .PARAMETER Type\n    Specifies the type of members to synchronize. Valid values are 'User', 'Group', or 'All'. Default is 'User'.\n\n    .PARAMETER Recursive\n    Specifies the type of synchronization to perform. Valid values are 'None', 'RecursiveFrom', 'RecursiveBoth', or 'RecursiveTo'. Default is 'None'.\n\n    .PARAMETER WhatIf\n    Shows what would happen if the synchronization is performed without actually performing it.\n\n    .EXAMPLE\n    Set-WinADGroupSynchronization -GroupFrom 'GDS-TestGroup1' -GroupTo 'GDS-TestGroup2' -Type 'All' -Recursive None\n    Synchronizes all members from 'GDS-TestGroup1' to 'GDS-TestGroup2' without recursion.\n\n    .EXAMPLE\n    Set-WinADGroupSynchronization -GroupFrom 'GDS-TestGroup1' -GroupTo 'GDS-TestGroup2' -Type 'User' -Recursive RecursiveBoth\n    Synchronizes only user members from 'GDS-TestGroup1' to 'GDS-TestGroup2' with recursion in both groups.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [parameter(Mandatory = $true)][string] $GroupFrom,\n        [parameter(Mandatory = $true)][string] $GroupTo,\n        [parameter(Mandatory = $false)][ValidateSet(\"User\", \"Group\", \"All\")][string] $Type = 'User',\n        [parameter(Mandatory = $false)][ValidateSet(\"None\", \"RecursiveFrom\", \"RecursiveBoth\", \"RecursiveTo\")] $Recursive = 'None',\n        [switch] $WhatIf\n    )\n    Begin {\n        $Object = @()\n        if ($Recursive -eq 'None') {\n            $GroupFromRecursive = $false\n            $GroupToRecursive = $false\n        } elseif ($Recursive -eq 'RecursiveFrom') {\n            $GroupFromRecursive = $true\n            $GroupToRecursive = $false\n        } elseif ($Recursive -eq 'RecursiveBoth') {\n            $GroupFromRecursive = $true\n            $GroupToRecursive = $true\n        } else {\n            $GroupFromRecursive = $false\n            $GroupToRecursive = $true\n        }\n    }\n    Process {\n        try {\n\n            $GroupMembersFrom = Get-ADGroupMember -Identity $GroupFrom -Recursive:$GroupFromRecursive | Select-Object Name, ObjectClass, SamAccountName, UserPrincipalName\n        } catch {\n            $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n            $Object += @{ Status = $false; Output = $Group.Name; Extended = $ErrorMessage }\n        }\n        try {\n            $GroupMembersTo = Get-ADGroupMember -Identity $GroupTo -Recursive:$GroupToRecursive | Select-Object Name, ObjectClass, SamAccountName, UserPrincipalName\n        } catch {\n            $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n            $Object += @{ Status = $false; Output = $Group.Name; Extended = $ErrorMessage }\n        }\n        if ($Object.Count -gt 0) {\n            # Something went seriously wrong. Terminate ASAP\n            return $Object\n        }\n\n        foreach ($User in $GroupMembersFrom) {\n            if ($User.ObjectClass -eq \"user\") {\n                if ($Type -eq 'User' -or $Type -eq 'All') {\n                    if ($GroupMembersTo.SamAccountName -notcontains $User.SamAccountName) {\n                        #Write-Color \"Not a member \", $User.SamAccountName, \" of $GroupTo\", \". Adding!\" -Color Red -LogFile $LogFile\n                        try {\n                            if (-not $WhatIf) {\n                            Add-ADGroupMember -Identity $GroupTo -Members $User.SamAccountName\n                            }\n                            $Object += @{ Status = $true; Output = $User.SamAccountName; Extended = \"Added to group $GroupTo\" }\n                        } catch {\n                            $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n                            $Object += @{ Status = $false; Output = $Group.Name; Extended = $ErrorMessage }\n                        }\n                    }\n                }\n            } else {\n                if ($Type -eq 'Group' -or $Type -eq 'All') {\n                    if ($GroupMembersTo.SamAccountName -notcontains $User.SamAccountName) {\n                        #Write-Color \"Not a member \", $User.SamAccountName, \" of $GroupTo\", \". Adding!\" -Color Red -LogFile $LogFile\n                        try {\n                            if (-not $WhatIf) {\n                            Add-ADGroupMember -Identity $GroupTo -Members $User.SamAccountName\n                            }\n                            $Object += @{ Status = $true; Output = $User.SamAccountName; Extended = \"Added to group $GroupTo\" }\n                        } catch {\n                            $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n                            $Object += @{ Status = $false; Output = $Group.Name; Extended = $ErrorMessage }\n                        }\n                    }\n                }\n            }\n        }\n        foreach ($User in $GroupMembersTo) {\n            if ($User.ObjectClass -eq \"user\") {\n                if ($Type -eq 'User' -or $Type -eq 'All') {\n                    if ($GroupMembersFrom.SamAccountName -notcontains $User.SamAccountName) {\n                        Write-Color \"Not a member of $GroupFrom - requires removal from $GroupTo \", $User.SamAccountName -Color Red -LogFile $LogFile\n                        try {\n                            if (-not $WhatIf) {\n                            Remove-ADGroupMember -Identity $GroupTo -Members $User.SamAccountName -Confirm:$false\n                            }\n                            $Object += @{ Status = $true; Output = $User.SamAccountName; Extended = \"Removed from group $GroupTo\" }\n                        } catch {\n                            $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n                            $Object += @{ Status = $false; Output = $Group.Name; Extended = $ErrorMessage }\n                        }\n                    }\n                }\n            } else {\n                if ($Type -eq 'Group' -or $Type -eq 'All') {\n                    if ($GroupMembersFrom.SamAccountName -notcontains $User.SamAccountName) {\n                        Write-Color \"Not a member of $GroupFrom - requires removal from $GroupTo \", $User.SamAccountName -Color Red -LogFile $LogFile\n                        try {\n                            if (-not $WhatIf) {\n                            Remove-ADGroupMember -Identity $GroupTo -Members $User.SamAccountName -Confirm:$false\n                            }\n                            $Object += @{ Status = $true; Output = $User.SamAccountName; Extended = \"Removed from group $GroupTo\" }\n                        } catch {\n                            $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n                            $Object += @{ Status = $false; Output = $Group.Name; Extended = $ErrorMessage }\n                        }\n                    }\n                }\n            }\n        }\n    }\n    End {\n        return $object\n    }\n}"
  },
  {
    "path": "Private/Deprecated/ActiveDirectory/Set-WinADUserFields.ps1",
    "content": "function Set-WinADUserFields {\n    <#\n    .SYNOPSIS\n    Sets specified fields for an Active Directory user with additional options.\n\n    .DESCRIPTION\n    This function allows setting specified fields for an Active Directory user with the option to add text before or after the existing field value.\n\n    .PARAMETER User\n    Specifies the Active Directory user object to modify.\n\n    .PARAMETER Option\n    Specifies whether to add the text before or after the existing field value. Valid values are 'Before' and 'After'.\n\n    .PARAMETER TextToAdd\n    Specifies the text to add before or after the existing field value.\n\n    .PARAMETER TextToRemove\n    Specifies the text to remove from the existing field value.\n\n    .PARAMETER Fields\n    Specifies an array of fields to modify for the user.\n\n    .PARAMETER WhatIf\n    Indicates that the cmdlet should display what changes would occur without actually making any changes.\n\n    .EXAMPLE\n    Set-WinADUserFields -User $user -Option 'After' -TextToAdd 'New' -Fields 'Name'\n    Adds the text 'New' after the existing 'Name' field value for the specified user.\n\n    .EXAMPLE\n    Set-WinADUserFields -User $user -Option 'Before' -TextToAdd 'Old' -Fields 'Description'\n    Adds the text 'Old' before the existing 'Description' field value for the specified user.\n    #>\n    [CmdletBinding()]\n    [alias(\"Set-ADUserName\")]\n    param (\n        [parameter(Mandatory = $true)][Object] $User,\n        [parameter(Mandatory = $false)][ValidateSet(\"Before\", \"After\")][String] $Option,\n        [string] $TextToAdd,\n        [string] $TextToRemove,\n        [string[]] $Fields,\n        [switch] $WhatIf\n    )\n    $Object = @()\n    if ($TextToAdd) {\n        foreach ($Field in $Fields) {\n            if ($User.$Field -notlike \"*$TextToAdd*\") {\n\n                if ($Option -eq 'After') {\n                    $NewName = \"$($User.$Field)$TextToAdd\"\n                } elseif ($Option -eq 'Before') {\n                    $NewName = \"$TextToAdd$($User.\"$Field\")\"\n                }\n                if ($NewName -ne $User.$Field) {\n                    if ($Field -eq 'Name') {\n                        try {\n                            if (-not $WhatIf) {\n                                Rename-ADObject -Identity $User.DistinguishedName -NewName $NewName #-WhatIf\n                            }\n                            $Object += @{ Status = $true; Output = $User.SamAccountName; Extended = \"Renamed account '$Field' to '$NewName'\" }\n\n                        } catch {\n                            $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n                            $Object += @{ Status = $false; Output = $User.SamAccountName; Extended = $ErrorMessage }\n                        }\n                    } else {\n                        $Splat = @{\n                            Identity = $User.DistinguishedName\n                            \"$Field\" = $NewName\n                        }\n                        try {\n                            if (-not $WhatIf) {\n                                Set-ADUser @Splat\n                            }\n                            $Object += @{ Status = $true; Output = $User.SamAccountName; Extended = \"Renamed field '$Field' to '$NewName'\" }\n\n                        } catch {\n                            $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n                            $Object += @{ Status = $false; Output = $User.SamAccountName; Extended = $ErrorMessage }\n                        }\n                    }\n\n\n                }\n\n            }\n        }\n    }\n    if ($TextToRemove) {\n        foreach ($Field in $Fields) {\n            if ($User.$Field -like \"*$TextToRemove*\") {\n                $NewName = $($User.$Field).Replace($TextToRemove, '')\n                if ($Field -eq 'Name') {\n                    try {\n                        if (-not $WhatIf) {\n                            Rename-ADObject -Identity $User.DistinguishedName -NewName $NewName #-WhatIf\n                        }\n                        $Object += @{ Status = $true; Output = $User.SamAccountName; Extended = \"Renamed account '$Field' to '$NewName'\" }\n\n                    } catch {\n                        $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n                        $Object += @{ Status = $false; Output = $User.SamAccountName; Extended = \"Field: '$Field' Error: '$ErrorMessage'\" }\n                    }\n                } else {\n                    $Splat = @{\n                        Identity = $User.DistinguishedName\n                        \"$Field\" = $NewName\n                    }\n                    try {\n                        if (-not $WhatIf) {\n                            Set-ADUser @Splat #-WhatIf\n                        }\n                        $Object += @{ Status = $true; Output = $User.SamAccountName; Extended = \"Renamed field $Field to $NewName\" }\n\n                    } catch {\n                        $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n                        $Object += @{ Status = $false; Output = $User.SamAccountName; Extended = \"Field: $Field Error: $ErrorMessage\" }\n                    }\n                }\n            }\n        }\n\n    }\n    return $Object\n}"
  },
  {
    "path": "Private/Deprecated/ActiveDirectory/Set-WinADUserSettingGAL.ps1",
    "content": "Function Set-WinADUserSettingGAL {\n    <#\n    .SYNOPSIS\n    Sets the Exchange Global Address List (GAL) visibility for a specified user.\n\n    .DESCRIPTION\n    This function allows you to hide or show a user in the Global Address List (GAL) of Exchange. \n    It updates the msExchHideFromAddressLists attribute of the user object in Active Directory.\n\n    .PARAMETER User\n    Specifies the user object for which the GAL visibility needs to be set.\n\n    .PARAMETER Option\n    Specifies whether to 'Hide' or 'Show' the user in the GAL.\n\n    .PARAMETER WhatIf\n    Displays what would happen if the command runs without actually running the command.\n\n    .EXAMPLE\n    Set-WinADUserSettingGAL -User \"JohnDoe\" -Option \"Hide\"\n    Hides the user \"JohnDoe\" from the Global Address List.\n\n    .EXAMPLE\n    Set-WinADUserSettingGAL -User \"JaneSmith\" -Option \"Show\"\n    Shows the user \"JaneSmith\" in the Global Address List.\n\n    #>\n    [CmdletBinding()]\n    [alias(\"Set-ADUserSettingGAL\")]\n    param (\n        [parameter(Mandatory = $true)][Object] $User,\n        [parameter(Mandatory = $true)][ValidateSet(\"Hide\", \"Show\")][String]$Option,\n        [switch] $WhatIf\n    )\n    $Object = @()\n    if ($User) {\n        if ($Option -eq 'Hide') {\n            if (-not $User.msExchHideFromAddressLists) {\n                #Write-Color @Script:WriteParameters -Text '[i]', ' Hiding user ', $User.DisplayName, ' in GAL (Exchange Address Lists)' -Color White, Yellow, Green, White, Yellow\n                try {\n                    if (-not $WhatIf) {\n                        Set-ADObject -Identity $User.DistinguishedName -Replace @{msExchHideFromAddressLists = $true}\n                    }\n                    $Object += @{ Status = $true; Output = $User.SamAccountName; Extended = 'Hidden from GAL.' }\n                } catch {\n                    $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n                    $Object += @{ Status = $false; Output = $User.SamAccountName; Extended = $ErrorMessage }\n                }\n            }\n        } elseif ($Option -eq 'Show') {\n            if ($User.msExchHideFromAddressLists) {\n                #Write-Color @Script:WriteParameters -Text '[i]', ' Unhiding user ', $User.DisplayName, ' in GAL (Exchange Address Lists)' -Color White, Yellow, Green, White, Yellow\n                try {\n                    if ($WhatIf) {\n                        Set-ADObject -Identity $User.DistinguishedName -Clear msExchHideFromAddressLists\n                    }\n                    $Object += @{ Status = $true; Output = $User.SamAccountName; Extended = 'Unhidden in GAL.' }\n                } catch {\n                    $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n                    $Object += @{ Status = $false; Output = $User.SamAccountName; Extended = $ErrorMessage }\n                }\n            }\n        }\n    }\n    return $Object\n}"
  },
  {
    "path": "Private/Deprecated/ActiveDirectory/Set-WinADUserStatus.ps1",
    "content": "function Set-WinADUserStatus {\n    <#\n    .SYNOPSIS\n    Enables or disables a user account in Active Directory.\n\n    .DESCRIPTION\n    The Set-WinADUserStatus function enables or disables a specified user account in Active Directory based on the provided option. It also provides an option to simulate the action using the WhatIf switch.\n\n    .PARAMETER User\n    Specifies the user account to enable or disable.\n\n    .PARAMETER Option\n    Specifies whether to enable or disable the user account. Valid values are \"Enable\" or \"Disable\".\n\n    .PARAMETER WhatIf\n    Indicates that the cmdlet should display what would happen if it were to run, without actually performing any action.\n\n    .EXAMPLE\n    Set-WinADUserStatus -User $user -Option \"Enable\"\n    Enables the user account specified by $user in Active Directory.\n\n    .EXAMPLE\n    Set-WinADUserStatus -User $user -Option \"Disable\" -WhatIf\n    Displays what would happen if the user account specified by $user were to be disabled in Active Directory, without actually disabling it.\n\n    #>\n    [CmdletBinding()]\n    [alias(\"Set-ADUserStatus\")]\n    param (\n        [parameter(Mandatory = $true)][Object] $User,\n        [parameter(Mandatory = $true)][ValidateSet(\"Enable\", \"Disable\")][String] $Option,\n        [switch] $WhatIf\n        # $WriteParameters\n    )\n    $Object = @()\n    if ($Option -eq 'Enable' -and $User.Enabled -eq $false) {\n        #if (-not $WriteParameters) {\n        #    Write-Color @Script:WriteParameters -Text 'Enabling user ', $User.DisplayName, ' in Active Directory.' -Color Yellow, Green, White, Yellow\n        #} else {\n        #    Write-Color @WriteParameters\n        #}\n        try {\n            if (-not $WhatIf) {\n                Set-ADUser -Identity $User.DistinguishedName -Enabled $true\n            }\n            $Object += @{ Status = $true; Output = $User.SamAccountName; Extended = 'Enabled user.' }\n        } catch {\n            $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n            $Object += @{ Status = $false; Output = $User.SamAccountName; Extended = $ErrorMessage }\n        }\n    } elseif ($Option -eq 'Disable' -and $User.Enabled -eq $true) {\n        #if (-not $WriteParameters) {\n        #    Write-Color @Script:WriteParameters -Text 'Disabling user ', $User.DisplayName, 'in Active Directory.' -Color Yellow, Green, White, Yellow\n        #} else {\n        #    Write-Color @WriteParameters\n        #}\n        try {\n            if (-not $WhatIf) {\n                Set-ADUser -Identity $User.DistinguishedName -Enabled $false\n            }\n            $Object += @{ Status = $true; Output = $User.SamAccountName; Extended = 'Disabled user.' }\n\n        } catch {\n            $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n            $Object += @{ Status = $false; Output = $User.SamAccountName; Extended = $ErrorMessage }\n        }\n    }\n    return $Object\n}"
  },
  {
    "path": "Private/Deprecated/Dates/Find-DatesCurrentDayMinusDayX.ps1",
    "content": "function Find-DatesCurrentDayMinusDayX ($days) {\n    <#\n    .SYNOPSIS\n    Finds the date range for the current day minus a specified number of days.\n\n    .DESCRIPTION\n    This function calculates the start and end dates for the current day minus a specified number of days.\n\n    .PARAMETER days\n    Specifies the number of days to subtract from the current day.\n\n    .EXAMPLE\n    Find-DatesCurrentDayMinusDayX -days 1\n    Returns the date range for yesterday.\n\n    .EXAMPLE\n    Find-DatesCurrentDayMinusDayX -days 7\n    Returns the date range for a week ago.\n\n    #>\n    $DateTodayStart = (Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0).AddDays( - $Days)\n    $DateTodayEnd = (Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0).AddDays(1).AddDays( - $Days).AddMilliseconds(-1)\n\n    $DateParameters = @{\n        DateFrom = $DateTodayStart\n        DateTo   = $DateTodayEnd\n    }\n    return $DateParameters\n}"
  },
  {
    "path": "Private/Deprecated/Dates/Find-DatesCurrentDayMinuxDaysX.ps1",
    "content": "function Find-DatesCurrentDayMinuxDaysX ($days) {\n    <#\n    .SYNOPSIS\n    Finds the date range for the current day minus a specified number of days.\n\n    .DESCRIPTION\n    This function calculates the start and end dates for the current day minus a specified number of days.\n\n    .PARAMETER days\n    Specifies the number of days to subtract from the current day.\n\n    .EXAMPLE\n    Find-DatesCurrentDayMinuxDaysX -days 1\n    Returns the date range for yesterday.\n\n    .EXAMPLE\n    Find-DatesCurrentDayMinuxDaysX -days 7\n    Returns the date range for a week ago.\n    #>\n    $DateTodayStart = (Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0).AddDays( - $Days)\n    $DateTodayEnd = (Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0).AddDays(1).AddMilliseconds(-1)\n\n    $DateParameters = @{\n        DateFrom = $DateTodayStart\n        DateTo   = $DateTodayEnd\n    }\n    return $DateParameters\n}"
  },
  {
    "path": "Private/Deprecated/Dates/Find-DatesCurrentHour.ps1",
    "content": "function Find-DatesCurrentHour () {\n    <#\n    .SYNOPSIS\n    Finds the start and end dates for the current hour.\n\n    .DESCRIPTION\n    This function calculates the start and end dates for the current hour.\n\n    .EXAMPLE\n    PS C:\\> Find-DatesCurrentHour\n    DateFrom                     DateTo\n    --------                     ------\n    10/20/2021 12:00:00 AM       10/20/2021 1:00:00 AM\n    #>\n    $DateTodayStart = (Get-Date -Minute 0 -Second 0 -Millisecond 0)\n    $DateTodayEnd = $DateTodayStart.AddHours(1)\n\n    $DateParameters = @{\n        DateFrom = $DateTodayStart\n        DateTo   = $DateTodayEnd\n    }\n    return $DateParameters\n}"
  },
  {
    "path": "Private/Deprecated/Dates/Find-DatesDayPrevious.ps1",
    "content": "function Find-DatesDayPrevious () {\n    <#\n    .SYNOPSIS\n    Finds the date parameters for the previous day.\n\n    .DESCRIPTION\n    This function calculates the date parameters for the previous day based on the current date.\n\n    .EXAMPLE\n    Find-DatesDayPrevious\n    Returns the date parameters for the previous day.\n\n    #>\n    $DateToday = (GET-DATE).Date\n    $DateYesterday = $DateToday.AddDays(-1)\n\n    $DateParameters = @{\n        DateFrom = $DateYesterday\n        DateTo   = $dateToday\n    }\n    return $DateParameters\n}"
  },
  {
    "path": "Private/Deprecated/Dates/Find-DatesDayToday.ps1",
    "content": "function Find-DatesDayToday () {\n    <#\n    .SYNOPSIS\n    Finds the start and end dates of the current day.\n\n    .DESCRIPTION\n    This function calculates the start and end dates of the current day based on the current date.\n    #>\n    $DateToday = (GET-DATE).Date\n    $DateTodayEnd = $DateToday.AddDays(1).AddSeconds(-1)\n\n    $DateParameters = @{\n        DateFrom = $DateToday\n        DateTo   = $DateTodayEnd\n    }\n    return $DateParameters\n}"
  },
  {
    "path": "Private/Deprecated/Dates/Find-DatesMonthCurrent.ps1",
    "content": "function Find-DatesMonthCurrent () {\n    <#\n    .SYNOPSIS\n    Finds the start and end dates of the current month.\n\n    .DESCRIPTION\n    This function calculates the start and end dates of the current month based on the current date.\n\n    .EXAMPLE\n    Find-DatesMonthCurrent\n    Returns the start and end dates of the current month.\n\n    #>\n    $DateMonthFirstDay = (GET-DATE -Day 1).Date\n    $DateMonthLastDay = GET-DATE $DateMonthFirstDay.AddMonths(1).AddSeconds(-1)\n\n    $DateParameters = @{\n        DateFrom = $DateMonthFirstDay\n        DateTo   = $DateMonthLastDay\n    }\n    return $DateParameters\n}"
  },
  {
    "path": "Private/Deprecated/Dates/Find-DatesMonthPast.ps1",
    "content": "function Find-DatesMonthPast ([bool] $Force) {\n    <#\n    .SYNOPSIS\n    Finds the dates for the previous month based on the current date.\n\n    .DESCRIPTION\n    This function calculates the date range for the previous month based on the current date. It returns the start and end dates of the previous month.\n\n    .PARAMETER Force\n    If set to $true, the function will always return the date range for the previous month, regardless of the current date.\n\n    .EXAMPLE\n    Find-DatesMonthPast -Force $false\n    Returns $null if the current date is not the first day of the month.\n\n    .EXAMPLE\n    Find-DatesMonthPast -Force $true\n    Returns the date range for the previous month even if the current date is not the first day of the month.\n    #>\n    $DateToday = (Get-Date).Date\n    $DateMonthFirstDay = (GET-DATE -Day 1).Date\n    $DateMonthPreviousFirstDay = $DateMonthFirstDay.AddMonths(-1)\n\n    if ($Force -eq $true -or $DateToday -eq $DateMonthFirstDay) {\n        $DateParameters = @{\n            DateFrom = $DateMonthPreviousFirstDay\n            DateTo   = $DateMonthFirstDay\n        }\n        return $DateParameters\n    } else {\n        return $null\n    }\n}"
  },
  {
    "path": "Private/Deprecated/Dates/Find-DatesPastHour.ps1",
    "content": "function Find-DatesPastHour () {\n    <#\n    .SYNOPSIS\n    Finds the date range for the past hour.\n\n    .DESCRIPTION\n    This function calculates the date range for the past hour, starting from the beginning of the previous hour up to the current hour.\n\n    .EXAMPLE\n    Find-DatesPastHour\n    Returns a hashtable with DateFrom and DateTo keys representing the date range for the past hour.\n\n    #>\n    $DateTodayEnd = Get-Date -Minute 0 -Second 0 -Millisecond 0\n    $DateTodayStart = $DateTodayEnd.AddHours(-1)\n\n    $DateParameters = @{\n        DateFrom = $DateTodayStart\n        DateTo   = $DateTodayEnd\n    }\n    return $DateParameters\n}"
  },
  {
    "path": "Private/Deprecated/Dates/Find-DatesPastWeek.ps1",
    "content": "function Find-DatesPastWeek($DayName) {\n    <#\n    .SYNOPSIS\n    Finds the date range for the past week based on the specified day.\n\n    .DESCRIPTION\n    This function calculates the date range for the past week based on the specified day of the week.\n\n    .PARAMETER DayName\n    The day of the week to use as a reference for finding the past week's date range.\n\n    .EXAMPLE\n    Find-DatesPastWeek -DayName \"Monday\"\n    Returns the date range for the past week starting from the previous Monday.\n\n    .EXAMPLE\n    Find-DatesPastWeek -DayName \"Friday\"\n    Returns the date range for the past week starting from the previous Friday.\n\n    #>\n    $DateTodayStart = Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0\n    if ($DateTodayStart.DayOfWeek -ne $DayName) {\n        return $null\n    }\n    $DateTodayEnd = (Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0).AddDays(-7)\n    $DateParameters = @{\n        DateFrom = $DateTodayEnd\n        DateTo   = $DateTodayStart\n    }\n    return $DateParameters\n\n}"
  },
  {
    "path": "Private/Deprecated/Dates/Find-DatesQuarterCurrent.ps1",
    "content": "function Find-DatesQuarterCurrent ([bool] $Force) {\n    <#\n    .SYNOPSIS\n    Finds the start and end dates of the current quarter.\n\n    .DESCRIPTION\n    This function calculates the start and end dates of the current quarter based on the current date.\n\n    .PARAMETER Force\n    If set to $true, forces the function to recalculate the dates even if they have been previously calculated.\n\n    .EXAMPLE\n    Find-DatesQuarterCurrent -Force $false\n    Returns the start and end dates of the current quarter without recalculating if already calculated.\n\n    .EXAMPLE\n    Find-DatesQuarterCurrent -Force $true\n    Forces the function to recalculate and returns the start and end dates of the current quarter.\n\n    #>\n    $Today = (Get-Date)\n    $Quarter = [Math]::Ceiling($Today.Month / 3)\n    $LastDay = [DateTime]::DaysInMonth([Int]$Today.Year.ToString(), [Int]($Quarter * 3))\n    $StartDate = (get-date -Year $Today.Year -Month ($Quarter * 3 - 2) -Day 1).Date\n    $EndDate = (get-date -Year $Today.Year -Month ($Quarter * 3) -Day $LastDay).Date.AddDays(1).AddTicks(-1)\n    $DateParameters = @{\n        DateFrom = $StartDate\n        DateTo   = $EndDate\n    }\n    return $DateParameters\n}"
  },
  {
    "path": "Private/Deprecated/Dates/Find-DatesQuarterLast.ps1",
    "content": "function Find-DatesQuarterLast ([bool] $Force) {\n    <#\n    .SYNOPSIS\n    Finds the start and end dates of the last quarter.\n\n    .DESCRIPTION\n    This function calculates the start and end dates of the last quarter based on the current date or a specified date.\n\n    .PARAMETER Force\n    If set to $true, forces the function to return the last quarter dates even if they were previously retrieved.\n\n    .EXAMPLE\n    Find-DatesQuarterLast -Force\n    Returns the start and end dates of the last quarter regardless of previous retrieval.\n\n    .EXAMPLE\n    Find-DatesQuarterLast -Force $false\n    Returns $null if the last quarter dates were already retrieved.\n\n    #>\n    #https://blogs.technet.microsoft.com/dsheehan/2017/09/21/use-powershell-to-determine-the-first-day-of-the-current-calendar-quarter/\n    $Today = (Get-Date).AddDays(-90)\n    $Yesterday = ((Get-Date).AddDays(-1))\n    $Quarter = [Math]::Ceiling($Today.Month / 3)\n    $LastDay = [DateTime]::DaysInMonth([Int]$Today.Year.ToString(), [Int]($Quarter * 3))\n    $StartDate = (get-date -Year $Today.Year -Month ($Quarter * 3 - 2) -Day 1).Date\n    $EndDate = (get-date -Year $Today.Year -Month ($Quarter * 3) -Day $LastDay).Date.AddDays(1).AddTicks(-1)\n\n    if ($Force -eq $true -or $Yesterday.Date -eq $EndDate.Date) {\n        $DateParameters = @{\n            DateFrom = $StartDate\n            DateTo   = $EndDate\n        }\n        return $DateParameters\n    } else {\n        return $null\n    }\n}"
  },
  {
    "path": "Private/Deprecated/Email/Get-HTML.ps1",
    "content": "function Get-HTML {\n    <#\n    .SYNOPSIS\n    Splits the input text by carriage return and outputs each line.\n\n    .DESCRIPTION\n    This function takes a string input and splits it by carriage return (`r) to output each line separately.\n\n    .PARAMETER text\n    The input text to be split and displayed line by line.\n\n    .EXAMPLE\n    Get-HTML -text \"Line 1`rLine 2`rLine 3\"\n    This example splits the input text by carriage return and outputs each line separately.\n\n    #>\n    [CmdletBinding()]\n    param (\n        [string] $text\n    )\n    $text = $text.Split(\"`r\")\n    foreach ($t in $text) {\n        Write-Host $t\n    }\n}"
  },
  {
    "path": "Private/Deprecated/Email/Send-Email.ps1",
    "content": "function Send-Email {\n    <#\n    .SYNOPSIS\n    Sends an email with specified parameters.\n\n    .DESCRIPTION\n    This function sends an email using the provided parameters. It supports sending emails with attachments and inline attachments.\n\n    .PARAMETER Email\n    Specifies the email parameters including sender, recipients, server settings, and encoding.\n\n    .PARAMETER Body\n    Specifies the body of the email.\n\n    .PARAMETER Attachment\n    Specifies an array of file paths to be attached to the email.\n\n    .PARAMETER InlineAttachments\n    Specifies a dictionary of inline attachments to be included in the email.\n\n    .PARAMETER Subject\n    Specifies the subject of the email.\n\n    .PARAMETER To\n    Specifies an array of email addresses to send the email to.\n\n    .PARAMETER Logger\n    Specifies a custom object for logging purposes.\n\n    .EXAMPLE\n    Send-Email -Email $EmailParams -Body \"Hello, this is a test email\" -Attachment \"C:\\Files\\attachment.txt\" -Subject \"Test Email\" -To \"recipient@example.com\" -Logger $Logger\n\n    .EXAMPLE\n    $EmailParams = @{\n        From = \"sender@example.com\"\n        To = \"recipient@example.com\"\n        Subject = \"Test Email\"\n        Body = \"Hello, this is a test email\"\n        Server = \"smtp.example.com\"\n        Port = 587\n        Password = \"password\"\n        Encoding = \"UTF8\"\n    }\n    Send-Email -Email $EmailParams -Attachment \"C:\\Files\\attachment.txt\" -To \"recipient@example.com\" -Logger $Logger\n    #>\n    [CmdletBinding(SupportsShouldProcess = $true)]\n    param (\n        [alias('EmailParameters')][System.Collections.IDictionary] $Email,\n        [string] $Body,\n        [string[]] $Attachment,\n        [System.Collections.IDictionary] $InlineAttachments,\n        [string] $Subject,\n        [string[]] $To,\n        [PSCustomObject] $Logger\n    )\n    try {\n        # Following code makes sure both formats are accepted.\n        if ($Email.EmailTo) {\n            $EmailParameters = $Email.Clone()\n            $EmailParameters.EmailEncoding = $EmailParameters.EmailEncoding -replace \"-\", ''\n            $EmailParameters.EmailEncodingSubject = $EmailParameters.EmailEncodingSubject -replace \"-\", ''\n            $EmailParameters.EmailEncodingBody = $EmailParameters.EmailEncodingSubject -replace \"-\", ''\n            $EmailParameters.EmailEncodingAlternateView = $EmailParameters.EmailEncodingAlternateView -replace \"-\", ''\n        } else {\n            $EmailParameters = @{\n                EmailFrom                   = $Email.From\n                EmailTo                     = $Email.To\n                EmailCC                     = $Email.CC\n                EmailBCC                    = $Email.BCC\n                EmailReplyTo                = $Email.ReplyTo\n                EmailServer                 = $Email.Server\n                EmailServerPassword         = $Email.Password\n                EmailServerPasswordAsSecure = $Email.PasswordAsSecure\n                EmailServerPasswordFromFile = $Email.PasswordFromFile\n                EmailServerPort             = $Email.Port\n                EmailServerLogin            = $Email.Login\n                EmailServerEnableSSL        = $Email.EnableSsl\n                EmailEncoding               = $Email.Encoding -replace \"-\", ''\n                EmailEncodingSubject        = $Email.EncodingSubject -replace \"-\", ''\n                EmailEncodingBody           = $Email.EncodingBody -replace \"-\", ''\n                EmailEncodingAlternateView  = $Email.EncodingAlternateView -replace \"-\", ''\n                EmailSubject                = $Email.Subject\n                EmailPriority               = $Email.Priority\n                EmailDeliveryNotifications  = $Email.DeliveryNotifications\n                EmailUseDefaultCredentials  = $Email.UseDefaultCredentials\n                # EmailAlternativeClient      = $Email.AlternativeClient\n            }\n        }\n    } catch {\n        return @{\n            Status = $False\n            Error  = $($_.Exception.Message)\n            SentTo = ''\n        }\n    }\n    $SmtpClient = [System.Net.Mail.SmtpClient]::new()\n    if ($EmailParameters.EmailServer) {\n        $SmtpClient.Host = $EmailParameters.EmailServer\n    } else {\n        return @{\n            Status = $False\n            Error  = \"Email Server Host is not set.\"\n            SentTo = ''\n        }\n    }\n    # Adding parameters to login to server\n    if ($EmailParameters.EmailServerPort) {\n        $SmtpClient.Port = $EmailParameters.EmailServerPort\n    } else {\n        return @{\n            Status = $False\n            Error  = \"Email Server Port is not set.\"\n            SentTo = ''\n        }\n    }\n\n    if ($EmailParameters.EmailServerLogin) {\n\n        $Credentials = Request-Credentials -UserName $EmailParameters.EmailServerLogin `\n            -Password $EmailParameters.EmailServerPassword `\n            -AsSecure:$EmailParameters.EmailServerPasswordAsSecure `\n            -FromFile:$EmailParameters.EmailServerPasswordFromFile `\n            -NetworkCredentials #-Verbose\n        $SmtpClient.Credentials = $Credentials\n    }\n    if ($EmailParameters.EmailServerEnableSSL) {\n        $SmtpClient.EnableSsl = $EmailParameters.EmailServerEnableSSL\n    }\n    $MailMessage = [System.Net.Mail.MailMessage]::new()\n    $MailMessage.From = $EmailParameters.EmailFrom\n    if ($To) {\n        foreach ($T in $To) { $MailMessage.To.add($($T)) }\n    } else {\n        if ($EmailParameters.Emailto) {\n            foreach ($To in $EmailParameters.Emailto) { $MailMessage.To.add($($To)) }\n        }\n    }\n    if ($EmailParameters.EmailCC) {\n        foreach ($CC in $EmailParameters.EmailCC) { $MailMessage.CC.add($($CC)) }\n    }\n    if ($EmailParameters.EmailBCC) {\n        foreach ($BCC in $EmailParameters.EmailBCC) { $MailMessage.BCC.add($($BCC)) }\n    }\n    if ($EmailParameters.EmailReplyTo) {\n        $MailMessage.ReplyTo = $EmailParameters.EmailReplyTo\n    }\n    $MailMessage.IsBodyHtml = $true\n    if ($Subject -eq '') {\n        $MailMessage.Subject = $EmailParameters.EmailSubject\n    } else {\n        $MailMessage.Subject = $Subject\n    }\n\n    $MailMessage.Priority = [System.Net.Mail.MailPriority]::$($EmailParameters.EmailPriority)\n\n    #  Encoding\n    if ($EmailParameters.EmailEncodingSubject) {\n        $MailMessage.SubjectEncoding = [System.Text.Encoding]::$($EmailParameters.EmailEncodingSubject)\n    } elseif ($EmailParameters.EmailEncoding) {\n        $MailMessage.SubjectEncoding = [System.Text.Encoding]::$($EmailParameters.EmailEncoding)\n    }\n    if ($EmailParameters.EmailEncodingBody) {\n        $MailMessage.BodyEncoding = [System.Text.Encoding]::$($EmailParameters.EmailEncodingBody)\n    } elseif ($EmailParameters.EmailEncoding) {\n        $MailMessage.BodyEncoding = [System.Text.Encoding]::$($EmailParameters.EmailEncoding)\n    }\n    #$MailMessage.BodyTransferEncoding = [System.Net.Mime.TransferEncoding]::QuotedPrintable\n    if ($EmailParameters.EmailUseDefaultCredentials) {\n        $SmtpClient.UseDefaultCredentials = $EmailParameters.EmailUseDefaultCredentials\n    }\n    if ($EmailParameters.EmailDeliveryNotifications) {\n        $MailMessage.DeliveryNotificationOptions = $EmailParameters.EmailDeliveryNotifications\n    }\n\n    # Inlining attachment (s)\n    if ($PSBoundParameters.ContainsKey('InlineAttachments')) {\n        # having any other encoding here caused Thunderbird to play weird things\n        if ($EmailParameters.EmailEncodingAlternateView) {\n            $BodyPart = [Net.Mail.AlternateView]::CreateAlternateViewFromString($Body, [System.Text.Encoding]::$($EmailParameters.EmailEncodingAlternateView) , 'text/html' )\n        } else {\n            $BodyPart = [Net.Mail.AlternateView]::CreateAlternateViewFromString($Body, [System.Text.Encoding]::UTF8, 'text/html' )\n        }\n        <#\n        if ($EmailParameters.EmailEncodingBody) {\n            $BodyPart = [Net.Mail.AlternateView]::CreateAlternateViewFromString($Body, [System.Text.Encoding]::$($EmailParameters.EmailEncodingBody), 'text/html' )\n        } elseif ($EmailParameters.EmailEncoding) {\n            $BodyPart = [Net.Mail.AlternateView]::CreateAlternateViewFromString($Body, [System.Text.Encoding]::$($EmailParameters.EmailEncoding), 'text/html' )\n        } else {\n            $BodyPart = [Net.Mail.AlternateView]::CreateAlternateViewFromString($Body, 'text/html' )\n        }\n        #>\n        #$BodyPart.TransferEncoding = [System.Net.Mime.TransferEncoding]::QuotedPrintable\n        $MailMessage.AlternateViews.Add($BodyPart)\n        foreach ($Entry in $InlineAttachments.GetEnumerator()) {\n            try {\n                $FilePath = $Entry.Value\n                Write-Verbose $FilePath\n                if ($Entry.Value.StartsWith('http', [System.StringComparison]::CurrentCultureIgnoreCase)) {\n                    $FileName = $Entry.Value.Substring($Entry.Value.LastIndexOf(\"/\") + 1)\n                    $FilePath = Join-Path $env:temp $FileName\n                    Invoke-WebRequest -Uri $Entry.Value -OutFile $FilePath\n                }\n                $ContentType = Get-MimeType -FileName $FilePath\n                $InAttachment = [Net.Mail.LinkedResource]::new($FilePath, $ContentType )\n                $InAttachment.ContentId = $Entry.Key\n                $BodyPart.LinkedResources.Add( $InAttachment )\n            } catch {\n                $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n                Write-Error \"Error inlining attachments: $ErrorMessage\"\n            }\n        }\n    } else {\n        $MailMessage.Body = $Body\n    }\n\n    #  Attaching file (s)\n    if ($PSBoundParameters.ContainsKey('Attachment')) {\n        foreach ($Attach in $Attachment) {\n            if (Test-Path -LiteralPath $Attach) {\n                try {\n                    $File = [Net.Mail.Attachment]::new($Attach)\n                    #Write-Verbose \"Send-Email - Attaching file $Attach\"\n                    $MailMessage.Attachments.Add($File)\n                } catch {\n                    # non critical error\n                    $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n                    if ($Logger) {\n                        $Logger.AddErrorRecord(\"Error attaching file $Attach`: $ErrorMessage\")\n                    } else {\n                        Write-Error \"Error attaching file $Attach`: $ErrorMessage\"\n                    }\n                }\n            }\n        }\n    }\n\n    #  Sending the Email\n    try {\n        $MailSentTo = \"$($MailMessage.To) $($MailMessage.CC) $($MailMessage.BCC)\".Trim()\n        if ($pscmdlet.ShouldProcess(\"$MailSentTo\", \"Send-Email\")) {\n            $SmtpClient.Send($MailMessage)\n            #$att.Dispose();\n            $MailMessage.Dispose();\n            return [PSCustomObject] @{\n                Status = $True\n                Error  = \"\"\n                SentTo = $MailSentTo\n            }\n        } else {\n            return [PSCustomObject] @{\n                Status = $False\n                Error  = 'Email not sent (WhatIf)'\n                SentTo = $MailSentTo\n            }\n        }\n    } catch {\n        $MailMessage.Dispose();\n        return [PSCustomObject] @{\n            Status = $False\n            Error  = $($_.Exception.Message)\n            SentTo = \"\"\n        }\n    }\n}"
  },
  {
    "path": "Private/Deprecated/Email/Set-EmailBody.ps1",
    "content": "function Set-EmailBody {\n    <#\n    .SYNOPSIS\n    Sets the email body content with a welcome message and table data.\n\n    .DESCRIPTION\n    This function sets the email body content by combining a welcome message and table data into a single HTML string. If there is no data in the table, a default message is displayed.\n\n    .PARAMETER TableData\n    The data to be included in the email body table.\n\n    .PARAMETER TableMessageWelcome\n    The welcome message to be displayed at the beginning of the email body.\n\n    .PARAMETER TableMessageNoData\n    The message to be displayed when there is no data in the table.\n\n    .EXAMPLE\n    $tableData = @(\"Name\", \"Age\", \"Location\"), @(\"Alice\", \"30\", \"New York\"), @(\"Bob\", \"25\", \"Los Angeles\")\n    $welcomeMessage = \"Welcome to our platform!\"\n    Set-EmailBody -TableData $tableData -TableMessageWelcome $welcomeMessage\n\n    This example sets the email body with a welcome message \"Welcome to our platform!\" and table data. If there is no data in the table, the default message \"No changes happened during that period.\" is displayed.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [Object] $TableData,\n        [alias('TableWelcomeMessage')][string] $TableMessageWelcome,\n        [string] $TableMessageNoData = 'No changes happened during that period.'\n    )\n    $Body = \"<p><i><u>$TableMessageWelcome</u></i></p>\"\n    if ($($TableData | Measure-Object).Count -gt 0) {\n        $Body += $TableData | ConvertTo-Html -Fragment | Out-String\n        # $Body += \"</p>\"\n    } else {\n        $Body += \"<p><i>$TableMessageNoData</i></p>\"\n    }\n    return $body\n}"
  },
  {
    "path": "Private/Deprecated/Email/Set-EmailBodyPreparedTable.ps1",
    "content": "function Set-EmailBodyPreparedTable ($TableData, $TableWelcomeMessage) {\n    <#\n    .SYNOPSIS\n    Prepares the email body with a welcome message and table data.\n\n    .DESCRIPTION\n    This function prepares the email body by combining a welcome message and table data into a single HTML string.\n\n    .PARAMETER TableData\n    The data to be included in the email body table.\n\n    .PARAMETER TableWelcomeMessage\n    The welcome message to be displayed at the beginning of the email body.\n\n    .EXAMPLE\n    $tableData = \"<table><tr><td>John</td><td>Doe</td></tr></table>\"\n    $welcomeMessage = \"Welcome to our platform!\"\n    Set-EmailBodyPreparedTable -TableData $tableData -TableWelcomeMessage $welcomeMessage\n\n    This example prepares the email body with a welcome message \"Welcome to our platform!\" and table data \"<table><tr><td>John</td><td>Doe</td></tr></table>\".\n\n    #>\n    $body = \"<p><i><u>$TableWelcomeMessage</u></i></p>\"\n    $body += $TableData\n    return $body\n}"
  },
  {
    "path": "Private/Deprecated/Email/Set-EmailBodyReplacement.ps1",
    "content": "function Set-EmailBodyReplacement {\n    <#\n    .SYNOPSIS\n    Replaces specified text in the email body based on the provided replacement table and type.\n\n    .DESCRIPTION\n    This function replaces text in the email body with specified formatting based on the replacement table and type provided.\n\n    .PARAMETER Body\n    The original email body text.\n\n    .PARAMETER ReplacementTable\n    A hashtable containing the text to be replaced as keys and the replacement values as values.\n\n    .PARAMETER Type\n    The type of replacement to be performed. Valid values are 'Colors' and 'Bold'.\n\n    .EXAMPLE\n    Set-EmailBodyReplacement -Body \"This is a test email.\" -ReplacementTable @{ 'test' = 'green' } -Type Colors\n    This example replaces the text 'test' in the email body with green color.\n\n    .EXAMPLE\n    Set-EmailBodyReplacement -Body \"This is a test email.\" -ReplacementTable @{ 'test' = $true } -Type Bold\n    This example makes the text 'test' bold in the email body.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string] $Body,\n        [hashtable] $ReplacementTable,\n        [ValidateSet('Colors', 'Bold')][string] $Type\n    )\n    switch ($Type) {\n        'Colors' {\n            foreach ($Field in $ReplacementTable.Keys) {\n                $Value = $ReplacementTable.$Field\n                $Body = $Body -replace $Field, \"<font color=`\"$Value`\">$Field</font>\"\n            }\n        }\n        'Bold' {\n            foreach ($Field in $ReplacementTable.Keys) {\n                $Value = $ReplacementTable.$Field\n                if ($Value -eq $true) {\n                    $Body = $Body -replace $Field, \"<b>$Field</b>\"\n                }\n            }\n        }\n    }\n    return $Body\n}\n\n<#\n$ReplacementTable = @{\n    ' Added' = 'green'\n}\n\n$ReplacementTable = @{\n    ' Added' = $true\n}\n#>"
  },
  {
    "path": "Private/Deprecated/Email/Set-EmailBodyTableReplacement.ps1",
    "content": "function Set-EmailBodyReplacementTable {\n    <#\n    .SYNOPSIS\n    Replaces a placeholder in the email body with an HTML table.\n\n    .DESCRIPTION\n    This function replaces a specified placeholder in the email body with an HTML table generated from the provided table data.\n\n    .PARAMETER Body\n    The original email body containing the placeholder to be replaced.\n\n    .PARAMETER TableName\n    The placeholder text to be replaced with the HTML table.\n\n    .PARAMETER TableData\n    An array of data to be converted into an HTML table.\n\n    .EXAMPLE\n    $body = \"Hello, <<TablePlaceholder>>!\"\n    $tableName = \"TablePlaceholder\"\n    $tableData = @(\"Name\", \"Age\", \"Location\"), @(\"Alice\", \"30\", \"New York\"), @(\"Bob\", \"25\", \"Los Angeles\")\n    Set-EmailBodyReplacementTable -Body $body -TableName $tableName -TableData $tableData\n\n    This example replaces the placeholder \"<<TablePlaceholder>>\" in the email body with an HTML table containing the provided data.\n\n    #>\n    [CmdletBinding()]\n    [alias('Set-EmailBodyTableReplacement')]\n    param (\n        [string] $Body,\n        [string] $TableName,\n        [Array] $TableData\n    )\n    $TableData = $TableData | ConvertTo-Html -Fragment | Out-String\n    $Body = $Body -replace \"<<$TableName>>\", $TableData\n    return $Body\n}"
  },
  {
    "path": "Private/Deprecated/Email/Set-EmailFormatting.ps1",
    "content": "﻿function Set-EmailFormatting {\n    <#\n    .SYNOPSIS\n    Sets the formatting for an email template.\n\n    .DESCRIPTION\n    This function sets the formatting for an email template by applying specified styles and parameters.\n\n    .PARAMETER Template\n    The email template to be formatted.\n\n    .PARAMETER FormattingParameters\n    A dictionary containing the styles to be applied to the template.\n\n    .PARAMETER ConfigurationParameters\n    A dictionary containing configuration parameters for formatting.\n\n    .PARAMETER Logger\n    An object used for logging information.\n\n    .PARAMETER SkipNewLines\n    Switch to skip adding new lines to the template.\n\n    .PARAMETER AddAfterOpening\n    An array of strings to add after the opening of the template.\n\n    .PARAMETER AddBeforeClosing\n    An array of strings to add before the closing of the template.\n\n    .PARAMETER Image\n    An optional image to be included in the template.\n\n    .EXAMPLE\n    Set-EmailFormatting -Template \"Hello, <<Name>>!\" -FormattingParameters @{ Styles = @{ Name = \"b\" } } -ConfigurationParameters @{ DisplayConsole = $true } -Logger $logger -Image \"logo.png\"\n\n    Description:\n    Sets the formatting for an email template with a bold style applied to the name placeholder and includes a logo image.\n\n    #>\n    [CmdletBinding()]\n    param (\n        $Template,\n        [System.Collections.IDictionary] $FormattingParameters,\n        [System.Collections.IDictionary] $ConfigurationParameters,\n        [PSCustomObject] $Logger,\n        [switch] $SkipNewLines,\n        [string[]] $AddAfterOpening,\n        [string[]] $AddBeforeClosing,\n        [string] $Image\n    )\n    if ($ConfigurationParameters) {\n        $WriteParameters = $ConfigurationParameters.DisplayConsole\n    } else {\n        $WriteParameters = @{ ShowTime = $true; LogFile = \"\"; TimeFormat = \"yyyy-MM-dd HH:mm:ss\" }\n    }\n\n    if ($Image) {\n        $Template = $Template -replace '<<Image>>', $Image\n    }\n\n\n    $Body = \"<body>\"\n    if ($AddAfterOpening) {\n        $Body += $AddAfterOpening\n    }\n\n    if (-not $SkipNewLines) {\n        $Template = $Template.Split(\"`n\") # https://blogs.msdn.microsoft.com/timid/2014/07/09/one-liner-fun-with-multi-line-blocktext-and-split-split/\n        if ($Logger) {\n            $Logger.AddInfoRecord(\"Preparing template - adding HTML <BR> tags...\")\n        } else {\n            Write-Color @WriteParameters -Text \"[i] Preparing template \", \"adding\", \" HTML \", \"<BR>\", \" tags.\" -Color White, Yellow, White, Yellow\n        }\n        foreach ($t in $Template) {\n            $Body += \"$t<br>\"\n        }\n    } else {\n        $Body += $Template\n    }\n    foreach ($style in $FormattingParameters.Styles.GetEnumerator()) {\n        foreach ($value in $style.Value) {\n            if ($value -eq \"\") { continue }\n            if ($Logger) {\n                $Logger.AddInfoRecord(\"Preparing template - adding HTML $($style.Name) tag for $value.\")\n            } else {\n                Write-Color @WriteParameters -Text \"[i] Preparing template \", \"adding\", \" HTML \", \"$($style.Name)\", \" tag for \", \"$value\", ' tags...' -Color White, Yellow, White, Yellow, White, Yellow\n            }\n            $Body = $Body.Replace($value, \"<$($style.Name)>$value</$($style.Name)>\")\n        }\n    }\n\n    foreach ($color in $FormattingParameters.Colors.GetEnumerator()) {\n        foreach ($value in $color.Value) {\n            if ($value -eq \"\") { continue }\n            if ($Logger) {\n                $Logger.AddInfoRecord(\"Preparing template - adding HTML $($color.Name) tag for $value.\")\n            } else {\n                Write-Color @WriteParameters -Text \"[i] Preparing template \", \"adding\", \" HTML \", \"$($color.Name)\", \" tag for \", \"$value\", ' tags...' -Color White, Yellow, White, Yellow, White, Yellow\n            }\n            $Body = $Body.Replace($value, \"<span style=color:$($color.Name)>$value</span>\")\n        }\n    }\n    foreach ($links in $FormattingParameters.Links.GetEnumerator()) {\n        foreach ($link in $links.Value) {\n            if ($link.Link -like \"*@*\") {\n                if ($Logger) {\n                    $Logger.AddInfoRecord(\"Preparing template - adding EMAIL Links for $($links.Key).\")\n                } else {\n                    Write-Color @WriteParameters -Text \"[i] Preparing template \", \"adding\", \" EMAIL \", \"Links for\", \" $($links.Key)...\" -Color White, Yellow, White, White, Yellow, White\n                }\n                $Body = $Body -replace \"<<$($links.Key)>>\", \"<span style=color:$($link.Color)><a href='mailto:$($link.Link)?subject=$($Link.Subject)'>$($Link.Text)</a></span>\"\n            } else {\n                if ($Logger) {\n                    $Logger.AddInfoRecord(\"[i] Preparing template - adding HTML Links for $($links.Key)\")\n                } else {\n                    Write-Color @WriteParameters -Text \"[i] Preparing template \", \"adding\", \" HTML \", \"Links for\", \" $($links.Key)...\" -Color White, Yellow, White, White, Yellow, White\n                }\n                $Body = $Body -replace \"<<$($links.Key)>>\", \"<span style=color:$($link.Color)><a href='$($link.Link)'>$($Link.Text)</a></span>\"\n            }\n        }\n    }\n    if ($AddAfterOpening) {\n        $Body += $AddBeforeClosing\n    }\n    $Body += '</body>'\n    if ($ConfigurationParameters) {\n        if ($ConfigurationParameters.DisplayTemplateHTML -eq $true) { Get-HTML($Body) }\n    }\n    return $Body\n}"
  },
  {
    "path": "Private/Deprecated/Email/Set-EmailHead.ps1",
    "content": "function Set-EmailHead {\n    <#\n    .SYNOPSIS\n    Sets the HTML head section for an email with specified formatting options.\n\n    .DESCRIPTION\n    The Set-EmailHead function generates the HTML head section for an email with customizable formatting options. It includes meta tags for content type, viewport settings, and description. Additionally, it defines styles for the body, tables, headings, lists, and more.\n\n    .PARAMETER FormattingOptions\n    Specifies the formatting options to be applied to the email content.\n\n    .EXAMPLE\n    $formatting = @{\n        FontFamily = 'Arial';\n        FontSize = '12px';\n        FontTableDataFamily = 'Arial';\n        FontTableDataSize = '10px';\n        FontTableHeadingFamily = 'Arial';\n        FontTableHeadingSize = '12px';\n    }\n    Set-EmailHead -FormattingOptions $formatting\n    #>\n    [cmdletBinding()]\n    param(\n        [System.Collections.IDictionary] $FormattingOptions\n    )\n    $head = @\"\n<!DOCTYPE html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n<meta content=\"width=device-width, initial-scale=1\" name=\"viewport\">\n<meta name=\"description\" content=\"Password Expiration Email\">\n    <style>\n    BODY {\n        background-color: white;\n        font-family: $($FormattingOptions.FontFamily);\n        font-size: $($FormattingOptions.FontSize);\n    }\n\n    TABLE {\n        border-width: 1px;\n        border-style: solid;\n        border-color: black;\n        border-collapse: collapse;\n        font-family: $($FormattingOptions.FontTableDataFamily);\n        font-size: $($FormattingOptions.FontTableDataSize);\n    }\n\n    TH {\n        border-width: 1px;\n        padding: 3px;\n        border-style: solid;\n        border-color: black;\n        background-color: #00297A;\n        color: white;\n        font-family: $($FormattingOptions.FontTableHeadingFamily);\n        font-size: $($FormattingOptions.FontTableHeadingSize);\n    }\n    TR {\n        font-family: $($FormattingOptions.FontTableDataFamily);\n        font-size: $($FormattingOptions.FontTableDataSize);\n    }\n\n    UL {\n        font-family: $($FormattingOptions.FontFamily);\n        font-size: $($FormattingOptions.FontSize);\n    }\n\n    LI {\n        font-family: $($FormattingOptions.FontFamily);\n        font-size: $($FormattingOptions.FontSize);\n    }\n\n    TD {\n        border-width: 1px;\n        padding-right: 2px;\n        padding-left: 2px;\n        padding-top: 0px;\n        padding-bottom: 0px;\n        border-style: solid;\n        border-color: black;\n        background-color: white;\n        font-family: $($FormattingOptions.FontTableDataFamily);\n        font-size: $($FormattingOptions.FontTableDataSize);\n    }\n\n    H2 {\n        font-family: $($FormattingOptions.FontHeadingFamily);\n        font-size: $($FormattingOptions.FontHeadingSize);\n    }\n\n    P {\n        font-family: $($FormattingOptions.FontFamily);\n        font-size: $($FormattingOptions.FontSize);\n    }\n</style>\n</head>\n\"@\n    return $Head\n}"
  },
  {
    "path": "Private/Deprecated/Email/Set-EmailReportBranding.ps1",
    "content": "function Set-EmailReportBranding {\n    <#\n    .SYNOPSIS\n    Sets the branding for the email report.\n\n    .DESCRIPTION\n    This function sets the branding for the email report by customizing the company logo and link.\n\n    .PARAMETER FormattingParameters\n    Specifies the formatting options for the email report branding.\n\n    .EXAMPLE\n    $brandingParams = @{\n        CompanyBranding = @{\n            Link = \"https://www.example.com\"\n            Inline = $true\n            Logo = \"C:\\CompanyLogo.png\"\n            Width = \"200px\"\n            Height = \"100px\"\n        }\n    }\n    Set-EmailReportBranding -FormattingParameters $brandingParams\n    #>\n    [cmdletBinding()]\n    param(\n        [alias('FormattingOptions')] $FormattingParameters\n    )\n    if ($FormattingParameters.CompanyBranding.Link) {\n        $Report = \"<a style=`\"text-decoration:none`\" href=`\"$($FormattingParameters.CompanyBranding.Link)`\" class=`\"clink logo-container`\">\"\n    } else {\n        $Report = ''\n    }\n    if ($FormattingParameters.CompanyBranding.Inline) {\n        $Report += \"<img width=<fix> height=<fix> src=`\"cid:logo`\" border=`\"0`\" class=`\"company-logo`\" alt=`\"company-logo`\"></a>\"\n    } else {\n        $Report += \"<img width=<fix> height=<fix> src=`\"$($FormattingParameters.CompanyBranding.Logo)`\" border=`\"0`\" class=`\"company-logo`\" alt=`\"company-logo`\"></a>\"\n    }\n    if ($FormattingParameters.CompanyBranding.Width -ne \"\") {\n        $Report = $Report -replace \"width=<fix>\", \"width=$($FormattingParameters.CompanyBranding.Width)\"\n    } else {\n        $Report = $Report -replace \"width=<fix>\", \"\"\n    }\n    if ($FormattingParameters.CompanyBranding.Height -ne \"\") {\n        $Report = $Report -replace \"height=<fix>\", \"height=$($FormattingParameters.CompanyBranding.Height)\"\n    } else {\n        $Report = $Report -replace \"height=<fix>\", \"\"\n    }\n    return $Report\n}"
  },
  {
    "path": "Private/Deprecated/Email/Set-EmailWordReplacements.ps1",
    "content": "function Set-EmailWordReplacements($Body, $Replace, $ReplaceWith, [switch] $RegEx) {\n    <#\n    .SYNOPSIS\n    Replaces words or patterns in an email body with specified replacements.\n\n    .DESCRIPTION\n    This function replaces words or patterns in the email body with specified replacements. It provides the option to use regular expressions for more complex replacements.\n\n    .PARAMETER Body\n    The email body where the word replacements will be applied.\n\n    .PARAMETER Replace\n    The word or pattern to be replaced in the email body.\n\n    .PARAMETER ReplaceWith\n    The replacement for the word or pattern.\n\n    .PARAMETER RegEx\n    Indicates whether to use regular expressions for replacements.\n\n    .EXAMPLE\n    $body = \"Hello, my name is John.\"\n    Set-EmailWordReplacements -Body $body -Replace 'John' -ReplaceWith 'Jane'\n    # This will replace \"John\" with \"Jane\" in the email body.\n\n    .EXAMPLE\n    $body = \"The cat sat on the mat.\"\n    Set-EmailWordReplacements -Body $body -Replace 'cat' -ReplaceWith 'dog' -RegEx\n    # This will replace \"cat\" with \"dog\" using regular expressions in the email body.\n\n    #>\n    if ($RegEx) {\n        $Body = $Body -Replace $Replace, $ReplaceWith\n    } else {\n        $Body = $Body.Replace($Replace, $ReplaceWith)\n    }\n    return $Body\n}"
  },
  {
    "path": "Private/Deprecated/Email/Set-EmailWordReplacementsHash.ps1",
    "content": "function Set-EmailWordReplacementsHash {\n    <#\n    .SYNOPSIS\n    Replaces words in an email body based on a given hash table of substitutions.\n\n    .DESCRIPTION\n    This function replaces words in the email body with specified substitutions using a hash table.\n\n    .PARAMETER Body\n    The email body where the word replacements will be applied.\n\n    .PARAMETER Substitute\n    A hash table containing the words to be replaced as keys and their corresponding substitutions as values.\n\n    .EXAMPLE\n    $body = \"Hello, my name is John.\"\n    $substitutions = @{\n        \"John\" = \"Jane\"\n    }\n    Set-EmailWordReplacementsHash -Body $body -Substitute $substitutions\n    # This will replace \"John\" with \"Jane\" in the email body.\n\n    #>\n    [CmdletBinding()]\n    param (\n        $Body,\n        $Substitute\n    )\n    foreach ($Key in $Substitute.Keys) {\n        Write-Verbose \"Set-EmailWordReplacementsHash - Key: $Key Value: $($Substitute.$Key)\"\n        $Body = Set-EmailWordReplacements -Body $Body -Replace $Key -ReplaceWith $Substitute.$Key\n    }\n    return $Body\n}"
  },
  {
    "path": "Private/Deprecated/Logging/Get-Logger.ps1",
    "content": "function Get-Logger {\n    <#\n    .SYNOPSIS\n    Returns an instance of the logger object.\n\n    .DESCRIPTION\n    This function creates a logger object that can be used to log messages to a file or console. It allows customization of log file path, log directory, log filename, time display, and time format.\n\n    .PARAMETER LogPath\n    Specifies the full path of the log file.\n\n    .PARAMETER LogsDir\n    Specifies the directory where the log file will be stored.\n\n    .PARAMETER Filename\n    Specifies the name of the log file.\n\n    .PARAMETER ShowTime\n    Indicates whether to display timestamps in the log messages.\n\n    .PARAMETER TimeFormat\n    Specifies the format of the timestamp to be displayed in the log messages.\n\n    .EXAMPLE\n    Creates a logger with a full log name:\n    $Logger = Get-Logger -ShowTime -LogPath 'C:\\temp\\test.log'\n    $Logger.AddErrorRecord(\"test error\")\n    $Logger.AddInfoRecord(\"test info\")\n    $Logger.AddSuccessRecord(\"test success\")\n    $Logger.AddRecord(\"test record\")\n\n    .EXAMPLE\n    Creates a logger with a directory name and auto-generated log name:\n    $Logger = Get-Logger -ShowTime -LogsDir 'C:\\temp'\n    $Logger.AddErrorRecord(\"test error\")\n\n    .EXAMPLE\n    Creates a logger with a directory name and a separately defined log filename:\n    $Logger = Get-Logger -ShowTime -LogsDir 'C:\\temp' -Filename 'test.log'\n    $Logger.AddErrorRecord(\"test error\")\n\n    .EXAMPLE\n    Creates a logger without a log file, only for console output:\n    $Logger = Get-Logger -ShowTime\n    $Logger.AddErrorRecord(\"test error\")\n\n    .NOTES\n    General notes\n    #>\n    [CmdletBinding(DefaultParameterSetName = \"All\")]\n    param (\n        [Parameter(Mandatory = $false, ParameterSetName = 'Logpath')][string] $LogPath,\n        [Parameter(Mandatory = $false, ParameterSetName = 'Complexpath')][string] $LogsDir,\n        [Parameter(Mandatory = $false, ParameterSetName = 'Complexpath')][string] $Filename,\n        [switch] $ShowTime,\n        [string] $TimeFormat = 'yyyy-MM-dd HH:mm:ss'\n    )\n\n    if ($PSCmdlet.ParameterSetName -eq 'Complexpath') {\n        if (-not $Filename) {\n            $CallerName = [System.IO.Path]::GetFileNameWithoutExtension((Split-Path $MyInvocation.PSCommandPath -Leaf))\n            $Filename = \"$([DateTime]::Now.ToString($TimeFormat) -replace('[^.\\-\\w]', '_'))_$CallerName.log\"\n        }\n        $LogPath = Join-Path $LogsDir $Filename\n    }\n\n    if ($LogPath) {\n        $LogsDir = [System.IO.Path]::GetDirectoryName($LogPath)\n        New-Item $LogsDir -ItemType Directory -Force | Out-Null\n        New-Item $LogPath -ItemType File -Force | Out-Null\n    }\n\n    $Logger = [PSCustomObject]@{\n        LogPath    = $LogPath\n        ShowTime   = $ShowTime\n        TimeFormat = $TimeFormat\n    }\n\n    Add-Member -InputObject $Logger -MemberType ScriptMethod AddErrorRecord -Value {\n        param(\n            [Parameter(Mandatory = $true)]\n            [string]$String\n        )\n        if (-not $this.LogPath) {\n            Write-Color -Text \"[Error] \", $String -Color Red, White -ShowTime:$this.ShowTime -TimeFormat $this:TimeFormat\n        } else {\n            Write-Color -Text \"[Error] \", $String -Color Red, White -LogFile:$this.LogPath -ShowTime:$this.ShowTime -TimeFormat $this:TimeFormat\n        }\n    }\n\n    Add-Member -InputObject $Logger -MemberType ScriptMethod AddInfoRecord -Value {\n        param(\n            [Parameter(Mandatory = $true)]\n            [string]$String\n        )\n        if (-not $this.LogPath) {\n            Write-Color -Text \"[Info] \", $String -Color Yellow, White -ShowTime:$this.ShowTime -TimeFormat $this:TimeFormat\n        } else {\n            Write-Color -Text \"[Info] \", $String -Color Yellow, White -LogFile:$this.LogPath -ShowTime:$this.ShowTime -TimeFormat $this:TimeFormat\n        }\n    }\n\n    Add-Member -InputObject $Logger -MemberType ScriptMethod AddWarningRecord -Value {\n        param(\n            [Parameter(Mandatory = $true)]\n            [string]$String\n        )\n        if (-not $this.LogPath) {\n            Write-Color -Text \"[Warning] \", $String -Color Magenta, White -ShowTime:$this.ShowTime -TimeFormat $this:TimeFormat\n        } else {\n            Write-Color -Text \"[Warning] \", $String -Color Magenta, White -LogFile:$this.LogPath -ShowTime:$this.ShowTime -TimeFormat $this:TimeFormat\n        }\n    }\n\n    Add-Member -InputObject $Logger -MemberType ScriptMethod AddRecord -Value {\n        param(\n            [Parameter(Mandatory = $true)]\n            [string]$String\n        )\n        if (-not $this.LogPath) {\n            Write-Color -Text \" $String\" -Color White -ShowTime:$this.ShowTime -TimeFormat $this:TimeFormat\n        } else {\n            Write-Color -Text \" $String\" -Color White -LogFile:$this.LogPath -ShowTime:$this.ShowTime -TimeFormat $this:TimeFormat\n        }\n    }\n    Add-Member -InputObject $Logger -MemberType ScriptMethod AddSuccessRecord -Value {\n        param(\n            [Parameter(Mandatory = $true)]\n            [string]$String\n        )\n        if (-not $this.LogPath) {\n            Write-Color -Text \"[Success] \", $String -Color Green, White -ShowTime:$this.ShowTime -TimeFormat $this:TimeFormat\n        } else {\n            Write-Color -Text \"[Success] \", $String -Color Green, White -LogFile:$this.LogPath -ShowTime:$this.ShowTime -TimeFormat $this:TimeFormat\n        }\n    }\n    return $Logger\n}"
  },
  {
    "path": "Private/Deprecated/Objects/Add-ToArray.ps1",
    "content": "function Add-ToArray {\n    <#\n    .SYNOPSIS\n    Adds an element to an ArrayList.\n\n    .DESCRIPTION\n    This function adds an element to the specified ArrayList.\n\n    .PARAMETER List\n    The ArrayList to which the element will be added.\n\n    .PARAMETER Element\n    The element to be added to the ArrayList.\n\n    .EXAMPLE\n    $myList = New-Object System.Collections.ArrayList\n    Add-ToArray -List $myList -Element \"Apple\"\n    # Adds the string \"Apple\" to the ArrayList $myList.\n\n    .EXAMPLE\n    $myList = New-Object System.Collections.ArrayList\n    Add-ToArray -List $myList -Element 42\n    # Adds the integer 42 to the ArrayList $myList.\n    #>\n    [CmdletBinding()]\n    param(\n        [System.Collections.ArrayList] $List,\n        [Object] $Element\n    )\n    #Write-Verbose \"Add-ToArray - Element: $Element\"\n    [void] $List.Add($Element) #> $null\n}\n"
  },
  {
    "path": "Private/Deprecated/Objects/Add-ToArrayAdvanced.ps1",
    "content": "function Add-ToArrayAdvanced {\n    <#\n    .SYNOPSIS\n    Adds an element to an ArrayList with advanced options.\n\n    .DESCRIPTION\n    The Add-ToArrayAdvanced function adds an element to an ArrayList with various options such as skipping null elements, requiring uniqueness, performing full comparison, and merging elements.\n\n    .PARAMETER List\n    The ArrayList to which the element will be added.\n\n    .PARAMETER Element\n    The element to be added to the ArrayList.\n\n    .PARAMETER SkipNull\n    If specified, skips adding null elements to the ArrayList.\n\n    .PARAMETER RequireUnique\n    If specified, ensures that the element is unique in the ArrayList.\n\n    .PARAMETER FullComparison\n    If specified with RequireUnique, performs a full comparison of elements before adding.\n\n    .PARAMETER Merge\n    If specified, merges the element into the ArrayList.\n\n    .EXAMPLE\n    Add-ToArrayAdvanced -List $myList -Element \"Apple\"\n\n    Description:\n    Adds the string \"Apple\" to the ArrayList $myList.\n\n    .EXAMPLE\n    Add-ToArrayAdvanced -List $myList -Element \"Banana\" -RequireUnique -FullComparison\n\n    Description:\n    Adds the string \"Banana\" to the ArrayList $myList only if it is not already present, performing a full comparison.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [System.Collections.ArrayList] $List,\n        [Object] $Element,\n        [switch] $SkipNull,\n        [switch] $RequireUnique,\n        [switch] $FullComparison,\n        [switch] $Merge\n    )\n    if ($SkipNull -and $null -eq $Element) {\n        #Write-Verbose \"Add-ToArrayAdvanced - SkipNull used\"\n        return\n    }\n    if ($RequireUnique) {\n        if ($FullComparison) {\n            foreach ($ListElement in $List) {\n                if ($ListElement -eq $Element) {\n                    $TypeLeft = Get-ObjectType -Object $ListElement\n                    $TypeRight = Get-ObjectType -Object $Element\n                    if ($TypeLeft.ObjectTypeName -eq $TypeRight.ObjectTypeName) {\n                        #Write-Verbose \"Add-ToArrayAdvanced - RequireUnique with full comparison used\"\n                        return\n                    }\n                }\n            }\n        } else {\n            if ($List -contains $Element) {\n                #Write-Verbose \"Add-ToArrayAdvanced - RequireUnique on name used\"\n                return\n            }\n        }\n    }\n    #Write-Verbose \"Add-ToArrayAdvanced - Adding ELEMENT: $Element\"\n    if ($Merge) {\n        [void] $List.AddRange($Element) # > $null\n    } else {\n        [void] $List.Add($Element) # > $null\n    }\n}"
  },
  {
    "path": "Private/Deprecated/Objects/Add-ToHashTable.ps1",
    "content": "function Add-ToHashTable($Hashtable, $Key, $Value) {\n    <#\n    .SYNOPSIS\n    Adds a key-value pair to a hashtable.\n\n    .DESCRIPTION\n    This function adds a key-value pair to a given hashtable. If the value is not null or empty, it is added to the hashtable.\n\n    .PARAMETER Hashtable\n    The hashtable to which the key-value pair will be added.\n\n    .PARAMETER Key\n    The key of the key-value pair to be added.\n\n    .PARAMETER Value\n    The value of the key-value pair to be added.\n\n    .EXAMPLE\n    $myHashtable = @{}\n    Add-ToHashTable -Hashtable $myHashtable -Key \"Name\" -Value \"John\"\n    # Adds the key-value pair \"Name\"-\"John\" to $myHashtable.\n\n    .EXAMPLE\n    $myHashtable = @{}\n    Add-ToHashTable -Hashtable $myHashtable -Key \"Age\" -Value 25\n    # Adds the key-value pair \"Age\"-25 to $myHashtable.\n    #>\n    if ($null -ne $Value -and $Value -ne '') {\n        $Hashtable.Add($Key, $Value)\n    }\n}"
  },
  {
    "path": "Private/Deprecated/Objects/Get-HashMaxValue.ps1",
    "content": "function Get-HashMaxValue {\n    <#\n    .SYNOPSIS\n    Gets the maximum value from a hashtable.\n\n    .DESCRIPTION\n    This function retrieves the maximum value from a given hashtable. It can also return the minimum value if the -Lowest switch is used.\n\n    .PARAMETER hashTable\n    The hashtable from which to find the maximum value.\n\n    .PARAMETER Lowest\n    If specified, the function will return the minimum value instead of the maximum.\n\n    .EXAMPLE\n    $myHashTable = @{ 'A' = 10; 'B' = 20; 'C' = 5 }\n    Get-HashMaxValue -hashTable $myHashTable\n    # Output: 20\n\n    .EXAMPLE\n    $myHashTable = @{ 'A' = 10; 'B' = 20; 'C' = 5 }\n    Get-HashMaxValue -hashTable $myHashTable -Lowest\n    # Output: 5\n    #>\n    [CmdletBinding()]\n    param (\n        [Object] $hashTable,\n        [switch] $Lowest\n    )\n    if ($Lowest) {\n        return ($hashTable.GetEnumerator() | Sort-Object value -Descending | Select-Object -Last 1).Value\n    } else {\n        return ($hashTable.GetEnumerator() | Sort-Object value -Descending | Select-Object -First 1).Value\n    }\n}"
  },
  {
    "path": "Private/Deprecated/Objects/Get-ObjectCount.ps1",
    "content": "function Get-ObjectCount {\n    <#\n    .SYNOPSIS\n    Counts the number of objects passed as input.\n\n    .DESCRIPTION\n    This function calculates and returns the total count of objects passed as input. It is designed to be used in scenarios where counting the number of objects is required.\n\n    .PARAMETER Object\n    Specifies the object or objects for which the count needs to be calculated.\n\n    .EXAMPLE\n    Get-Process | Get-ObjectCount\n    Returns the total count of processes currently running.\n\n    .EXAMPLE\n    $Files = Get-ChildItem -Path \"C:\\Files\"\n    $FileCount = $Files | Get-ObjectCount\n    Returns the total count of files in the specified directory.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [parameter(ValueFromPipelineByPropertyName, ValueFromPipeline)][Object]$Object\n    )\n    return $($Object | Measure-Object).Count\n}"
  },
  {
    "path": "Private/Deprecated/Objects/Get-ObjectData.ps1",
    "content": "function Get-ObjectData {\n    <#\n    .SYNOPSIS\n    Retrieves data from an object based on the specified title.\n\n    .DESCRIPTION\n    This function retrieves data from the specified object based on the provided title. It returns an array of values associated with the title.\n\n    .PARAMETER Object\n    The object from which data will be retrieved.\n\n    .PARAMETER Title\n    The title of the data to retrieve from the object.\n\n    .PARAMETER DoNotAddTitles\n    Switch parameter to indicate whether titles should be included in the output.\n\n    .EXAMPLE\n    Get-ObjectData -Object $myObject -Title \"Name\"\n    Retrieves the names associated with the object $myObject.\n\n    .EXAMPLE\n    Get-ObjectData -Object $myObject -Title \"Age\" -DoNotAddTitles\n    Retrieves the ages associated with the object $myObject without including the title.\n\n    #>\n    [CmdletBinding()]\n    param(\n        $Object,\n        $Title,\n        [switch] $DoNotAddTitles\n    )\n    [Array] $Values = $Object.$Title\n    [Array] $ArrayList = @(\n        if ($Values.Count -eq 1 -and $DoNotAddTitles -eq $false) {\n            \"$Title - $($Values[0])\"\n        } else {\n            if ($DoNotAddTitles -eq $false) {\n                $Title\n            }\n            foreach ($Value in $Values) {\n                \"$Value\"\n            }\n        }\n    )\n    return $ArrayList\n}"
  },
  {
    "path": "Private/Deprecated/Objects/Get-ObjectEnumValues.ps1",
    "content": "Function Get-ObjectEnumValues {\n    <#\n    .SYNOPSIS\n    Retrieves the values of an enumeration type and returns them as a hashtable.\n\n    .DESCRIPTION\n    This function takes an enumeration type as input and retrieves all its values, storing them in a hashtable where the key is the name of the enum value and the value is the corresponding numeric value.\n\n    .PARAMETER enum\n    Specifies the enumeration type for which values need to be retrieved.\n\n    .EXAMPLE\n    Get-ObjectEnumValues -enum [System.DayOfWeek]\n    Retrieves all values of the System.DayOfWeek enumeration and returns them as a hashtable.\n\n    .EXAMPLE\n    Get-ObjectEnumValues -enum [System.ConsoleColor]\n    Retrieves all values of the System.ConsoleColor enumeration and returns them as a hashtable.\n\n    #>\n    param(\n        [string]$enum\n    )\n    $enumValues = @{}\n    [enum]::getvalues([type]$enum) |\n        ForEach-Object {\n        $enumValues.add($_, $_.value__)\n    }\n    $enumValues\n}"
  },
  {
    "path": "Private/Deprecated/Objects/Get-ObjectKeys.ps1",
    "content": "function Get-ObjectKeys {\n    <#\n    .SYNOPSIS\n    Retrieves the keys of an object excluding a specified key.\n\n    .DESCRIPTION\n    This function retrieves the keys of an object while excluding a specified key. It returns an array of keys from the object.\n\n    .PARAMETER Object\n    The object from which keys need to be retrieved.\n\n    .PARAMETER Ignore\n    The key to be excluded from the result.\n\n    .EXAMPLE\n    $object = @{ 'key1' = 'value1'; 'key2' = 'value2'; 'key3' = 'value3' }\n    Get-ObjectKeys -Object $object -Ignore 'key2'\n    # Returns 'key1', 'key3'\n\n    #>\n    param(\n        [object] $Object,\n        [string] $Ignore\n    )\n    $Data = $Object.Keys | Where-Object { $_ -notcontains $Ignore }\n    return $Data\n}"
  },
  {
    "path": "Private/Deprecated/Objects/Get-ObjectProperties.ps1",
    "content": "\n# This function goes thru an object such as Get-Aduser and scans every object returned getting all properties\n# This basically makes sure that all properties are known at run time of Export to SQL, Excel or Word\n\n<#\n$Test = Get-Process\n\nGet-ObjectProperties -Object $Test\n#>\nfunction Get-ObjectProperties {\n    <#\n    .SYNOPSIS\n    Retrieves all properties of an object and allows for adding custom properties.\n\n    .DESCRIPTION\n    This function retrieves all properties of an object provided as input. It also allows for adding custom properties to the list. The function can be useful for ensuring that all properties are known at runtime when exporting to SQL, Excel, or Word.\n\n    .PARAMETER Object\n    Specifies the object for which properties need to be retrieved.\n\n    .PARAMETER AddProperties\n    Specifies an array of custom properties to be added to the list.\n\n    .PARAMETER Sort\n    Indicates whether the properties should be sorted.\n\n    .PARAMETER RequireUnique\n    Specifies whether the list of properties should be unique.\n\n    .EXAMPLE\n    $Test = Get-Process\n    Get-ObjectProperties -Object $Test\n\n    Description\n    -----------\n    Retrieves all properties of the Get-Process object.\n\n    .EXAMPLE\n    $Test = Get-Process\n    Get-ObjectProperties -Object $Test -AddProperties 'CustomProperty1', 'CustomProperty2' -Sort -RequireUnique $false\n\n    Description\n    -----------\n    Retrieves all properties of the Get-Process object and adds custom properties 'CustomProperty1' and 'CustomProperty2' to the list. The properties are sorted and duplicates are allowed.\n\n    #>\n    [CmdletBinding()]\n    param (\n        [System.Collections.ICollection] $Object,\n        [string[]] $AddProperties, # provides ability to add some custom properties\n        [switch] $Sort,\n        [bool] $RequireUnique = $true\n    )\n    $Properties = @(\n        foreach ($O in $Object) {\n            $ObjectProperties = $O.PSObject.Properties.Name\n            $ObjectProperties\n            # foreach ($Property in $ObjectProperties) {\n            #     $Property\n            # }\n        }\n        foreach ($Property in $AddProperties) {\n            #Add-ToArrayAdvanced -List $Properties -Element $Property -SkipNull -RequireUnique\n            $Property\n        }\n    )\n    if ($Sort) {\n        return $Properties | Sort-Object -Unique:$RequireUnique\n    } else {\n        return $Properties | Select-Object -Unique:$RequireUnique\n    }\n}"
  },
  {
    "path": "Private/Deprecated/Objects/Get-ObjectPropertiesAdvanced.ps1",
    "content": "function Get-ObjectPropertiesAdvanced {\n    <#\n    .SYNOPSIS\n    Retrieves properties of objects and provides the ability to add custom properties.\n\n    .DESCRIPTION\n    This function retrieves properties of objects and allows users to add custom properties to the output. It calculates the highest count of properties among the objects and returns the properties in an array.\n\n    .PARAMETER Object\n    Specifies the object or objects whose properties need to be retrieved.\n\n    .PARAMETER AddProperties\n    Specifies an array of custom properties to be added to the output.\n\n    .PARAMETER Sort\n    Indicates whether the properties should be sorted alphabetically.\n\n    .EXAMPLE\n    $objects = Get-ObjectPropertiesAdvanced -Object $myObject -AddProperties @(\"CustomProperty1\", \"CustomProperty2\") -Sort\n    This example retrieves properties of $myObject and adds custom properties \"CustomProperty1\" and \"CustomProperty2\" to the output, sorted alphabetically.\n\n    #>\n    [CmdletBinding()]\n    param (\n        [object] $Object,\n        [string[]] $AddProperties, # provides ability to add some custom properties\n        [switch] $Sort\n    )\n    $Data = @{ }\n    $Properties = New-ArrayList\n    $HighestCount = 0\n\n    foreach ($O in $Object) {\n        $ObjectProperties = $O.PSObject.Properties.Name\n        # $Test = $ObjectProperties -join ','\n        $Count = $ObjectProperties.Count\n        if ($Count -gt $HighestCount) {\n            $Data.HighestCount = $Count\n            $Data.HighestObject = $O\n            $HighestCount = $Count\n        }\n        foreach ($Property in $ObjectProperties) {\n            Add-ToArrayAdvanced -List $Properties -Element $Property -SkipNull -RequireUnique\n        }\n    }\n    foreach ($Property in $AddProperties) {\n        Add-ToArrayAdvanced -List $Properties -Element $Property -SkipNull -RequireUnique\n    }\n    $Data.Properties = if ($Sort) { $Properties | Sort-Object } else { $Properties }\n    #Write-Verbose \"Get-ObjectPropertiesAdvanced - HighestCount: $($Data.HighestCount)\"\n    #Write-Verbose \"Get-ObjectPropertiesAdvanced - Properties: $($($Data.Properties) -join ',')\"\n\n    # returns for example\n    # $Data.HighestCount = 100\n    # $Data.HighestObject = $Object\n    # $Data.Properties = array of strings\n    return $Data\n}"
  },
  {
    "path": "Private/Deprecated/Objects/Get-ObjectTitles.ps1",
    "content": "function Get-ObjectTitles {\n    <#\n    .SYNOPSIS\n    Retrieves the titles of properties from an object.\n\n    .DESCRIPTION\n    This function retrieves the titles of properties from an object and returns them in an ArrayList.\n\n    .PARAMETER Object\n    Specifies the object from which to retrieve property titles.\n\n    .EXAMPLE\n    $object = [PSCustomObject]@{\n        Name = \"John Doe\"\n        Age = 30\n        City = \"New York\"\n    }\n    Get-ObjectTitles -Object $object\n\n    Description\n    -----------\n    Retrieves the property titles from the $object and returns them in an ArrayList.\n\n    #>\n    [CmdletBinding()]\n    param(\n        $Object\n    )\n    $ArrayList = New-Object System.Collections.ArrayList\n    Write-Verbose \"Get-ObjectTitles - ObjectType $($Object.GetType())\"\n    foreach ($Title in $Object.PSObject.Properties) {\n        Write-Verbose \"Get-ObjectTitles - Value added to array: $($Title.Name)\"\n        $ArrayList.Add($Title.Name) | Out-Null\n    }\n    Write-Verbose \"Get-ObjectTitles - Array size: $($ArrayList.Count)\"\n    return $ArrayList\n}"
  },
  {
    "path": "Private/Deprecated/Objects/Get-ObjectType.ps1",
    "content": "function Get-ObjectType {\n    <#\n    .SYNOPSIS\n    Retrieves information about the type of the given object.\n\n    .DESCRIPTION\n    This function retrieves information about the type of the specified object, including its name, base type, and system type.\n\n    .PARAMETER Object\n    The object for which type information is to be retrieved.\n\n    .PARAMETER ObjectName\n    The name of the object. Default is 'Random Object Name'.\n\n    .PARAMETER VerboseOnly\n    Indicates whether to output verbose information only.\n\n    .EXAMPLE\n    Get-ObjectType -Object $myObject\n    Retrieves type information for the object stored in $myObject.\n\n    .EXAMPLE\n    Get-ObjectType -Object $myObject -ObjectName \"My Custom Object\"\n    Retrieves type information for the object stored in $myObject with a custom name.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [Object] $Object,\n        [string] $ObjectName = 'Random Object Name',\n        [switch] $VerboseOnly\n    )\n    $ReturnData = [ordered] @{}\n    $ReturnData.ObjectName = $ObjectName\n\n    if ($null -ne $Object) {\n        try {\n            $TypeInformation = $Object.GetType()\n            $ReturnData.ObjectTypeName = $TypeInformation.Name\n            $ReturnData.ObjectTypeBaseName = $TypeInformation.BaseType\n            $ReturnData.SystemType = $TypeInformation.UnderlyingSystemType\n        } catch {\n            $ReturnData.ObjectTypeName = ''\n            $ReturnData.ObjectTypeBaseName = ''\n            $ReturnData.SystemType = ''\n            #Write-Verbose \"Get-ObjectType - Outside Error: $($_.Exception.Message)\"\n        }\n        try {\n            $TypeInformationInsider = $Object[0].GetType()\n            $ReturnData.ObjectTypeInsiderName = $TypeInformationInsider.Name\n            $ReturnData.ObjectTypeInsiderBaseName = $TypeInformationInsider.BaseType\n            $ReturnData.SystemTypeInsider = $TypeInformationInsider.UnderlyingSystemType\n        } catch {\n\n            $ReturnData.ObjectTypeInsiderName = ''\n            $ReturnData.ObjectTypeInsiderBaseName = ''\n            $ReturnData.SystemTypeInsider = ''\n            #Write-Verbose \"Get-ObjectType - Inside Error: $($_.Exception.Message)\"\n        }\n    } else {\n        $ReturnData.ObjectTypeName = ''\n        $ReturnData.ObjectTypeBaseName = ''\n        $ReturnData.SystemType = ''\n        $ReturnData.ObjectTypeInsiderName = ''\n        $ReturnData.ObjectTypeInsiderBaseName = ''\n        $ReturnData.SystemTypeInsider = ''\n        #Write-Verbose \"Get-ObjectType - No data to process - Object is empty?\"\n    }\n    Write-Verbose \"Get-ObjectType - ObjectTypeName: $($ReturnData.ObjectTypeName)\"\n    Write-Verbose \"Get-ObjectType - ObjectTypeBaseName: $($ReturnData.ObjectTypeBaseName)\"\n    Write-Verbose \"Get-ObjectType - SystemType: $($ReturnData.SystemType)\"\n    Write-Verbose \"Get-ObjectType - ObjectTypeInsiderName: $($ReturnData.ObjectTypeInsiderName)\"\n    Write-Verbose \"Get-ObjectType - ObjectTypeInsiderBaseName: $($ReturnData.ObjectTypeInsiderBaseName)\"\n    Write-Verbose \"Get-ObjectType - SystemTypeInsider: $($ReturnData.SystemTypeInsider)\"\n    if ($VerboseOnly) { return } else { return Format-TransposeTable -Object $ReturnData }\n\n}"
  },
  {
    "path": "Private/Deprecated/Objects/New-ArrayList.ps1",
    "content": "function New-ArrayList {\n    <#\n    .SYNOPSIS\n    Creates a new ArrayList object.\n\n    .DESCRIPTION\n    This function creates a new instance of the ArrayList class from the System.Collections namespace.\n\n    .EXAMPLE\n    $myList = New-ArrayList\n    $myList.Add(\"Apple\")\n    $myList.Add(\"Banana\")\n    $myList.Add(\"Orange\")\n    $myList\n    #>\n    [CmdletBinding()]\n    param()\n    $List = [System.Collections.ArrayList]::new()\n    <#\n    Mathias R�rbo Jessen:\n        The pipeline will attempt to unravel the list on assignment,\n        so you'll have to either wrap the empty arraylist in an array,\n        like above, or call WriteObject explicitly and tell it not to, like so:\n        $PSCmdlet.WriteObject($List,$false)\n    #>\n    return , $List\n}"
  },
  {
    "path": "Private/Deprecated/Objects/New-GenericList.ps1",
    "content": "function New-GenericList {\n    <#\n    .SYNOPSIS\n    Creates a new instance of a generic list.\n\n    .DESCRIPTION\n    This function creates a new instance of a generic list based on the specified type.\n\n    .PARAMETER Type\n    Specifies the type of objects that the generic list will hold. Defaults to [System.Object].\n\n    .EXAMPLE\n    PS C:\\> $list = New-GenericList -Type [int]\n    Creates a new generic list that holds integers.\n\n    .EXAMPLE\n    PS C:\\> $list = New-GenericList\n    Creates a new generic list that holds objects.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [Object] $Type = [System.Object]\n    )\n    return New-Object \"System.Collections.Generic.List[$Type]\"\n}"
  },
  {
    "path": "Private/Deprecated/Objects/Remove-FromArray.ps1",
    "content": "function Remove-FromArray {\n    <#\n    .SYNOPSIS\n    Removes an element from an ArrayList.\n\n    .DESCRIPTION\n    This function removes a specified element from an ArrayList. It can remove either a specific element or the last element in the list.\n\n    .PARAMETER List\n    The ArrayList from which the element will be removed.\n\n    .PARAMETER Element\n    The element to be removed from the ArrayList.\n\n    .PARAMETER LastElement\n    If this switch is used, the last element in the ArrayList will be removed.\n\n    .EXAMPLE\n    $myList = New-Object System.Collections.ArrayList\n    $myList.Add(\"Apple\")\n    $myList.Add(\"Banana\")\n    Remove-FromArray -List $myList -Element \"Banana\"\n    # This will remove the element \"Banana\" from the ArrayList.\n\n    .EXAMPLE\n    $myList = New-Object System.Collections.ArrayList\n    $myList.Add(\"Apple\")\n    $myList.Add(\"Banana\")\n    Remove-FromArray -List $myList -LastElement\n    # This will remove the last element in the ArrayList.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [System.Collections.ArrayList] $List,\n        [Object] $Element,\n        [switch] $LastElement\n    )\n    if ($LastElement) {\n        $LastID = $List.Count - 1\n        $List.RemoveAt($LastID) > $null\n    } else {\n        $List.Remove($Element) > $null\n    }\n}"
  },
  {
    "path": "Private/Deprecated/SQL/Get-SqlQueryColumnInformation.ps1",
    "content": "function Get-SqlQueryColumnInformation {\n    <#\n    .SYNOPSIS\n    Retrieves column information for a specified table in a SQL database.\n\n    .DESCRIPTION\n    This function retrieves column information for a specified table in a SQL database using the INFORMATION_SCHEMA.COLUMNS view.\n\n    .PARAMETER SqlServer\n    The SQL Server instance where the database is located.\n\n    .PARAMETER SqlDatabase\n    The name of the SQL database.\n\n    .PARAMETER Table\n    The name of the table for which column information is to be retrieved.\n\n    .EXAMPLE\n    Get-SqlQueryColumnInformation -SqlServer \"localhost\" -SqlDatabase \"MyDatabase\" -Table \"MyTable\"\n    Retrieves column information for the table \"MyTable\" in the database \"MyDatabase\" on the SQL Server instance \"localhost\".\n\n    #>\n    [CmdletBinding()]\n    param (\n        [string] $SqlServer,\n        [string] $SqlDatabase,\n        [string] $Table\n    )\n    $Table = $Table.Replace(\"dbo.\", '').Replace('[', '').Replace(']', '') # removes dbo and [] from dbo.[Table] as INFORMATION_SCHEMA expects it without\n    $SqlDatabase = $SqlDatabase.Replace('[', '').Replace(']', '') # makes sure we know what we have\n    $SqlDatabase = \"[$SqlDatabase]\"\n    $Query = \"SELECT * FROM $SqlDatabase.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '$Table'\"\n    $SqlReturn = @(\n        try {\n            Invoke-DbaQuery -ErrorAction Stop -SqlInstance $SqlServer -Query $Query #-Verbose\n        } catch {\n            $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n            \"Error occured (Get-SqlQueryColumnInformation): $ErrorMessage\" # return of error\n        }\n    )\n    return $SQLReturn\n}"
  },
  {
    "path": "Private/Deprecated/SQL/New-SqlQuery.ps1",
    "content": "function New-SqlQuery {\n    <#\n    .SYNOPSIS\n    Creates and executes SQL queries based on provided parameters.\n\n    .DESCRIPTION\n    The New-SqlQuery function generates SQL queries for inserting data into a specified table. It adds additional fields for tracking when the data was added and by whom. The function utilizes a mapping table to map object properties to table columns.\n\n    .PARAMETER SqlSettings\n    The SQL connection settings.\n\n    .PARAMETER Object\n    The object containing data to be inserted into the SQL table.\n\n    .PARAMETER TableMapping\n    A hashtable mapping object properties to table columns.\n\n    .EXAMPLE\n    $sqlSettings = Get-SqlSettings\n    $object = [PSCustomObject]@{\n        DomainController = 'AD1.ad.evotec.xyz'\n        Action = 'Event log automatic backup'\n        BackupPath = 'C:\\Windows\\System32\\Winevt\\Logs\\Archive-Security-2018-09-25-14-12-52-658.evtx'\n        LogType = 'Security'\n        Who = 'Automatic Backup'\n        When = '2018-09-25 16:12:53'\n        EventID = '1105'\n        RecordID = '2434391'\n    }\n    $tableMapping = @{\n        DomainController = 'DomainController'\n        Action = 'Action'\n        BackupPath = 'BackupPath'\n        LogType = 'LogType'\n        Who = 'Who'\n        When = 'When'\n        EventID = 'EventID'\n        RecordID = 'RecordID'\n    }\n    New-SqlQuery -SqlSettings $sqlSettings -Object $object -TableMapping $tableMapping\n    #>\n    [CmdletBinding()]\n    param (\n        [Object] $SqlSettings,\n        [Object] $Object,\n        [Object] $TableMapping\n    )\n    <#\n    Example on how output looks like:\n    IF NOT EXISTS (\n        SELECT 1 FROM dbo.[EventsLogsClearedSecurity] WHERE [RecordID] = '2434391'\n        )\n    BEGIN\n        --INSERT INTO Users (FirstName, LastName) VALUES ('John', 'Smith')\n        INSERT INTO  dbo.[EventsLogsClearedSecurity] ( [DomainController],[Action],[BackupPath],[LogType],[Who],[When],[EventID],[RecordID],[AddedWhen],[AddedWho] ) VALUES ( 'AD1.ad.evotec.xyz','Event log automatic backup','C:\\Windows\\System32\\Winevt\\Logs\\Archive-Security-2018-09-25-14-12-52-658.evtx','Security','Automatic Backup','2018-09-25 16:12:53','1105','2434391','2018-09-25 20:49:02','przemyslaw.klys' )\n    END\n    #>\n    $ArraySQLQueries = New-ArrayList\n    if ($null -ne $Object) {\n        ## Added fields to know when event was added to SQL and by WHO (in this case TaskS Scheduler User)\n        ## Only adding when $Object exists\n        foreach ($O in $Object) {\n            $ArrayMain = New-ArrayList\n            $ArrayKeys = New-ArrayList\n            $ArrayValues = New-ArrayList\n\n            if (-not $O.AddedWhen) {\n                Add-Member -InputObject $O -MemberType NoteProperty -Name \"AddedWhen\" -Value (Get-Date) -Force\n            }\n            if (-not $O.AddedWho) {\n                Add-Member -InputObject $O -MemberType NoteProperty -Name \"AddedWho\" -Value ($Env:USERNAME) -Force\n            }\n            $DuplicateString = [System.Text.StringBuilder]::new()\n            foreach ($E in $O.PSObject.Properties) {\n                $FieldName = $E.Name\n                $FieldValue = $E.Value\n\n                foreach ($MapKey in $TableMapping.Keys) {\n                    if ($FieldName -eq $MapKey) {\n                        $MapValue = $TableMapping.$MapKey\n                        $MapValueSplit = $MapValue -Split ','\n\n\n\n                        if ($FieldValue -is [DateTime]) { $FieldValue = Get-Date $FieldValue -Format \"yyyy-MM-dd HH:mm:ss\" }\n                        if ($FieldValue -like \"*'*\") { $FieldValue = $FieldValue -Replace \"'\", \"''\" }\n                        Add-ToArray -List $ArrayKeys -Element \"[$($MapValueSplit[0])]\"\n                        if ([string]::IsNullOrWhiteSpace($FieldValue)) {\n\n                            Add-ToArray -List $ArrayValues -Element \"NULL\"\n                        } else {\n                            foreach ($ColumnName in $SqlSettings.SqlCheckBeforeInsert) {\n                                $DuplicateColumn = $ColumnName.Replace(\"[\", '').Replace(\"]\", '') # Remove [ ] for comparision\n\n                                if ($MapValueSplit[0] -eq $DuplicateColumn) {\n                                    if ($DuplicateString.Length -ne 0) {\n                                        # Means something is already in string so most likely 2nd run\n                                        $null = $DuplicateString.Append(\" AND \")\n                                    }\n                                    $null = $DuplicateString.Append(\"[$DuplicateColumn] = '$FieldValue'\")\n\n                                }\n                            }\n                            Add-ToArray -List $ArrayValues -Element \"'$FieldValue'\"\n                        }\n                    }\n                }\n            }\n            if ($ArrayKeys) {\n                if ($null -ne $SqlSettings.SqlCheckBeforeInsert -and $DuplicateString.Length -gt 0) {\n                    Add-ToArray -List $ArrayMain -Element \"IF NOT EXISTS (\"\n                    Add-ToArray -List $ArrayMain -Element \"SELECT 1 FROM \"\n                    Add-ToArray -List $ArrayMain -Element \"$($SqlSettings.SqlTable) \"\n                    Add-ToArray -List $ArrayMain -Element \"WHERE $($DuplicateString.ToString())\"\n                    Add-ToArray -List $ArrayMain -Element \")\"\n                }\n                Add-ToArray -List $ArrayMain -Element \"BEGIN\"\n                Add-ToArray -List $ArrayMain -Element \"INSERT INTO  $($SqlSettings.SqlTable) (\"\n                Add-ToArray -List $ArrayMain -Element ($ArrayKeys -join ',')\n                Add-ToArray -List $ArrayMain -Element ') VALUES ('\n                Add-ToArray -List $ArrayMain -Element ($ArrayValues -join ',')\n                Add-ToArray -List $ArrayMain -Element ')'\n                Add-ToArray -List $ArrayMain -Element \"END\"\n                Add-ToArray -List $ArraySQLQueries -Element ([string] ($ArrayMain) -replace \"`n\", \"\" -replace \"`r\", \"\")\n            }\n        }\n    }\n    return $ArraySQLQueries\n}"
  },
  {
    "path": "Private/Deprecated/SQL/New-SqlQueryAlterTable.ps1",
    "content": "function New-SqlQueryAlterTable {\n    <#\n    .SYNOPSIS\n    Creates SQL queries to add new columns to an existing table.\n\n    .DESCRIPTION\n    This function generates SQL queries to add new columns to an existing SQL table based on the provided TableMapping and ExistingColumns.\n\n    .PARAMETER SqlSettings\n    An object containing SQL connection settings.\n\n    .PARAMETER TableMapping\n    An object representing the mapping of new columns to be added. Keys are column names, values are column definitions.\n\n    .PARAMETER ExistingColumns\n    An array of existing column names in the table.\n\n    .EXAMPLE\n    $sqlSettings = Get-SqlSettings\n    $tableMapping = @{\n        \"NewColumn1\" = \"Column1Name, nvarchar(50)\"\n        \"NewColumn2\" = \"Column2Name, int\"\n    }\n    $existingColumns = @(\"Column1Name\", \"Column3Name\")\n\n    New-SqlQueryAlterTable -SqlSettings $sqlSettings -TableMapping $tableMapping -ExistingColumns $existingColumns\n    # Generates SQL queries to add \"NewColumn1\" and \"NewColumn2\" to the table.\n\n    #>\n    [CmdletBinding()]\n    param (\n        [Object]$SqlSettings,\n        [Object]$TableMapping,\n        [string[]] $ExistingColumns\n    )\n    $ArraySQLQueries = New-ArrayList\n    $ArrayMain = New-ArrayList\n    $ArrayKeys = New-ArrayList\n\n    foreach ($MapKey in $TableMapping.Keys) {\n        $MapValue = $TableMapping.$MapKey\n        $Field = $MapValue -Split ','\n\n\n        if ($ExistingColumns -notcontains $MapKey -and $ExistingColumns -notcontains $Field[0]) {\n            if ($Field.Count -eq 1) {\n                Add-ToArray -List $ArrayKeys -Element \"[$($Field[0])] [nvarchar](max) NULL\"\n            } elseif ($Field.Count -eq 2) {\n                Add-ToArray -List $ArrayKeys -Element \"[$($Field[0])] $($Field[1]) NULL\"\n            } elseif ($Field.Count -eq 3) {\n                Add-ToArray -List $ArrayKeys -Element \"[$($Field[0])] $($Field[1]) $($Field[2])\"\n            }\n        }\n    }\n\n    if ($ArrayKeys) {\n        Add-ToArray -List $ArrayMain -Element \"ALTER TABLE $($SqlSettings.SqlTable) ADD\"\n        Add-ToArray -List $ArrayMain -Element ($ArrayKeys -join ',')\n        Add-ToArray -List $ArrayMain -Element ';'\n        Add-ToArray -List $ArraySQLQueries -Element ([string] ($ArrayMain) -replace \"`n\", \"\" -replace \"`r\", \"\")\n    }\n    return $ArraySQLQueries\n}"
  },
  {
    "path": "Private/Deprecated/SQL/New-SqlQueryCreateTable.ps1",
    "content": "function New-SqlQueryCreateTable {\n    <#\n    .SYNOPSIS\n    Creates SQL query to generate a new table based on provided table mapping.\n\n    .DESCRIPTION\n    This function generates a SQL query to create a new table in a database based on the table mapping provided. The table mapping should be a hashtable where the keys represent the column names and the values represent the column data types and constraints.\n\n    .PARAMETER SqlSettings\n    An object containing SQL connection settings.\n\n    .PARAMETER TableMapping\n    A hashtable containing the mapping of column names to data types and constraints.\n\n    .EXAMPLE\n    $sqlSettings = @{ SqlTable = \"MyTable\" }\n    $tableMapping = @{\n        Column1 = \"int\",\n        Column2 = \"nvarchar(50) NULL\",\n        Column3 = \"datetime NOT NULL\"\n    }\n    New-SqlQueryCreateTable -SqlSettings $sqlSettings -TableMapping $tableMapping\n    #>\n    [CmdletBinding()]\n    param (\n        [Object]$SqlSettings,\n        [Object]$TableMapping\n    )\n    $ArraySQLQueries = New-ArrayList\n    $ArrayMain = New-ArrayList\n    $ArrayKeys = New-ArrayList\n\n    foreach ($MapKey in $TableMapping.Keys) {\n        $MapValue = $TableMapping.$MapKey\n        $Field = $MapValue -Split ','\n        if ($Field.Count -eq 1) {\n            Add-ToArray -List $ArrayKeys -Element \"[$($Field[0])] [nvarchar](max) NULL\"\n        } elseif ($Field.Count -eq 2) {\n            Add-ToArray -List $ArrayKeys -Element \"[$($Field[0])] $($Field[1]) NULL\"\n        } elseif ($Field.Count -eq 3) {\n            Add-ToArray -List $ArrayKeys -Element \"[$($Field[0])] $($Field[1]) $($Field[2])\"\n        }\n    }\n    if ($ArrayKeys) {\n        Add-ToArray -List $ArrayMain -Element \"CREATE TABLE $($SqlSettings.SqlTable) (\"\n        Add-ToArray -List $ArrayMain -Element \"ID int IDENTITY(1,1) PRIMARY KEY,\"\n        Add-ToArray -List $ArrayMain -Element ($ArrayKeys -join ',')\n        Add-ToArray -List $ArrayMain -Element ')'\n        Add-ToArray -List $ArraySQLQueries -Element ([string] ($ArrayMain) -replace \"`n\", \"\" -replace \"`r\", \"\")\n    }\n    return $ArraySQLQueries\n}"
  },
  {
    "path": "Private/Deprecated/SQL/New-SqlTableMapping.ps1",
    "content": "function New-SqlTableMapping {\n    <#\n    .SYNOPSIS\n    Creates a new SQL table mapping based on the provided parameters.\n\n    .DESCRIPTION\n    This function creates a new SQL table mapping based on the provided parameters. It generates a mapping for each property in the object based on its data type.\n\n    .PARAMETER SqlTableMapping\n    The existing SQL table mapping to update.\n\n    .PARAMETER Object\n    The object for which the SQL table mapping is being created.\n\n    .PARAMETER Properties\n    The properties of the object for which the SQL table mapping is being created.\n\n    .PARAMETER BasedOnSqlTable\n    Indicates whether the mapping should be based on an existing SQL table.\n\n    .EXAMPLE\n    $sqlTableMapping = New-SqlTableMapping -Object $myObject -Properties $myProperties\n\n    Creates a new SQL table mapping for the object $myObject using the properties $myProperties.\n\n    .EXAMPLE\n    $sqlTableMapping = New-SqlTableMapping -SqlTableMapping $existingMapping -Object $myObject -Properties $myProperties -BasedOnSqlTable\n\n    Updates the existing SQL table mapping $existingMapping based on the object $myObject and its properties $myProperties.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [Object] $SqlTableMapping,\n        [Object] $Object,\n        $Properties,\n        [switch] $BasedOnSqlTable\n    )\n    if ($SqlTableMapping) {\n        $TableMapping = $SqlTableMapping\n    } else {\n        $TableMapping = @{}\n        if ($BasedOnSqlTable) {\n            foreach ($Property in $Properties) {\n                $FieldName = $Property\n                $FieldNameSql = $Property\n                $TableMapping.$FieldName = $FieldNameSQL\n            }\n        } else {\n            # Gets the highest object\n            foreach ($O in $Properties.HighestObject) {\n                # goes thru properties (but not properties of highest object but for all properties of all objects\n                # if there is value it will use the ones from highest object if not it will utilize nvarchar\n\n                foreach ($Property in $Properties.Properties) {\n\n                    #foreach ($E in $O.PSObject.Properties) {\n                    $FieldName = $Property\n                    $FieldValue = $O.$Property\n\n                    $FieldNameSQL = $FieldName.Replace(' ', '') #.Replace('-', '')\n\n                    if ($FieldValue -is [DateTime]) {\n                        $TableMapping.$FieldName = \"$FieldNameSQL,[datetime],null\"\n                        #Write-Verbose \"New-SqlTableMapping - FieldName: $FieldName FieldValue: $FieldValue FieldNameSQL: $FieldNameSQL FieldDataType: DateTime\"\n                    } elseif ($FieldValue -is [int] -or $FieldValue -is [Int64]) {\n                        $TableMapping.$FieldName = \"$FieldNameSQL,[bigint]\"\n                        # Write-Verbose \"New-SqlTableMapping - FieldName: $FieldName FieldValue: $FieldValue FieldNameSQL: $FieldNameSQL FieldDataType: BigInt\"\n                    } elseif ($FieldValue -is [bool]) {\n                        $TableMapping.$FieldName = \"$FieldNameSQL,[bit]\"\n                        #Write-Verbose \"New-SqlTableMapping - FieldName: $FieldName FieldValue: $FieldValue FieldNameSQL: $FieldNameSQL FieldDataType: Bit/Bool\"\n                    } else {\n                        $TableMapping.$FieldName = \"$FieldNameSQL\"\n                        #Write-Verbose \"New-SqlTableMapping - FieldName: $FieldName FieldValue: $FieldValue FieldNameSQL: $FieldNameSQL FieldDataType: NvarChar\"\n                    }\n                }\n            }\n        }\n    }\n    #Write-Verbose 'New-SqlTableMapping - Ending'\n    return $TableMapping\n}"
  },
  {
    "path": "Private/Deprecated/SQL/Send-SqlInsert.ps1",
    "content": "function Send-SqlInsert {\n    <#\n    .SYNOPSIS\n    Send data to a SQL table with optional table creation and alteration capabilities.\n\n    .DESCRIPTION\n    This function sends data to a specified SQL table. It provides options for table creation and alteration based on the provided settings.\n\n    .PARAMETER Object\n    Array of objects to be inserted into the SQL table.\n\n    .PARAMETER SqlSettings\n    Dictionary containing SQL server, database, and table information along with optional settings for table operations.\n\n    .EXAMPLE\n    Send-SqlInsert -Object $DataArray -SqlSettings $SqlConfig\n\n    .NOTES\n    General notes\n    #>\n    [CmdletBinding()]\n    param(\n        [Array] $Object,\n        [System.Collections.IDictionary] $SqlSettings\n    )\n    if ($SqlSettings.SqlTableTranspose) {\n        $Object = Format-TransposeTable -Object $Object\n    }\n    $SqlTable = Get-SqlQueryColumnInformation -SqlServer $SqlSettings.SqlServer -SqlDatabase $SqlSettings.SqlDatabase -Table $SqlSettings.SqlTable\n    $PropertiesFromAllObject = Get-ObjectPropertiesAdvanced -Object $Object -AddProperties 'AddedWhen', 'AddedWho'\n    $PropertiesFromTable = $SqlTable.Column_name\n\n    if ($null -eq $SqlTable) {\n        if ($SqlSettings.SqlTableCreate) {\n            Write-Verbose \"Send-SqlInsert - SqlTable doesn't exists, table creation is allowed, mapping will be done either on properties from object or from TableMapping defined in config\"\n            $TableMapping = New-SqlTableMapping -SqlTableMapping $SqlSettings.SqlTableMapping -Object $Object -Properties $PropertiesFromAllObject\n            $CreateTableSQL = New-SqlQueryCreateTable -SqlSettings $SqlSettings -TableMapping $TableMapping\n        } else {\n            Write-Verbose \"Send-SqlInsert - SqlTable doesn't exists, no table creation is allowed. Terminating\"\n            return \"Error occured: SQL Table doesn't exists. SqlTableCreate option is disabled\"\n        }\n    } else {\n        if ($SqlSettings.SqlTableAlterIfNeeded) {\n            if ( $SqlSettings.SqlTableMapping) {\n                Write-Verbose \"Send-SqlInsert - Sql Table exists, Alter is allowed, but SqlTableMapping is already defined\"\n                $TableMapping = New-SqlTableMapping -SqlTableMapping $SqlSettings.SqlTableMapping -Object $Object -Properties $PropertiesFromAllObject\n            } else {\n                Write-Verbose \"Send-SqlInsert - Sql Table exists, Alter is allowed, and SqlTableMapping is not defined\"\n                $TableMapping = New-SqlTableMapping -SqlTableMapping $SqlSettings.SqlTableMapping -Object $Object -Properties $PropertiesFromAllObject\n                $AlterTableSQL = New-SqlQueryAlterTable -SqlSettings $SqlSettings -TableMapping $TableMapping -ExistingColumns $SqlTable.Column_name\n            }\n        } else {\n            if ( $SqlSettings.SqlTableMapping) {\n                Write-Verbose \"Send-SqlInsert - Sql Table exists, Alter is not allowed, SqlTableMaping is already defined\"\n                $TableMapping = New-SqlTableMapping -SqlTableMapping $SqlSettings.SqlTableMapping -Object $Object -Properties $PropertiesFromAllObject\n            } else {\n                Write-Verbose \"Send-SqlInsert - Sql Table exists, Alter is not allowed, SqlTableMaping is not defined, using SqlTable Columns\"\n                $TableMapping = New-SqlTableMapping -SqlTableMapping $SqlSettings.SqlTableMapping -Object $Object -Properties $PropertiesFromTable -BasedOnSqlTable\n            }\n        }\n    }\n    $Queries = @(\n        if ($CreateTableSQL) {\n            foreach ($Sql in $CreateTableSQL) {\n                $Sql\n            }\n        }\n        if ($AlterTableSQL) {\n            foreach ($Sql in $AlterTableSQL) {\n                $Sql\n            }\n        }\n        $SqlQueries = New-SqlQuery -Object $Object -SqlSettings $SqlSettings -TableMapping $TableMapping\n        foreach ($Sql in $SqlQueries) {\n            $Sql\n        }\n    )\n\n    $ReturnData = foreach ($Query in $Queries) {\n        try {\n            if ($Query) {\n                $Query # return query to log\n                Invoke-DbaQuery -SqlInstance \"$($SqlSettings.SqlServer)\" -Database \"$($SqlSettings.SqlDatabase)\" -Query $Query -ErrorAction Stop # return output\n            }\n        } catch {\n            $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n            \"Error occured (Send-SqlInsert): $ErrorMessage\" # return data\n        }\n    }\n    return $ReturnData\n}"
  },
  {
    "path": "Private/Get-ComputerSMBInfo.ps1",
    "content": "﻿function Get-ComputerSMBInfo {\n    <#\n    .SYNOPSIS\n    Retrieves information about SMB shares on a remote computer.\n\n    .DESCRIPTION\n    This function retrieves information about SMB shares on a remote computer using the NetShareEnum method.\n\n    .PARAMETER ComputerName\n    Specifies the name of the remote computer to retrieve SMB share information from.\n\n    .PARAMETER Name\n    Specifies an array of share names to filter the results. If not specified, all shares will be retrieved.\n\n    .PARAMETER SkipDiskSpace\n    Indicates whether to skip retrieving disk space information for each share.\n\n    .EXAMPLE\n    Get-ComputerSMBInfo -ComputerName \"Server01\"\n\n    Description:\n    Retrieves all SMB share information from the remote computer \"Server01\".\n\n    .EXAMPLE\n    Get-ComputerSMBInfo -ComputerName \"Server01\" -Name \"Data\"\n\n    Description:\n    Retrieves SMB share information for the share named \"Data\" on the remote computer \"Server01\".\n\n    .NOTES\n    File Name      : Get-ComputerSMBInfo.ps1\n    Prerequisite   : This function requires administrative privileges on the remote computer.\n    #>\n    [cmdletbinding()]\n    param(\n        [string] $ComputerName,\n        [string[]] $Name,\n        [switch] $SkipDiskSpace #,\n        # [System.Management.Automation.PSCmdlet]$PSC\n    )\n    $buffer = [IntPtr]::Zero\n    $read = 0\n    $total = 0\n    $resume = 0\n\n    $res = [Win32Share.NativeMethods]::NetShareEnum(\n        $ComputerName,\n        1, # SHARE_INFO_1\n        [ref]$buffer,\n        ([UInt32]\"0xFFFFFFFF\"), # MAX_PREFERRED_LENGTH\n        [ref]$read,\n        [ref]$total,\n        [ref]$resume\n    )\n\n    if ($res -ne 0) {\n        $exp = [System.ComponentModel.Win32Exception]$res\n        $er = [System.Management.Automation.ErrorRecord]::new(\n            $exp,\n            'Win32Share.NativeMethods.GetSmbInf.RemoteException',\n            [System.Management.Automation.ErrorCategory]::NotSpecified,\n            $ComputerName\n        )\n        $er.ErrorDetails = \"Failed to enum share for '$ComputerName': $($exp.Message)\"\n        if ($ErrorActionPreference -eq 'Stop') {\n            Write-Error -ErrorRecord $er\n        } else {\n            Write-Warning -Message \"Get-ComputerSMBShareList - Failed to enumarate share on '$ComputerName'.\"\n        }\n        return\n    }\n    try {\n        $entryPtr = $buffer\n        for ($i = 0; $i -lt $total; $i++) {\n            $shareInfo = [System.Runtime.InteropServices.Marshal]::PtrToStructure($entryPtr, [Type]([Win32Share.NativeHelpers+SHARE_INFO_1]))\n\n            $netNm = $shareInfo.shi1_netname\n            if ($Name) {\n                $isLike = $false\n                foreach ($nm in $Name) {\n                    if ($netNm -like $nm) {\n                        $isLike = $true\n                        continue\n                    }\n                }\n                if (-not $isLike) {\n                    $entryPtr = [IntPtr]::Add($entryPtr, [System.Runtime.InteropServices.Marshal]::SizeOf($shareInfo))\n                    continue\n                }\n            }\n            $shTyp = $shareInfo.shi1_type\n            # API below requires an ending backslash\n            $shrPath = \"\\\\$ComputerName\\$netNm\\\"\n            if (-not $SkipDiskSpace) {\n                $freeBytesAvailableToCaller = 0\n                [System.Nullable[UInt64]]$freeBytesAvailableToCallerNull = $null\n                $totalNumberOfBytes = 0\n                [System.Nullable[UInt64]]$totalNumberOfBytesNull = $null\n                $totalNumberOfFreeBytes = 0\n                [System.Nullable[UInt64]]$totalNumberOfFreeBytesNull = $null\n                $lastWin32Error = 0\n\n                if (($shTyp -bor [Win32Share.ShareType]::Disk) -eq [Win32Share.ShareType]::Disk) {\n                    $dskRes = [Win32Share.NativeMethods]::GetDiskFreeSpaceEx(\n                        $shrPath,\n                        [ref]$freeBytesAvailableToCaller,\n                        [ref]$totalNumberOfBytes,\n                        [ref]$totalNumberOfFreeBytes\n                    )\n                    if ($dskRes) {\n                        $freeBytesAvailableToCallerNull = $freeBytesAvailableToCaller\n                        $totalNumberOfBytesNull = $totalNumberOfBytes\n                        $totalNumberOfFreeBytesNull = $totalNumberOfFreeBytes\n                    } else {\n                        # https://stackoverflow.com/questions/17918266/winapi-getlasterror-vs-marshal-getlastwin32error\n                        $lastWin32Error = [System.Runtime.InteropServices.Marshal]::GetLastWin32Error()\n                        $exp = [System.ComponentModel.Win32Exception]$lastWin32Error\n                        $er = [System.Management.Automation.ErrorRecord]::new(\n                            $exp,\n                            'Win32Share.NativeMethods.GetSmbInf.ShareException',\n                            [System.Management.Automation.ErrorCategory]::NotSpecified,\n                            $shrPath\n                        )\n                        $er.ErrorDetails = \"Failed to get disk space on '$shrPath' for '$ComputerName': $($exp.Message)\"\n                        #$PSC.WriteError( $er )\n                        if ($ErrorActionPreference -eq 'Stop') {\n                            Write-Error -ErrorRecord $er\n                        } else {\n                            Write-Warning -Message \"Get-ComputerSMBShareList - Failed to get disk space on '$shrPath' for '$ComputerName': $($exp.Message)\"\n                        }\n                    }\n                }\n                [PSCustomObject]@{\n                    PSTypeName               = 'Win32Share.NativeMethods' # Used in Formatter\n                    ComputerName             = $ComputerName\n                    Path                     = $shrPath\n                    Name                     = $netNm\n                    Type                     = $shTyp\n                    Remark                   = $shareInfo.shi1_remark\n                    TotalBytes               = $totalNumberOfBytesNull\n                    TotalFreeBytes           = $totalNumberOfFreeBytesNull\n                    FreeBytesAvailableToUser = $freeBytesAvailableToCallerNull\n                }\n            } else {\n                [PSCustomObject]@{\n                    PSTypeName   = 'Win32Share.NativeMethods' # Used in Formatter\n                    ComputerName = $ComputerName\n                    Path         = $shrPath\n                    Name         = $netNm\n                    Type         = $shTyp\n                    Remark       = $shareInfo.shi1_remark\n                }\n            }\n\n            $entryPtr = [IntPtr]::Add($entryPtr, [System.Runtime.InteropServices.Marshal]::SizeOf($shareInfo))\n        }\n    } finally {\n        $null = [Win32Share.NativeMethods]::NetApiBufferFree($buffer)\n    }\n}"
  },
  {
    "path": "Private/Get-ComputerSplit.ps1",
    "content": "﻿function Get-ComputerSplit {\n    <#\n    .SYNOPSIS\n    This function splits the list of computer names provided into two arrays: one containing remote computers and another containing the local computer.\n\n    .DESCRIPTION\n    The Get-ComputerSplit function takes an array of computer names as input and splits them into two arrays based on whether they are remote computers or the local computer. It determines the local computer by comparing the provided computer names with the local computer name and DNS name.\n\n    .PARAMETER ComputerName\n    Specifies an array of computer names to split into remote and local computers.\n\n    .EXAMPLE\n    Get-ComputerSplit -ComputerName \"Computer1\", \"Computer2\", $Env:COMPUTERNAME\n    This example splits the computer names \"Computer1\" and \"Computer2\" into the remote computers array and the local computer array based on the local computer's name.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string[]] $ComputerName\n    )\n    if ($null -eq $ComputerName) {\n        $ComputerName = $Env:COMPUTERNAME\n    }\n    try {\n        $LocalComputerDNSName = [System.Net.Dns]::GetHostByName($Env:COMPUTERNAME).HostName\n    } catch {\n        $LocalComputerDNSName = $Env:COMPUTERNAME\n    }\n    $ComputersLocal = $null\n    [Array] $Computers = foreach ($Computer in $ComputerName) {\n        if ($Computer -eq '' -or $null -eq $Computer) {\n            $Computer = $Env:COMPUTERNAME\n        }\n        if ($Computer -ne $Env:COMPUTERNAME -and $Computer -ne $LocalComputerDNSName) {\n            $Computer\n        } else {\n            $ComputersLocal = $Computer\n        }\n    }\n    , @($ComputersLocal, $Computers)\n}"
  },
  {
    "path": "Private/Get-IPRange.ps1",
    "content": "﻿function Get-IPRange {\n    <#\n    .SYNOPSIS\n    Generates a list of IP addresses within a specified binary range.\n\n    .DESCRIPTION\n    This function takes two binary strings representing the start and end IP addresses and generates a list of IP addresses within that range.\n\n    .PARAMETER StartBinary\n    Specifies the starting IP address in binary format.\n\n    .PARAMETER EndBinary\n    Specifies the ending IP address in binary format.\n\n    .EXAMPLE\n    Get-IPRange -StartBinary '11000000' -EndBinary '11000010'\n    Description:\n    Generates a list of IP addresses between '192.0.0.0' and '192.0.2.0'.\n\n    .EXAMPLE\n    Get-IPRange -StartBinary '10101010' -EndBinary '10101100'\n    Description:\n    Generates a list of IP addresses between '170.0.0.0' and '172.0.0.0'.\n    #>\n    [cmdletBinding()]\n    param(\n        [string] $StartBinary,\n        [string] $EndBinary\n    )\n    [int64] $StartInt = [System.Convert]::ToInt64($StartBinary, 2)\n    [int64] $EndInt = [System.Convert]::ToInt64($EndBinary, 2)\n    for ($BinaryIP = $StartInt; $BinaryIP -le $EndInt; $BinaryIP++) {\n        Convert-BinaryToIP ([System.Convert]::ToString($BinaryIP, 2).PadLeft(32, '0'))\n    }\n}"
  },
  {
    "path": "Private/Get-LocalComputerSid.ps1",
    "content": "﻿function Get-LocalComputerSid {\n    <#\n    .SYNOPSIS\n    Get the SID of the local computer.\n\n    .DESCRIPTION\n    Get the SID of the local computer.\n\n    .EXAMPLE\n    Get-LocalComputerSid\n\n    .NOTES\n    General notes\n    #>\n    [cmdletBinding()]\n    param()\n    try {\n        Add-Type -AssemblyName System.DirectoryServices.AccountManagement\n        $PrincipalContext = [System.DirectoryServices.AccountManagement.PrincipalContext]::new([System.DirectoryServices.AccountManagement.ContextType]::Machine)\n        $UserPrincipal = [System.DirectoryServices.AccountManagement.UserPrincipal]::new($PrincipalContext)\n        $Searcher = [System.DirectoryServices.AccountManagement.PrincipalSearcher]::new()\n        $Searcher.QueryFilter = $UserPrincipal\n        $User = $Searcher.FindAll()\n        foreach ($U in $User) {\n            if ($U.Sid.Value -like \"*-500\") {\n                return $U.Sid.Value.TrimEnd(\"-500\")\n            }\n        }\n    } catch {\n        Write-Warning -Message \"Get-LocalComputerSid - Error: $($_.Exception.Message)\"\n    }\n}"
  },
  {
    "path": "Private/Get-OfflineRegistryProfilesPath.ps1",
    "content": "﻿function Get-OfflineRegistryProfilesPath {\n    <#\n    .SYNOPSIS\n    Retrieves the paths of offline user profiles in the Windows registry.\n\n    .DESCRIPTION\n    This function retrieves the paths of offline user profiles in the Windows registry by comparing the profiles listed in 'HKEY_USERS' with those in 'HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList'. It then checks for the existence of the 'NTUSER.DAT' file for each profile and returns the paths of offline profiles found.\n\n    .EXAMPLE\n    Get-OfflineRegistryProfilesPath\n    Retrieves the paths of offline user profiles in the Windows registry and returns a hashtable containing the profile paths.\n\n    .NOTES\n    Name                           Value\n    ----                           -----\n    Przemek                        {[FilePath, C:\\Users\\Przemek\\NTUSER.DAT], [Status, ]}\n    test.1                         {[FilePath, C:\\Users\\test.1\\NTUSER.DAT], [Status, ]}\n\n    #>\n    [CmdletBinding()]\n    param(\n\n    )\n    $Profiles = [ordered] @{}\n    $CurrentMapping = (Get-PSRegistry -RegistryPath 'HKEY_USERS' -ExpandEnvironmentNames -DoNotUnmount).PSSubKeys\n    $UsersInSystem = (Get-PSRegistry -RegistryPath 'HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList' -ExpandEnvironmentNames -DoNotUnmount).PSSubKeys\n    $MissingProfiles = foreach ($Profile in $UsersInSystem) {\n        if ($Profile.StartsWith(\"S-1-5-21\") -and $CurrentMapping -notcontains $Profile) {\n            Get-PSRegistry -RegistryPath \"HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\$Profile\" -ExpandEnvironmentNames -DoNotUnmount\n        }\n    }\n    foreach ($Profile in $MissingProfiles) {\n        $PathToNTUser = [io.path]::Combine($Profile.ProfileImagePath, 'NTUSER.DAT')\n        $ProfileName = [io.path]::GetFileName($Profile.ProfileImagePath)\n        $StartPath = \"Offline_$ProfileName\"\n        try {\n            $PathExists = Test-Path -LiteralPath $PathToNTUser -ErrorAction Stop\n            if ($PathExists) {\n                $Profiles[$StartPath] = [ordered] @{\n                    FilePath = $PathToNTUser\n                    Status   = $null\n                }\n            }\n        } catch {\n            Write-Warning -Message \"Mount-OfflineRegistryPath - Couldn't execute. Error: $($_.Exception.Message)\"\n            continue\n        }\n\n    }\n    $Profiles\n}"
  },
  {
    "path": "Private/Get-PSConvertSpecialRegistry.ps1",
    "content": "﻿function Get-PSConvertSpecialRegistry {\n    <#\n    .SYNOPSIS\n    Converts special registry paths for specified computers.\n\n    .DESCRIPTION\n    This function converts special registry paths for the specified computers using the provided HiveDictionary.\n\n    .PARAMETER RegistryPath\n    Specifies the array of registry paths to convert.\n\n    .PARAMETER Computers\n    Specifies the array of computers to convert registry paths for.\n\n    .PARAMETER HiveDictionary\n    Specifies the dictionary containing hive keys and their corresponding values.\n\n    .PARAMETER ExpandEnvironmentNames\n    Indicates whether to expand environment names in the registry paths.\n\n    .EXAMPLE\n    Get-PSConvertSpecialRegistry -RegistryPath \"Users\\Offline_Przemek\\Software\\Policies1\\Microsoft\\Windows\\CloudContent\" -Computers \"Computer1\", \"Computer2\" -HiveDictionary $HiveDictionary -ExpandEnvironmentNames\n\n    Converts the specified registry path for the specified computers using the provided HiveDictionary.\n\n    #>\n    [cmdletbinding()]\n    param(\n        [Array] $RegistryPath,\n        [Array] $Computers,\n        [System.Collections.IDictionary] $HiveDictionary,\n        [switch] $ExpandEnvironmentNames\n    )\n    $FixedPath = foreach ($R in $RegistryPath) {\n        foreach ($DictionaryKey in $HiveDictionary.Keys) {\n            $SplitParts = $R.Split(\"\\\")\n            $FirstPart = $SplitParts[0]\n            if ($FirstPart -eq $DictionaryKey) {\n                #if ($R.StartsWith($DictionaryKey, [System.StringComparison]::CurrentCultureIgnoreCase)) {\n                if ($HiveDictionary[$DictionaryKey] -in 'All', 'All+Default', 'Default', 'AllDomain+Default', 'AllDomain', 'AllDomain+Other', 'AllDomain+Other+Default') {\n                    foreach ($Computer in $Computers) {\n                        $SubKeys = Get-PSRegistry -RegistryPath \"HKEY_USERS\" -ComputerName $Computer -ExpandEnvironmentNames:$ExpandEnvironmentNames.IsPresent -DoNotUnmount\n                        if ($SubKeys.PSSubKeys) {\n                            $RegistryKeys = ConvertTo-HKeyUser -SubKeys ($SubKeys.PSSubKeys | Sort-Object) -HiveDictionary $HiveDictionary -DictionaryKey $DictionaryKey -RegistryPath $R\n                            foreach ($S in $RegistryKeys) {\n                                [PSCustomObject] @{\n                                    ComputerName = $Computer\n                                    RegistryPath = $S\n                                    Error        = $null\n                                    ErrorMessage = $null\n                                }\n                            }\n                        } else {\n                            [PSCustomObject] @{\n                                ComputerName = $Computer\n                                RegistryPath = $R\n                                Error        = $true\n                                ErrorMessage = \"Couldn't connect to $Computer to list HKEY_USERS\"\n                            }\n                        }\n                    }\n                } elseif ($FirstPart -in 'Users', 'HKEY_USERS', 'HKU' -and $SplitParts[1] -and $SplitParts[1] -like \"Offline_*\") {\n                    # this is a special keys to handle for offline users\n                    # 'Users\\Offline_Przemek\\Software\\Policies1\\Microsoft\\Windows\\CloudContent' -Key 'DisableTailoredExperiencesWithDiagnosticData'\n                    # 'HKU\\Offline_Przemek\\Software\\Policies1\\Microsoft\\Windows\\CloudContent' -Key 'DisableWindowsConsumerFeatures'\n                    # 'Users\\Offline_test.1\\Software\\Policies1\\Microsoft\\Windows\\CloudContent' -Key 'DisableTailoredExperiencesWithDiagnosticData'\n                    foreach ($Computer in $Computers) {\n                        $SubKeys = Get-PSRegistry -RegistryPath \"HKEY_USERS\" -ComputerName $Computer -ExpandEnvironmentNames:$ExpandEnvironmentNames.IsPresent -DoNotUnmount\n                        if ($SubKeys.PSSubKeys) {\n                            $RegistryKeys = ConvertTo-HKeyUser -SubKeys ($SubKeys.PSSubKeys + $SplitParts[1] | Sort-Object) -HiveDictionary $HiveDictionary -DictionaryKey $DictionaryKey -RegistryPath $R\n                            foreach ($S in $RegistryKeys) {\n                                [PSCustomObject] @{\n                                    ComputerName = $Computer\n                                    RegistryPath = $S\n                                    Error        = $null\n                                    ErrorMessage = $null\n                                }\n                            }\n                        } else {\n                            [PSCustomObject] @{\n                                ComputerName = $Computer\n                                RegistryPath = $R\n                                Error        = $true\n                                ErrorMessage = \"Couldn't connect to $Computer to list HKEY_USERS\"\n                            }\n                        }\n                    }\n                } else {\n                    $R\n                }\n                break\n            }\n        }\n    }\n    $FixedPath\n}"
  },
  {
    "path": "Private/Get-PSSubRegistry.ps1",
    "content": "﻿function Get-PSSubRegistry {\n    <#\n    .SYNOPSIS\n    Retrieves a subkey from the Windows Registry on a local or remote computer.\n\n    .DESCRIPTION\n    The Get-PSSubRegistry function retrieves a subkey from the Windows Registry on a local or remote computer. It can be used to access specific registry keys and their values.\n\n    .PARAMETER Registry\n    Specifies the registry key to retrieve. This parameter should be an IDictionary object containing information about the registry key.\n\n    .PARAMETER ComputerName\n    Specifies the name of the computer from which to retrieve the registry key. This parameter is optional and defaults to the local computer.\n\n    .PARAMETER Remote\n    Indicates that the registry key should be retrieved from a remote computer.\n\n    .PARAMETER ExpandEnvironmentNames\n    Indicates whether environment variable names in the registry key should be expanded.\n\n    .EXAMPLE\n    Get-PSSubRegistry -Registry $Registry -ComputerName \"RemoteComputer\" -Remote\n    Retrieves a subkey from the Windows Registry on a remote computer named \"RemoteComputer\".\n\n    .EXAMPLE\n    Get-PSSubRegistry -Registry $Registry -ExpandEnvironmentNames\n    Retrieves a subkey from the Windows Registry on the local computer with expanded environment variable names.\n\n    #>\n    [cmdletBinding()]\n    param(\n        [System.Collections.IDictionary] $Registry,\n        [string] $ComputerName,\n        [switch] $Remote,\n        [switch] $ExpandEnvironmentNames\n    )\n    if ($Registry.ComputerName) {\n        if ($Registry.ComputerName -ne $ComputerName) {\n            return\n        }\n    }\n    if (-not $Registry.Error) {\n        try {\n            if ($Remote) {\n                $BaseHive = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($Registry.HiveKey, $ComputerName, 0 )\n            } else {\n                $BaseHive = [Microsoft.Win32.RegistryKey]::OpenBaseKey($Registry.HiveKey, 0 )\n            }\n            $PSConnection = $true\n            $PSError = $null\n        } catch {\n            $PSConnection = $false\n            $PSError = $($_.Exception.Message)\n        }\n    } else {\n        # this should happen if we weren't able to get registry keys in Get-PSConvertSpecialRegistry for HKEY_USERS\n        $PSConnection = $false\n        $PSError = $($Registry.ErrorMessage)\n    }\n    if ($PSError) {\n        [PSCustomObject] @{\n            PSComputerName = $ComputerName\n            PSConnection   = $PSConnection\n            PSError        = $true\n            PSErrorMessage = $PSError\n            PSPath         = $Registry.Registry\n            PSKey          = $Registry.Key\n            PSValue        = $null\n            PSType         = $null\n        }\n    } else {\n        try {\n            $SubKey = $BaseHive.OpenSubKey($Registry.SubKeyName, $false)\n            if ($null -ne $SubKey) {\n                [PSCustomObject] @{\n                    PSComputerName = $ComputerName\n                    PSConnection   = $PSConnection\n                    PSError        = $false\n                    PSErrorMessage = $null\n                    PSPath         = $Registry.Registry\n                    PSKey          = $Registry.Key\n                    PSValue        = if (-not $ExpandEnvironmentNames) {\n                        $SubKey.GetValue($Registry.Key, $null, [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames)\n                    } else {\n                        $SubKey.GetValue($Registry.Key)\n                    }\n                    PSType         = $SubKey.GetValueKind($Registry.Key)\n                }\n            } else {\n                [PSCustomObject] @{\n                    PSComputerName = $ComputerName\n                    PSConnection   = $PSConnection\n                    PSError        = $true\n                    PSErrorMessage = \"Registry path $($Registry.Registry) doesn't exists.\"\n                    PSPath         = $Registry.Registry\n                    PSKey          = $Registry.Key\n                    PSValue        = $null\n                    PSType         = $null\n                }\n            }\n        } catch {\n            [PSCustomObject] @{\n                PSComputerName = $ComputerName\n                PSConnection   = $PSConnection\n                PSError        = $true\n                PSErrorMessage = $_.Exception.Message\n                PSPath         = $Registry.Registry\n                PSKey          = $Registry.Key\n                PSValue        = $null\n                PSType         = $null\n            }\n        }\n    }\n    if ($null -ne $SubKey) {\n        $SubKey.Close()\n        $SubKey.Dispose()\n    }\n    if ($null -ne $BaseHive) {\n        $BaseHive.Close()\n        $BaseHive.Dispose()\n    }\n}"
  },
  {
    "path": "Private/Get-PSSubRegistryComplete.ps1",
    "content": "﻿function Get-PSSubRegistryComplete {\n    <#\n    .SYNOPSIS\n    Retrieves sub-registry information from a specified registry key.\n\n    .DESCRIPTION\n    This function retrieves sub-registry information from a specified registry key on a local or remote computer.\n\n    .PARAMETER Registry\n    Specifies the registry key information to retrieve.\n\n    .PARAMETER ComputerName\n    Specifies the name of the computer from which to retrieve the registry information.\n\n    .PARAMETER Remote\n    Indicates whether the registry key is located on a remote computer.\n\n    .PARAMETER Advanced\n    Indicates whether to retrieve advanced registry information.\n\n    .PARAMETER ExpandEnvironmentNames\n    Indicates whether to expand environment variable names in the registry.\n\n    .EXAMPLE\n    Get-PSSubRegistryComplete -Registry $Registry -ComputerName \"Computer01\" -Remote -Advanced\n    Retrieves advanced sub-registry information from the specified registry key on a remote computer named \"Computer01\".\n\n    .EXAMPLE\n    Get-PSSubRegistryComplete -Registry $Registry -ComputerName \"Computer02\"\n    Retrieves sub-registry information from the specified registry key on a local computer named \"Computer02\".\n    #>\n    [cmdletBinding()]\n    param(\n        [System.Collections.IDictionary] $Registry,\n        [string] $ComputerName,\n        [switch] $Remote,\n        [switch] $Advanced,\n        [switch] $ExpandEnvironmentNames\n    )\n    if ($Registry.ComputerName) {\n        if ($Registry.ComputerName -ne $ComputerName) {\n            return\n        }\n    }\n    if (-not $Registry.Error) {\n        try {\n            if ($Remote) {\n                $BaseHive = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($Registry.HiveKey, $ComputerName, 0 )\n            } else {\n                $BaseHive = [Microsoft.Win32.RegistryKey]::OpenBaseKey($Registry.HiveKey, 0 )\n            }\n            $PSConnection = $true\n            $PSError = $null\n        } catch {\n            $PSConnection = $false\n            $PSError = $($_.Exception.Message)\n        }\n    } else {\n        # this should happen if we weren't able to get registry keys in Get-PSConvertSpecialRegistry for HKEY_USERS\n        $PSConnection = $false\n        $PSError = $($Registry.ErrorMessage)\n    }\n    if ($PSError) {\n        [PSCustomObject] @{\n            PSComputerName = $ComputerName\n            PSConnection   = $PSConnection\n            PSError        = $true\n            PSErrorMessage = $PSError\n            PSSubKeys      = $null\n            PSPath         = $Registry.Registry\n            PSKey          = $Registry.Key\n        }\n    } else {\n        try {\n            $SubKey = $BaseHive.OpenSubKey($Registry.SubKeyName, $false)\n            if ($null -ne $SubKey) {\n                $Object = [ordered] @{\n                    PSComputerName = $ComputerName\n                    PSConnection   = $PSConnection\n                    PSError        = $false\n                    PSErrorMessage = $null\n                    PSSubKeys      = $SubKey.GetSubKeyNames()\n                    PSPath         = $Registry.Registry\n                }\n                $Keys = $SubKey.GetValueNames()\n                foreach ($K in $Keys) {\n                    if ($K -eq \"\") {\n                        if ($Advanced) {\n                            $Object['DefaultKey'] = [ordered] @{\n                                Value = if (-not $ExpandEnvironmentNames) {\n                                    $SubKey.GetValue($K, $null, [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames)\n                                } else {\n                                    $SubKey.GetValue($K)\n                                }\n                                Type  = $SubKey.GetValueKind($K)\n                            }\n                        } else {\n                            $Object['DefaultKey'] = $SubKey.GetValue($K)\n                        }\n                    } else {\n                        if ($Advanced) {\n                            $Object[$K] = [ordered] @{\n                                Value = if (-not $ExpandEnvironmentNames) {\n                                    $SubKey.GetValue($K, $null, [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames)\n                                } else {\n                                    $SubKey.GetValue($K)\n                                }\n                                Type  = $SubKey.GetValueKind($K)\n                            }\n                        } else {\n                            $Object[$K] = if (-not $ExpandEnvironmentNames) {\n                                $SubKey.GetValue($K, $null, [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames)\n                            } else {\n                                $SubKey.GetValue($K)\n                            }\n                        }\n                    }\n                }\n                [PSCustomObject] $Object\n            } else {\n                [PSCustomObject] @{\n                    PSComputerName = $ComputerName\n                    PSConnection   = $PSConnection\n                    PSError        = $true\n                    PSErrorMessage = \"Registry path $($Registry.Registry) doesn't exists.\"\n                    PSSubKeys      = $null\n                    PSPath         = $Registry.Registry\n                }\n            }\n        } catch {\n            [PSCustomObject] @{\n                PSComputerName = $ComputerName\n                PSConnection   = $PSConnection\n                PSError        = $true\n                PSErrorMessage = $_.Exception.Message\n                PSSubKeys      = $null\n                PSPath         = $Registry.Registry\n            }\n        }\n    }\n    if ($null -ne $SubKey) {\n        $SubKey.Close()\n        $SubKey.Dispose()\n    }\n    if ($null -ne $BaseHive) {\n        $BaseHive.Close()\n        $BaseHive.Dispose()\n    }\n}"
  },
  {
    "path": "Private/Get-PSSubRegistryTranslated.ps1",
    "content": "﻿function Get-PSSubRegistryTranslated {\n    <#\n    .SYNOPSIS\n    Retrieves the translated sub-registry information based on the provided RegistryPath, HiveDictionary, and Key.\n\n    .DESCRIPTION\n    This function retrieves the translated sub-registry information by matching the RegistryPath with the HiveDictionary. It returns an ordered hashtable with details such as Registry, HiveKey, SubKeyName, Key, Error, and ErrorMessage.\n\n    .PARAMETER RegistryPath\n    Specifies an array of registry paths to be translated.\n\n    .PARAMETER HiveDictionary\n    Specifies a dictionary containing mappings of hive names to their corresponding keys.\n\n    .PARAMETER Key\n    Specifies a string key to be included in the output.\n\n    .EXAMPLE\n    Get-PSSubRegistryTranslated -RegistryPath \"HKLM\\Software\\Microsoft\" -HiveDictionary @{ \"HKLM\" = \"HKEY_LOCAL_MACHINE\" } -Key \"Version\"\n    Retrieves the translated sub-registry information for the specified registry path under HKEY_LOCAL_MACHINE hive with the key \"Version\".\n\n    .EXAMPLE\n    Get-PSSubRegistryTranslated -RegistryPath \"HKCU\\Software\\Microsoft\" -HiveDictionary @{ \"HKCU\" = \"HKEY_CURRENT_USER\" }\n    Retrieves the translated sub-registry information for the specified registry path under HKEY_CURRENT_USER hive without specifying a key.\n\n    #>\n    [cmdletBinding()]\n    param(\n        [Array] $RegistryPath,\n        [System.Collections.IDictionary] $HiveDictionary,\n        [string] $Key\n    )\n    foreach ($Registry in $RegistryPath) {\n        # Remove additional slashes\n        if ($Registry -is [string]) {\n            $Registry = $Registry.Replace(\"\\\\\", \"\\\").Replace(\"\\\\\", \"\\\").TrimStart(\"\\\").TrimEnd(\"\\\")\n            $FirstPartSplit = $Registry -split \"\\\\\"\n            $FirstPart = $FirstPartSplit[0]\n        } else {\n            $Registry.RegistryPath = $Registry.RegistryPath.Replace(\"\\\\\", \"\\\").Replace(\"\\\\\", \"\\\").TrimStart(\"\\\").TrimEnd(\"\\\")\n            $FirstPartSplit = $Registry.RegistryPath -split \"\\\\\"\n            $FirstPart = $FirstPartSplit[0]\n        }\n\n        foreach ($Hive in $HiveDictionary.Keys) {\n            if ($Registry -is [string] -and $FirstPart -eq $Hive) {\n                # if ($Registry -is [string] -and $Registry.StartsWith($Hive, [System.StringComparison]::CurrentCultureIgnoreCase)) {\n                if ($Hive.Length -eq $Registry.Length) {\n                    [ordered] @{\n                        Registry     = $Registry\n                        HiveKey      = $HiveDictionary[$Hive]\n                        SubKeyName   = $null\n                        Key          = if ($Key -eq \"\") { $null } else { $Key }\n                        Error        = $null\n                        ErrorMessage = $null\n                    }\n                } else {\n                    [ordered] @{\n                        Registry     = $Registry\n                        HiveKey      = $HiveDictionary[$Hive]\n                        SubKeyName   = $Registry.substring($Hive.Length + 1)\n                        Key          = if ($Key -eq \"\") { $null } else { $Key }\n                        Error        = $null\n                        ErrorMessage = $null\n                    }\n                }\n                break\n            } elseif ($Registry -isnot [string] -and $FirstPart -eq $Hive) {\n                #} elseif ($Registry -isnot [string] -and $Registry.RegistryPath.StartsWith($Hive, [System.StringComparison]::CurrentCultureIgnoreCase)) {\n                if ($Hive.Length -eq $Registry.RegistryPath.Length) {\n                    [ordered] @{\n                        ComputerName = $Registry.ComputerName\n                        Registry     = $Registry.RegistryPath\n                        HiveKey      = $HiveDictionary[$Hive]\n                        SubKeyName   = $null\n                        Key          = if ($Key -eq \"\") { $null } else { $Key }\n                        Error        = $Registry.Error\n                        ErrorMessage = $Registry.ErrorMessage\n                    }\n                } else {\n                    [ordered] @{\n                        ComputerName = $Registry.ComputerName\n                        Registry     = $Registry.RegistryPath\n                        HiveKey      = $HiveDictionary[$Hive]\n                        SubKeyName   = $Registry.RegistryPath.substring($Hive.Length + 1)\n                        Key          = if ($Key -eq \"\") { $null } else { $Key }\n                        Error        = $Registry.Error\n                        ErrorMessage = $Registry.ErrorMessage\n                    }\n                }\n                break\n            }\n        }\n    }\n}"
  },
  {
    "path": "Private/Get-PrivateRegistryTranslated.ps1",
    "content": "﻿function Get-PrivateRegistryTranslated {\n    <#\n    .SYNOPSIS\n    Retrieves translated private registry information based on the provided parameters.\n\n    .DESCRIPTION\n    This function retrieves translated private registry information based on the specified RegistryPath, HiveDictionary, ReverseTypesDictionary, Type, Key, and Value parameters.\n\n    .PARAMETER RegistryPath\n    Specifies the array of registry paths to be translated.\n\n    .PARAMETER HiveDictionary\n    Specifies the dictionary containing mappings of registry hives.\n\n    .PARAMETER ReverseTypesDictionary\n    Specifies the dictionary containing mappings of registry value types.\n\n    .PARAMETER Type\n    Specifies the type of the registry value. Valid values are 'REG_SZ', 'REG_NONE', 'None', 'REG_EXPAND_SZ', 'REG_BINARY', 'REG_DWORD', 'REG_MULTI_SZ', 'REG_QWORD', 'string', 'binary', 'dword', 'qword', 'multistring', 'expandstring'.\n\n    .PARAMETER Key\n    Specifies the key associated with the registry value.\n\n    .PARAMETER Value\n    Specifies the value of the registry key.\n\n    .EXAMPLE\n    Get-PrivateRegistryTranslated -RegistryPath \"HKLM\\Software\\Microsoft\" -HiveDictionary @{\"HKLM\"=\"HKEY_LOCAL_MACHINE\"} -ReverseTypesDictionary @{\"string\"=\"REG_SZ\"} -Type \"string\" -Key \"Version\" -Value \"10.0.19041\"\n\n    Description\n    -----------\n    Retrieves translated registry information for the specified registry path.\n\n    .EXAMPLE\n    Get-PrivateRegistryTranslated -RegistryPath \"HKCU\\Software\\Settings\" -HiveDictionary @{\"HKCU\"=\"HKEY_CURRENT_USER\"} -ReverseTypesDictionary @{\"dword\"=\"REG_DWORD\"} -Type \"dword\" -Key \"SettingA\" -Value 1\n\n    Description\n    -----------\n    Retrieves translated registry information for the specified registry path.\n\n    #>\n    [cmdletBinding()]\n    param(\n        [Array] $RegistryPath,\n        [System.Collections.IDictionary] $HiveDictionary,\n        [System.Collections.IDictionary] $ReverseTypesDictionary,\n        [Parameter()][ValidateSet('REG_SZ', 'REG_NONE', 'None', 'REG_EXPAND_SZ', 'REG_BINARY', 'REG_DWORD', 'REG_MULTI_SZ', 'REG_QWORD', 'string', 'binary', 'dword', 'qword', 'multistring', 'expandstring')][string] $Type,\n        [Parameter()][string] $Key,\n        [Parameter()][object] $Value\n    )\n    foreach ($Registry in $RegistryPath) {\n        # Remove additional slashes\n        if ($Registry -is [string]) {\n            $Registry = $Registry.Replace(\"\\\\\", \"\\\").Replace(\"\\\\\", \"\\\").TrimStart(\"\\\").TrimEnd(\"\\\")\n        } else {\n            $Registry.RegistryPath = $Registry.RegistryPath.Replace(\"\\\\\", \"\\\").Replace(\"\\\\\", \"\\\").TrimStart(\"\\\").TrimEnd(\"\\\")\n        }\n        foreach ($Hive in $HiveDictionary.Keys) {\n            if ($Registry -is [string] -and $Registry.StartsWith($Hive, [System.StringComparison]::CurrentCultureIgnoreCase)) {\n                if ($Hive.Length -eq $Registry.Length) {\n                    [ordered] @{\n                        HiveKey    = $HiveDictionary[$Hive]\n                        SubKeyName = $null\n                        ValueKind  = if ($Type) { [Microsoft.Win32.RegistryValueKind]::($ReverseTypesDictionary[$Type]) } else { $null }\n                        Key        = $Key\n                        Value      = $Value\n                    }\n                } else {\n                    [ordered] @{\n                        HiveKey    = $HiveDictionary[$Hive]\n                        SubKeyName = $Registry.substring($Hive.Length + 1)\n                        ValueKind  = if ($Type) { [Microsoft.Win32.RegistryValueKind]::($ReverseTypesDictionary[$Type]) } else { $null }\n                        Key        = $Key\n                        Value      = $Value\n                    }\n                }\n                break\n            } elseif ($Registry -isnot [string] -and $Registry.RegistryPath.StartsWith($Hive, [System.StringComparison]::CurrentCultureIgnoreCase)) {\n                if ($Hive.Length -eq $Registry.RegistryPath.Length) {\n                    [ordered] @{\n                        ComputerName = $Registry.ComputerName\n                        HiveKey      = $HiveDictionary[$Hive]\n                        SubKeyName   = $null\n                        ValueKind    = if ($Type) { [Microsoft.Win32.RegistryValueKind]::($ReverseTypesDictionary[$Type]) } else { $null }\n                        Key          = $Key\n                        Value        = $Value\n                    }\n                } else {\n                    [ordered] @{\n                        ComputerName = $Registry.ComputerName\n                        HiveKey      = $HiveDictionary[$Hive]\n                        SubKeyName   = $Registry.RegistryPath.substring($Hive.Length + 1)\n                        ValueKind    = if ($Type) { [Microsoft.Win32.RegistryValueKind]::($ReverseTypesDictionary[$Type]) } else { $null }\n                        Key          = $Key\n                        Value        = $Value\n                    }\n                }\n                break\n            }\n        }\n    }\n}"
  },
  {
    "path": "Private/Mount-AllRegistryPath.ps1",
    "content": "﻿function Mount-AllRegistryPath {\n    <#\n    .SYNOPSIS\n    Mounts offline registry paths to specified mount points.\n\n    .DESCRIPTION\n    This function mounts offline registry paths to specified mount points. It iterates through all offline registry profiles and mounts them to the specified mount point. Optionally, you can specify a specific user profile to mount.\n\n    .PARAMETER MountPoint\n    Specifies the mount point where the registry paths will be mounted. Default is \"HKEY_USERS\\\".\n\n    .PARAMETER MountUsers\n    Specifies the user profile to mount. If specified, only the specified user profile will be mounted.\n\n    .EXAMPLE\n    Mount-AllRegistryPath -MountPoint \"HKEY_USERS\\\" -MountUsers \"User1\"\n    Mounts the offline registry path of user profile \"User1\" to the default mount point \"HKEY_USERS\\\".\n\n    .EXAMPLE\n    Mount-AllRegistryPath -MountPoint \"HKEY_LOCAL_MACHINE\\SOFTWARE\" -MountUsers \"User2\"\n    Mounts the offline registry path of user profile \"User2\" to the specified mount point \"HKEY_LOCAL_MACHINE\\SOFTWARE\".\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string] $MountPoint = \"HKEY_USERS\\\",\n        [string] $MountUsers\n    )\n    $AllProfiles = Get-OfflineRegistryProfilesPath\n    foreach ($Profile in $AllProfiles.Keys) {\n        if ($MountUsers) {\n            if ($MountUsers -ne $Profile) {\n                continue\n            }\n        }\n        $WhereMount = \"$MountPoint\\$Profile\".Replace(\"\\\\\", \"\\\")\n        Write-Verbose -Message \"Mount-OfflineRegistryPath - Mounting $WhereMount to $($AllProfiles[$Profile].FilePath)\"\n        $AllProfiles[$Profile].Status = Mount-PSRegistryPath -MountPoint $WhereMount -FilePath $AllProfiles[$Profile].FilePath\n    }\n    $AllProfiles\n}"
  },
  {
    "path": "Private/Mount-DefaultRegistryPath.ps1",
    "content": "﻿function Mount-DefaultRegistryPath {\n    <#\n    .SYNOPSIS\n    Mounts the default registry path to a specified mount point.\n\n    .DESCRIPTION\n    This function mounts the default registry path to a specified mount point. If an error occurs during the process, it provides appropriate feedback.\n\n    .PARAMETER MountPoint\n    Specifies the mount point where the default registry path will be mounted. Default value is \"HKEY_USERS\\.DEFAULT_USER\".\n\n    .EXAMPLE\n    Mount-DefaultRegistryPath -MountPoint \"HKLM:\\Software\\CustomMountPoint\"\n    Mounts the default registry path to the specified custom mount point \"HKLM:\\Software\\CustomMountPoint\".\n\n    .EXAMPLE\n    Mount-DefaultRegistryPath\n    Mounts the default registry path to the default mount point \"HKEY_USERS\\.DEFAULT_USER\".\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string] $MountPoint = \"HKEY_USERS\\.DEFAULT_USER\"\n    )\n    $DefaultRegistryPath = Get-PSRegistry -RegistryPath 'HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList' -Key 'Default' -ExpandEnvironmentNames -DoNotUnmount\n    if ($PSError -ne $true) {\n        $PathToNTUser = [io.path]::Combine($DefaultRegistryPath.PSValue, 'NTUSER.DAT')\n        Write-Verbose -Message \"Mount-DefaultRegistryPath - Mounting $MountPoint to $PathToNTUser\"\n        Mount-PSRegistryPath -MountPoint $MountPoint -FilePath $PathToNTUser\n    } else {\n        if ($PSBoundParameters.ErrorAction -eq 'Stop') {\n            throw $PSErrorMessage\n        } else {\n            Write-Warning -Message \"Mount-DefaultRegistryPath - Couldn't execute. Error: $PSErrorMessage\"\n        }\n    }\n}"
  },
  {
    "path": "Private/New-PrivateRegistry.ps1",
    "content": "﻿function New-PrivateRegistry {\n    <#\n    .SYNOPSIS\n    Creates or updates a private registry key on a local or remote computer.\n\n    .DESCRIPTION\n    The New-PrivateRegistry function creates or updates a registry key on a specified computer. It can be used to set registry values for a specific hive key, subkey, value name, value data, and value kind.\n\n    .PARAMETER RegistryValue\n    Specifies the registry value to be set. This should be an IDictionary object containing the hive key, subkey, value name, value data, and value kind.\n\n    .PARAMETER Computer\n    Specifies the name of the computer where the registry key will be created or updated.\n\n    .PARAMETER Remote\n    Indicates whether the registry operation should be performed on a remote computer.\n\n    .EXAMPLE\n    New-PrivateRegistry -RegistryValue @{ HiveKey = 'LocalMachine'; SubKeyName = 'Software\\MyApp'; Value = 'Version'; ValueData = '1.0'; ValueKind = 'String' } -Computer 'Server01'\n\n    Description:\n    Creates a registry key 'Version' with value '1.0' under 'LocalMachine\\Software\\MyApp' on the local computer 'Server01'.\n\n    .EXAMPLE\n    New-PrivateRegistry -RegistryValue @{ HiveKey = 'CurrentUser'; SubKeyName = 'Control Panel\\Desktop'; Value = 'Wallpaper'; ValueData = 'C:\\Wallpapers\\image.jpg'; ValueKind = 'String' } -Computer 'Workstation01' -Remote\n\n    Description:\n    Creates a registry key 'Wallpaper' with value 'C:\\Wallpapers\\image.jpg' under 'CurrentUser\\Control Panel\\Desktop' on the remote computer 'Workstation01'.\n\n    #>\n    [CmdletBinding(SupportsShouldProcess)]\n    param(\n        [System.Collections.IDictionary] $RegistryValue,\n        [string] $Computer,\n        [switch] $Remote\n    )\n    try {\n        if ($Remote) {\n            $BaseHive = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($RegistryValue.HiveKey, $Computer, 0 )\n        } else {\n            $BaseHive = [Microsoft.Win32.RegistryKey]::OpenBaseKey($RegistryValue.HiveKey, 0 )\n        }\n        $PSConnection = $true\n        $PSError = $null\n    } catch {\n        $PSConnection = $false\n        $PSError = $($_.Exception.Message)\n        if ($PSBoundParameters.ErrorAction -eq 'Stop') {\n            if ($null -ne $BaseHive) {\n                $BaseHive.Close()\n                $BaseHive.Dispose()\n            }\n            throw\n        } else {\n            Write-Warning \"New-PSRegistry - Setting registry $($RegistryValue.HiveKey)\\$($RegistryValue.SubKeyName) on $($RegistryValue.Key) to $($RegistryValue.Value) of $($RegistryValue.ValueKind) on $Computer have failed. Error: $($_.Exception.Message.Replace([System.Environment]::NewLine, \" \"))\"\n        }\n    }\n    if ($PSError) {\n        if (-not $Suppress) {\n            [PSCustomObject] @{\n                PSComputerName = $Computer\n                PSConnection   = $PSConnection\n                PSError        = $true\n                PSErrorMessage = $PSError\n                Path           = \"$($RegistryValue.HiveKey)\\$($RegistryValue.SubKeyName)\"\n            }\n        }\n    } else {\n        try {\n            if ($PSCmdlet.ShouldProcess($Computer, \"Creating registry $($RegistryValue.HiveKey)\\$($RegistryValue.SubKeyName)\")) {\n                $SubKey = $BaseHive.OpenSubKey($RegistryValue.SubKeyName, $true)\n                if (-not $SubKey) {\n                    $SubKeysSplit = $RegistryValue.SubKeyName.Split('\\')\n                    $SubKey = $BaseHive.OpenSubKey($SubKeysSplit[0], $true)\n                    if (-not $SubKey) {\n                        $SubKey = $BaseHive.CreateSubKey($SubKeysSplit[0])\n                    }\n                    $SubKey = $BaseHive.OpenSubKey($SubKeysSplit[0], $true)\n                    foreach ($S in $SubKeysSplit | Select-Object -Skip 1) {\n                        $SubKey = $SubKey.CreateSubKey($S)\n                    }\n                    $PSError = $false\n                    $PSErrorMessage = $null\n                } else {\n                    $PSError = $false\n                    $PSErrorMessage = \"$($RegistryValue.SubKeyName) already exists.\"\n                }\n            } else {\n                $PSError = $true\n                $PSErrorMessage = \"WhatIf was used. No changes done.\"\n            }\n            if (-not $Suppress) {\n                [PSCustomObject] @{\n                    PSComputerName = $Computer\n                    PSConnection   = $PSConnection\n                    PSError        = $PSError\n                    PSErrorMessage = $PSErrorMessage\n                    Path           = \"$($RegistryValue.HiveKey)\\$($RegistryValue.SubKeyName)\"\n                }\n            }\n        } catch {\n            if ($PSBoundParameters.ErrorAction -eq 'Stop') {\n                if ($null -ne $SubKey) {\n                    $SubKey.Close()\n                    $SubKey.Dispose()\n                }\n                if ($null -ne $BaseHive) {\n                    $BaseHive.Close()\n                    $BaseHive.Dispose()\n                }\n                throw\n            } else {\n                Write-Warning \"New-PSRegistry - Creating registry $RegistryPath on $Computer have failed. Error: $($_.Exception.Message.Replace([System.Environment]::NewLine, \" \"))\"\n            }\n            if (-not $Suppress) {\n                [PSCustomObject] @{\n                    PSComputerName = $Computer\n                    PSConnection   = $PSConnection\n                    PSError        = $true\n                    PSErrorMessage = $($_.Exception.Message)\n                    Path           = \"$($RegistryValue.HiveKey)\\$($RegistryValue.SubKeyName)\"\n                }\n            }\n        }\n    }\n    if ($null -ne $SubKey) {\n        $SubKey.Close()\n        $SubKey.Dispose()\n    }\n    if ($null -ne $BaseHive) {\n        $BaseHive.Close()\n        $BaseHive.Dispose()\n    }\n}"
  },
  {
    "path": "Private/Parameters/Script.RGBColors.ps1",
    "content": "$Script:RGBColors = [ordered] @{\n    None                   = $null\n    AirForceBlue           = 93, 138, 168\n    Akaroa                 = 195, 176, 145\n    AlbescentWhite         = 227, 218, 201\n    AliceBlue              = 240, 248, 255\n    Alizarin               = 227, 38, 54\n    Allports               = 18, 97, 128\n    Almond                 = 239, 222, 205\n    AlmondFrost            = 159, 129, 112\n    Amaranth               = 229, 43, 80\n    Amazon                 = 59, 122, 87\n    Amber                  = 255, 191, 0\n    Amethyst               = 153, 102, 204\n    AmethystSmoke          = 156, 138, 164\n    AntiqueWhite           = 250, 235, 215\n    Apple                  = 102, 180, 71\n    AppleBlossom           = 176, 92, 82\n    Apricot                = 251, 206, 177\n    Aqua                   = 0, 255, 255\n    Aquamarine             = 127, 255, 212\n    Armygreen              = 75, 83, 32\n    Arsenic                = 59, 68, 75\n    Astral                 = 54, 117, 136\n    Atlantis               = 164, 198, 57\n    Atomic                 = 65, 74, 76\n    AtomicTangerine        = 255, 153, 102\n    Axolotl                = 99, 119, 91\n    Azure                  = 240, 255, 255\n    Bahia                  = 176, 191, 26\n    BakersChocolate        = 93, 58, 26\n    BaliHai                = 124, 152, 171\n    BananaMania            = 250, 231, 181\n    BattleshipGrey         = 85, 93, 80\n    BayOfMany              = 35, 48, 103\n    Beige                  = 245, 245, 220\n    Bermuda                = 136, 216, 192\n    Bilbao                 = 42, 128, 0\n    BilobaFlower           = 181, 126, 220\n    Bismark                = 83, 104, 114\n    Bisque                 = 255, 228, 196\n    Bistre                 = 61, 43, 31\n    Bittersweet            = 254, 111, 94\n    Black                  = 0, 0, 0\n    BlackPearl             = 31, 38, 42\n    BlackRose              = 85, 31, 47\n    BlackRussian           = 23, 24, 43\n    BlanchedAlmond         = 255, 235, 205\n    BlizzardBlue           = 172, 229, 238\n    Blue                   = 0, 0, 255\n    BlueDiamond            = 77, 26, 127\n    BlueMarguerite         = 115, 102, 189\n    BlueSmoke              = 115, 130, 118\n    BlueViolet             = 138, 43, 226\n    Blush                  = 169, 92, 104\n    BokaraGrey             = 22, 17, 13\n    Bole                   = 121, 68, 59\n    BondiBlue              = 0, 147, 175\n    Bordeaux               = 88, 17, 26\n    Bossanova              = 86, 60, 92\n    Boulder                = 114, 116, 114\n    Bouquet                = 183, 132, 167\n    Bourbon                = 170, 108, 57\n    Brass                  = 181, 166, 66\n    BrickRed               = 199, 44, 72\n    BrightGreen            = 102, 255, 0\n    BrightRed              = 146, 43, 62\n    BrightTurquoise        = 8, 232, 222\n    BrilliantRose          = 243, 100, 162\n    BrinkPink              = 250, 110, 121\n    BritishRacingGreen     = 0, 66, 37\n    Bronze                 = 205, 127, 50\n    Brown                  = 165, 42, 42\n    BrownPod               = 57, 24, 2\n    BuddhaGold             = 202, 169, 6\n    Buff                   = 240, 220, 130\n    Burgundy               = 128, 0, 32\n    BurlyWood              = 222, 184, 135\n    BurntOrange            = 255, 117, 56\n    BurntSienna            = 233, 116, 81\n    BurntUmber             = 138, 51, 36\n    ButteredRum            = 156, 124, 56\n    CadetBlue              = 95, 158, 160\n    California             = 224, 141, 60\n    CamouflageGreen        = 120, 134, 107\n    Canary                 = 255, 255, 153\n    CanCan                 = 217, 134, 149\n    CannonPink             = 145, 78, 117\n    CaputMortuum           = 89, 39, 32\n    Caramel                = 255, 213, 154\n    Cararra                = 237, 230, 214\n    Cardinal               = 179, 33, 52\n    CardinGreen            = 18, 53, 36\n    CareysPink             = 217, 152, 160\n    CaribbeanGreen         = 0, 222, 164\n    Carmine                = 175, 0, 42\n    CarnationPink          = 255, 166, 201\n    CarrotOrange           = 242, 142, 28\n    Cascade                = 141, 163, 153\n    CatskillWhite          = 226, 229, 222\n    Cedar                  = 67, 48, 46\n    Celadon                = 172, 225, 175\n    Celeste                = 207, 207, 196\n    Cello                  = 55, 79, 107\n    Cement                 = 138, 121, 93\n    Cerise                 = 222, 49, 99\n    Cerulean               = 0, 123, 167\n    CeruleanBlue           = 42, 82, 190\n    Chantilly              = 239, 187, 204\n    Chardonnay             = 255, 200, 124\n    Charlotte              = 167, 216, 222\n    Charm                  = 208, 116, 139\n    Chartreuse             = 127, 255, 0\n    ChartreuseYellow       = 223, 255, 0\n    ChelseaCucumber        = 135, 169, 107\n    Cherub                 = 246, 214, 222\n    Chestnut               = 185, 78, 72\n    ChileanFire            = 226, 88, 34\n    Chinook                = 150, 200, 162\n    Chocolate              = 210, 105, 30\n    Christi                = 125, 183, 0\n    Christine              = 181, 101, 30\n    Cinnabar               = 235, 76, 66\n    Citron                 = 159, 169, 31\n    Citrus                 = 141, 182, 0\n    Claret                 = 95, 25, 51\n    ClassicRose            = 251, 204, 231\n    ClayCreek              = 145, 129, 81\n    Clinker                = 75, 54, 33\n    Clover                 = 74, 93, 35\n    Cobalt                 = 0, 71, 171\n    CocoaBrown             = 44, 22, 8\n    Cola                   = 60, 48, 36\n    ColumbiaBlue           = 166, 231, 255\n    CongoBrown             = 103, 76, 71\n    Conifer                = 178, 236, 93\n    Copper                 = 218, 138, 103\n    CopperRose             = 153, 102, 102\n    Coral                  = 255, 127, 80\n    CoralRed               = 255, 64, 64\n    CoralTree              = 173, 111, 105\n    Coriander              = 188, 184, 138\n    Corn                   = 251, 236, 93\n    CornField              = 250, 240, 190\n    Cornflower             = 147, 204, 234\n    CornflowerBlue         = 100, 149, 237\n    Cornsilk               = 255, 248, 220\n    Cosmic                 = 132, 63, 91\n    Cosmos                 = 255, 204, 203\n    CostaDelSol            = 102, 93, 30\n    CottonCandy            = 255, 188, 217\n    Crail                  = 164, 90, 82\n    Cranberry              = 205, 96, 126\n    Cream                  = 255, 255, 204\n    CreamCan               = 242, 198, 73\n    Crimson                = 220, 20, 60\n    Crusta                 = 232, 142, 90\n    Cumulus                = 255, 255, 191\n    Cupid                  = 246, 173, 198\n    CuriousBlue            = 40, 135, 200\n    Cyan                   = 0, 255, 255\n    Cyprus                 = 6, 78, 64\n    DaisyBush              = 85, 53, 146\n    Dandelion              = 250, 218, 94\n    Danube                 = 96, 130, 182\n    DarkBlue               = 0, 0, 139\n    DarkBrown              = 101, 67, 33\n    DarkCerulean           = 8, 69, 126\n    DarkChestnut           = 152, 105, 96\n    DarkCoral              = 201, 90, 73\n    DarkCyan               = 0, 139, 139\n    DarkGoldenrod          = 184, 134, 11\n    DarkGray               = 169, 169, 169\n    DarkGreen              = 0, 100, 0\n    DarkGreenCopper        = 73, 121, 107\n    DarkGrey               = 169, 169, 169\n    DarkKhaki              = 189, 183, 107\n    DarkMagenta            = 139, 0, 139\n    DarkOliveGreen         = 85, 107, 47\n    DarkOrange             = 255, 140, 0\n    DarkOrchid             = 153, 50, 204\n    DarkPastelGreen        = 3, 192, 60\n    DarkPink               = 222, 93, 131\n    DarkPurple             = 150, 61, 127\n    DarkRed                = 139, 0, 0\n    DarkSalmon             = 233, 150, 122\n    DarkSeaGreen           = 143, 188, 143\n    DarkSlateBlue          = 72, 61, 139\n    DarkSlateGray          = 47, 79, 79\n    DarkSlateGrey          = 47, 79, 79\n    DarkSpringGreen        = 23, 114, 69\n    DarkTangerine          = 255, 170, 29\n    DarkTurquoise          = 0, 206, 209\n    DarkViolet             = 148, 0, 211\n    DarkWood               = 130, 102, 68\n    DeepBlush              = 245, 105, 145\n    DeepCerise             = 224, 33, 138\n    DeepKoamaru            = 51, 51, 102\n    DeepLilac              = 153, 85, 187\n    DeepMagenta            = 204, 0, 204\n    DeepPink               = 255, 20, 147\n    DeepSea                = 14, 124, 97\n    DeepSkyBlue            = 0, 191, 255\n    DeepTeal               = 24, 69, 59\n    Denim                  = 36, 107, 206\n    DesertSand             = 237, 201, 175\n    DimGray                = 105, 105, 105\n    DimGrey                = 105, 105, 105\n    DodgerBlue             = 30, 144, 255\n    Dolly                  = 242, 242, 122\n    Downy                  = 95, 201, 191\n    DutchWhite             = 239, 223, 187\n    EastBay                = 76, 81, 109\n    EastSide               = 178, 132, 190\n    EchoBlue               = 169, 178, 195\n    Ecru                   = 194, 178, 128\n    Eggplant               = 162, 0, 109\n    EgyptianBlue           = 16, 52, 166\n    ElectricBlue           = 125, 249, 255\n    ElectricIndigo         = 111, 0, 255\n    ElectricLime           = 208, 255, 20\n    ElectricPurple         = 191, 0, 255\n    Elm                    = 47, 132, 124\n    Emerald                = 80, 200, 120\n    Eminence               = 108, 48, 130\n    Endeavour              = 46, 88, 148\n    EnergyYellow           = 245, 224, 80\n    Espresso               = 74, 44, 42\n    Eucalyptus             = 26, 162, 96\n    Falcon                 = 126, 94, 96\n    Fallow                 = 204, 153, 102\n    FaluRed                = 128, 24, 24\n    Feldgrau               = 77, 93, 83\n    Feldspar               = 205, 149, 117\n    Fern                   = 113, 188, 120\n    FernGreen              = 79, 121, 66\n    Festival               = 236, 213, 64\n    Finn                   = 97, 64, 81\n    FireBrick              = 178, 34, 34\n    FireBush               = 222, 143, 78\n    FireEngineRed          = 211, 33, 45\n    Flamingo               = 233, 92, 75\n    Flax                   = 238, 220, 130\n    FloralWhite            = 255, 250, 240\n    ForestGreen            = 34, 139, 34\n    Frangipani             = 250, 214, 165\n    FreeSpeechAquamarine   = 0, 168, 119\n    FreeSpeechRed          = 204, 0, 0\n    FrenchLilac            = 230, 168, 215\n    FrenchRose             = 232, 83, 149\n    FriarGrey              = 135, 134, 129\n    Froly                  = 228, 113, 122\n    Fuchsia                = 255, 0, 255\n    FuchsiaPink            = 255, 119, 255\n    Gainsboro              = 220, 220, 220\n    Gallery                = 219, 215, 210\n    Galliano               = 204, 160, 29\n    Gamboge                = 204, 153, 0\n    Ghost                  = 196, 195, 208\n    GhostWhite             = 248, 248, 255\n    Gin                    = 216, 228, 188\n    GinFizz                = 247, 231, 206\n    Givry                  = 230, 208, 171\n    Glacier                = 115, 169, 194\n    Gold                   = 255, 215, 0\n    GoldDrop               = 213, 108, 43\n    GoldenBrown            = 150, 113, 23\n    GoldenFizz             = 240, 225, 48\n    GoldenGlow             = 248, 222, 126\n    GoldenPoppy            = 252, 194, 0\n    Goldenrod              = 218, 165, 32\n    GoldenSand             = 233, 214, 107\n    GoldenYellow           = 253, 238, 0\n    GoldTips               = 225, 189, 39\n    GordonsGreen           = 37, 53, 41\n    Gorse                  = 255, 225, 53\n    Gossamer               = 49, 145, 119\n    GrannySmithApple       = 168, 228, 160\n    Gray                   = 128, 128, 128\n    GrayAsparagus          = 70, 89, 69\n    Green                  = 0, 128, 0\n    GreenLeaf              = 76, 114, 29\n    GreenVogue             = 38, 67, 72\n    GreenYellow            = 173, 255, 47\n    Grey                   = 128, 128, 128\n    GreyAsparagus          = 70, 89, 69\n    GuardsmanRed           = 157, 41, 51\n    GumLeaf                = 178, 190, 181\n    Gunmetal               = 42, 52, 57\n    Hacienda               = 155, 135, 12\n    HalfAndHalf            = 232, 228, 201\n    HalfBaked              = 95, 138, 139\n    HalfColonialWhite      = 246, 234, 190\n    HalfPearlLusta         = 240, 234, 214\n    HanPurple              = 63, 0, 255\n    Harlequin              = 74, 255, 0\n    HarleyDavidsonOrange   = 194, 59, 34\n    Heather                = 174, 198, 207\n    Heliotrope             = 223, 115, 255\n    Hemp                   = 161, 122, 116\n    Highball               = 134, 126, 54\n    HippiePink             = 171, 75, 82\n    Hoki                   = 110, 127, 128\n    HollywoodCerise        = 244, 0, 161\n    Honeydew               = 240, 255, 240\n    Hopbush                = 207, 113, 175\n    HorsesNeck             = 108, 84, 30\n    HotPink                = 255, 105, 180\n    HummingBird            = 201, 255, 229\n    HunterGreen            = 53, 94, 59\n    Illusion               = 244, 152, 173\n    InchWorm               = 202, 224, 13\n    IndianRed              = 205, 92, 92\n    Indigo                 = 75, 0, 130\n    InternationalKleinBlue = 0, 24, 168\n    InternationalOrange    = 255, 79, 0\n    IrisBlue               = 28, 169, 201\n    IrishCoffee            = 102, 66, 40\n    IronsideGrey           = 113, 112, 110\n    IslamicGreen           = 0, 144, 0\n    Ivory                  = 255, 255, 240\n    Jacarta                = 61, 50, 93\n    JackoBean              = 65, 54, 40\n    JacksonsPurple         = 46, 45, 136\n    Jade                   = 0, 171, 102\n    JapaneseLaurel         = 47, 117, 50\n    Jazz                   = 93, 43, 44\n    JazzberryJam           = 165, 11, 94\n    JellyBean              = 68, 121, 142\n    JetStream              = 187, 208, 201\n    Jewel                  = 0, 107, 60\n    Jon                    = 79, 58, 60\n    JordyBlue              = 124, 185, 232\n    Jumbo                  = 132, 132, 130\n    JungleGreen            = 41, 171, 135\n    KaitokeGreen           = 30, 77, 43\n    Karry                  = 255, 221, 202\n    KellyGreen             = 70, 203, 24\n    Keppel                 = 93, 164, 147\n    Khaki                  = 240, 230, 140\n    Killarney              = 77, 140, 87\n    KingfisherDaisy        = 85, 27, 140\n    Kobi                   = 230, 143, 172\n    LaPalma                = 60, 141, 13\n    LaserLemon             = 252, 247, 94\n    Laurel                 = 103, 146, 103\n    Lavender               = 230, 230, 250\n    LavenderBlue           = 204, 204, 255\n    LavenderBlush          = 255, 240, 245\n    LavenderPink           = 251, 174, 210\n    LavenderRose           = 251, 160, 227\n    LawnGreen              = 124, 252, 0\n    LemonChiffon           = 255, 250, 205\n    LightBlue              = 173, 216, 230\n    LightCoral             = 240, 128, 128\n    LightCyan              = 224, 255, 255\n    LightGoldenrodYellow   = 250, 250, 210\n    LightGray              = 211, 211, 211\n    LightGreen             = 144, 238, 144\n    LightGrey              = 211, 211, 211\n    LightPink              = 255, 182, 193\n    LightSalmon            = 255, 160, 122\n    LightSeaGreen          = 32, 178, 170\n    LightSkyBlue           = 135, 206, 250\n    LightSlateGray         = 119, 136, 153\n    LightSlateGrey         = 119, 136, 153\n    LightSteelBlue         = 176, 196, 222\n    LightYellow            = 255, 255, 224\n    Lilac                  = 204, 153, 204\n    Lime                   = 0, 255, 0\n    LimeGreen              = 50, 205, 50\n    Limerick               = 139, 190, 27\n    Linen                  = 250, 240, 230\n    Lipstick               = 159, 43, 104\n    Liver                  = 83, 75, 79\n    Lochinvar              = 86, 136, 125\n    Lochmara               = 38, 97, 156\n    Lola                   = 179, 158, 181\n    LondonHue              = 170, 152, 169\n    Lotus                  = 124, 72, 72\n    LuckyPoint             = 29, 41, 81\n    MacaroniAndCheese      = 255, 189, 136\n    Madang                 = 193, 249, 162\n    Madras                 = 81, 65, 0\n    Magenta                = 255, 0, 255\n    MagicMint              = 170, 240, 209\n    Magnolia               = 248, 244, 255\n    Mahogany               = 215, 59, 62\n    Maire                  = 27, 24, 17\n    Maize                  = 230, 190, 138\n    Malachite              = 11, 218, 81\n    Malibu                 = 93, 173, 236\n    Malta                  = 169, 154, 134\n    Manatee                = 140, 146, 172\n    Mandalay               = 176, 121, 57\n    MandarianOrange        = 146, 39, 36\n    Mandy                  = 191, 79, 81\n    Manhattan              = 229, 170, 112\n    Mantis                 = 125, 194, 66\n    Manz                   = 217, 230, 80\n    MardiGras              = 48, 25, 52\n    Mariner                = 57, 86, 156\n    Maroon                 = 128, 0, 0\n    Matterhorn             = 85, 85, 85\n    Mauve                  = 244, 187, 255\n    Mauvelous              = 255, 145, 175\n    MauveTaupe             = 143, 89, 115\n    MayaBlue               = 119, 181, 254\n    McKenzie               = 129, 97, 60\n    MediumAquamarine       = 102, 205, 170\n    MediumBlue             = 0, 0, 205\n    MediumCarmine          = 175, 64, 53\n    MediumOrchid           = 186, 85, 211\n    MediumPurple           = 147, 112, 219\n    MediumRedViolet        = 189, 51, 164\n    MediumSeaGreen         = 60, 179, 113\n    MediumSlateBlue        = 123, 104, 238\n    MediumSpringGreen      = 0, 250, 154\n    MediumTurquoise        = 72, 209, 204\n    MediumVioletRed        = 199, 21, 133\n    MediumWood             = 166, 123, 91\n    Melon                  = 253, 188, 180\n    Merlot                 = 112, 54, 66\n    MetallicGold           = 211, 175, 55\n    Meteor                 = 184, 115, 51\n    MidnightBlue           = 25, 25, 112\n    MidnightExpress        = 0, 20, 64\n    Mikado                 = 60, 52, 31\n    MilanoRed              = 168, 55, 49\n    Ming                   = 54, 116, 125\n    MintCream              = 245, 255, 250\n    MintGreen              = 152, 255, 152\n    Mischka                = 168, 169, 173\n    MistyRose              = 255, 228, 225\n    Moccasin               = 255, 228, 181\n    Mojo                   = 149, 69, 53\n    MonaLisa               = 255, 153, 153\n    Mongoose               = 179, 139, 109\n    Montana                = 53, 56, 57\n    MoodyBlue              = 116, 108, 192\n    MoonYellow             = 245, 199, 26\n    MossGreen              = 173, 223, 173\n    MountainMeadow         = 28, 172, 120\n    MountainMist           = 161, 157, 148\n    MountbattenPink        = 153, 122, 141\n    Mulberry               = 211, 65, 157\n    Mustard                = 255, 219, 88\n    Myrtle                 = 25, 89, 5\n    MySin                  = 255, 179, 71\n    NavajoWhite            = 255, 222, 173\n    Navy                   = 0, 0, 128\n    NavyBlue               = 2, 71, 254\n    NeonCarrot             = 255, 153, 51\n    NeonPink               = 255, 92, 205\n    Nepal                  = 145, 163, 176\n    Nero                   = 20, 20, 20\n    NewMidnightBlue        = 0, 0, 156\n    Niagara                = 58, 176, 158\n    NightRider             = 59, 47, 47\n    Nobel                  = 152, 152, 152\n    Norway                 = 169, 186, 157\n    Nugget                 = 183, 135, 39\n    OceanGreen             = 95, 167, 120\n    Ochre                  = 202, 115, 9\n    OldCopper              = 111, 78, 55\n    OldGold                = 207, 181, 59\n    OldLace                = 253, 245, 230\n    OldLavender            = 121, 104, 120\n    OldRose                = 195, 33, 72\n    Olive                  = 128, 128, 0\n    OliveDrab              = 107, 142, 35\n    OliveGreen             = 181, 179, 92\n    Olivetone              = 110, 110, 48\n    Olivine                = 154, 185, 115\n    Onahau                 = 196, 216, 226\n    Opal                   = 168, 195, 188\n    Orange                 = 255, 165, 0\n    OrangePeel             = 251, 153, 2\n    OrangeRed              = 255, 69, 0\n    Orchid                 = 218, 112, 214\n    OuterSpace             = 45, 56, 58\n    OutrageousOrange       = 254, 90, 29\n    Oxley                  = 95, 167, 119\n    PacificBlue            = 0, 136, 220\n    Padua                  = 128, 193, 151\n    PalatinatePurple       = 112, 41, 99\n    PaleBrown              = 160, 120, 90\n    PaleChestnut           = 221, 173, 175\n    PaleCornflowerBlue     = 188, 212, 230\n    PaleGoldenrod          = 238, 232, 170\n    PaleGreen              = 152, 251, 152\n    PaleMagenta            = 249, 132, 239\n    PalePink               = 250, 218, 221\n    PaleSlate              = 201, 192, 187\n    PaleTaupe              = 188, 152, 126\n    PaleTurquoise          = 175, 238, 238\n    PaleVioletRed          = 219, 112, 147\n    PalmLeaf               = 53, 66, 48\n    Panache                = 233, 255, 219\n    PapayaWhip             = 255, 239, 213\n    ParisDaisy             = 255, 244, 79\n    Parsley                = 48, 96, 48\n    PastelGreen            = 119, 221, 119\n    PattensBlue            = 219, 233, 244\n    Peach                  = 255, 203, 164\n    PeachOrange            = 255, 204, 153\n    PeachPuff              = 255, 218, 185\n    PeachYellow            = 250, 223, 173\n    Pear                   = 209, 226, 49\n    PearlLusta             = 234, 224, 200\n    Pelorous               = 42, 143, 189\n    Perano                 = 172, 172, 230\n    Periwinkle             = 197, 203, 225\n    PersianBlue            = 34, 67, 182\n    PersianGreen           = 0, 166, 147\n    PersianIndigo          = 51, 0, 102\n    PersianPink            = 247, 127, 190\n    PersianRed             = 192, 54, 44\n    PersianRose            = 233, 54, 167\n    Persimmon              = 236, 88, 0\n    Peru                   = 205, 133, 63\n    Pesto                  = 128, 117, 50\n    PictonBlue             = 102, 153, 204\n    PigmentGreen           = 0, 173, 67\n    PigPink                = 255, 218, 233\n    PineGreen              = 1, 121, 111\n    PineTree               = 42, 47, 35\n    Pink                   = 255, 192, 203\n    PinkFlare              = 191, 175, 178\n    PinkLace               = 240, 211, 220\n    PinkSwan               = 179, 179, 179\n    Plum                   = 221, 160, 221\n    Pohutukawa             = 102, 12, 33\n    PoloBlue               = 119, 158, 203\n    Pompadour              = 129, 20, 83\n    Portage                = 146, 161, 207\n    PotPourri              = 241, 221, 207\n    PottersClay            = 132, 86, 60\n    PowderBlue             = 176, 224, 230\n    Prim                   = 228, 196, 207\n    PrussianBlue           = 0, 58, 108\n    PsychedelicPurple      = 223, 0, 255\n    Puce                   = 204, 136, 153\n    Pueblo                 = 108, 46, 31\n    PuertoRico             = 67, 179, 174\n    Pumpkin                = 255, 99, 28\n    Purple                 = 128, 0, 128\n    PurpleMountainsMajesty = 150, 123, 182\n    PurpleTaupe            = 93, 57, 84\n    QuarterSpanishWhite    = 230, 224, 212\n    Quartz                 = 220, 208, 255\n    Quincy                 = 106, 84, 69\n    RacingGreen            = 26, 36, 33\n    RadicalRed             = 255, 32, 82\n    Rajah                  = 251, 171, 96\n    RawUmber               = 123, 63, 0\n    RazzleDazzleRose       = 254, 78, 218\n    Razzmatazz             = 215, 10, 83\n    Red                    = 255, 0, 0\n    RedBerry               = 132, 22, 23\n    RedDamask              = 203, 109, 81\n    RedOxide               = 99, 15, 15\n    RedRobin               = 128, 64, 64\n    RichBlue               = 84, 90, 167\n    Riptide                = 141, 217, 204\n    RobinsEggBlue          = 0, 204, 204\n    RobRoy                 = 225, 169, 95\n    RockSpray              = 171, 56, 31\n    RomanCoffee            = 131, 105, 83\n    RoseBud                = 246, 164, 148\n    RoseBudCherry          = 135, 50, 96\n    RoseTaupe              = 144, 93, 93\n    RosyBrown              = 188, 143, 143\n    Rouge                  = 176, 48, 96\n    RoyalBlue              = 65, 105, 225\n    RoyalHeath             = 168, 81, 110\n    RoyalPurple            = 102, 51, 152\n    Ruby                   = 215, 24, 104\n    Russet                 = 128, 70, 27\n    Rust                   = 192, 64, 0\n    RusticRed              = 72, 6, 7\n    Saddle                 = 99, 81, 71\n    SaddleBrown            = 139, 69, 19\n    SafetyOrange           = 255, 102, 0\n    Saffron                = 244, 196, 48\n    Sage                   = 143, 151, 121\n    Sail                   = 161, 202, 241\n    Salem                  = 0, 133, 67\n    Salmon                 = 250, 128, 114\n    SandyBeach             = 253, 213, 177\n    SandyBrown             = 244, 164, 96\n    Sangria                = 134, 1, 17\n    SanguineBrown          = 115, 54, 53\n    SanMarino              = 80, 114, 167\n    SanteFe                = 175, 110, 77\n    Sapphire               = 6, 42, 120\n    Saratoga               = 84, 90, 44\n    Scampi                 = 102, 102, 153\n    Scarlet                = 255, 36, 0\n    ScarletGum             = 67, 28, 83\n    SchoolBusYellow        = 255, 216, 0\n    Schooner               = 139, 134, 128\n    ScreaminGreen          = 102, 255, 102\n    Scrub                  = 59, 60, 54\n    SeaBuckthorn           = 249, 146, 69\n    SeaGreen               = 46, 139, 87\n    Seagull                = 140, 190, 214\n    SealBrown              = 61, 12, 2\n    Seance                 = 96, 47, 107\n    SeaPink                = 215, 131, 127\n    SeaShell               = 255, 245, 238\n    Selago                 = 250, 230, 250\n    SelectiveYellow        = 242, 180, 0\n    SemiSweetChocolate     = 107, 68, 35\n    Sepia                  = 150, 90, 62\n    Serenade               = 255, 233, 209\n    Shadow                 = 133, 109, 77\n    Shakespeare            = 114, 160, 193\n    Shalimar               = 252, 255, 164\n    Shamrock               = 68, 215, 168\n    ShamrockGreen          = 0, 153, 102\n    SherpaBlue             = 0, 75, 73\n    SherwoodGreen          = 27, 77, 62\n    Shilo                  = 222, 165, 164\n    ShipCove               = 119, 139, 165\n    Shocking               = 241, 156, 187\n    ShockingPink           = 255, 29, 206\n    ShuttleGrey            = 84, 98, 111\n    Sidecar                = 238, 224, 177\n    Sienna                 = 160, 82, 45\n    Silk                   = 190, 164, 147\n    Silver                 = 192, 192, 192\n    SilverChalice          = 175, 177, 174\n    SilverTree             = 102, 201, 146\n    SkyBlue                = 135, 206, 235\n    SlateBlue              = 106, 90, 205\n    SlateGray              = 112, 128, 144\n    SlateGrey              = 112, 128, 144\n    Smalt                  = 0, 48, 143\n    SmaltBlue              = 74, 100, 108\n    Snow                   = 255, 250, 250\n    SoftAmber              = 209, 190, 168\n    Solitude               = 235, 236, 240\n    Sorbus                 = 233, 105, 44\n    Spectra                = 53, 101, 77\n    SpicyMix               = 136, 101, 78\n    Spray                  = 126, 212, 230\n    SpringBud              = 150, 255, 0\n    SpringGreen            = 0, 255, 127\n    SpringSun              = 236, 235, 189\n    SpunPearl              = 170, 169, 173\n    Stack                  = 130, 142, 132\n    SteelBlue              = 70, 130, 180\n    Stiletto               = 137, 63, 69\n    Strikemaster           = 145, 92, 131\n    StTropaz               = 50, 82, 123\n    Studio                 = 115, 79, 150\n    Sulu                   = 201, 220, 135\n    SummerSky              = 33, 171, 205\n    Sun                    = 237, 135, 45\n    Sundance               = 197, 179, 88\n    Sunflower              = 228, 208, 10\n    Sunglow                = 255, 204, 51\n    SunsetOrange           = 253, 82, 64\n    SurfieGreen            = 0, 116, 116\n    Sushi                  = 111, 153, 64\n    SuvaGrey               = 140, 140, 140\n    Swamp                  = 35, 43, 43\n    SweetCorn              = 253, 219, 109\n    SweetPink              = 243, 153, 152\n    Tacao                  = 236, 177, 118\n    TahitiGold             = 235, 97, 35\n    Tan                    = 210, 180, 140\n    Tangaroa               = 0, 28, 61\n    Tangerine              = 228, 132, 0\n    TangerineYellow        = 253, 204, 13\n    Tapestry               = 183, 110, 121\n    Taupe                  = 72, 60, 50\n    TaupeGrey              = 139, 133, 137\n    TawnyPort              = 102, 66, 77\n    TaxBreak               = 79, 102, 106\n    TeaGreen               = 208, 240, 192\n    Teak                   = 176, 141, 87\n    Teal                   = 0, 128, 128\n    TeaRose                = 255, 133, 207\n    Temptress              = 60, 20, 33\n    Tenne                  = 200, 101, 0\n    TerraCotta             = 226, 114, 91\n    Thistle                = 216, 191, 216\n    TickleMePink           = 245, 111, 161\n    Tidal                  = 232, 244, 140\n    TitanWhite             = 214, 202, 221\n    Toast                  = 165, 113, 100\n    Tomato                 = 255, 99, 71\n    TorchRed               = 255, 3, 62\n    ToryBlue               = 54, 81, 148\n    Tradewind              = 110, 174, 161\n    TrendyPink             = 133, 96, 136\n    TropicalRainForest     = 0, 127, 102\n    TrueV                  = 139, 114, 190\n    TulipTree              = 229, 183, 59\n    Tumbleweed             = 222, 170, 136\n    Turbo                  = 255, 195, 36\n    TurkishRose            = 152, 119, 123\n    Turquoise              = 64, 224, 208\n    TurquoiseBlue          = 118, 215, 234\n    Tuscany                = 175, 89, 62\n    TwilightBlue           = 253, 255, 245\n    Twine                  = 186, 135, 89\n    TyrianPurple           = 102, 2, 60\n    Ultramarine            = 10, 17, 149\n    UltraPink              = 255, 111, 255\n    Valencia               = 222, 82, 70\n    VanCleef               = 84, 61, 55\n    VanillaIce             = 229, 204, 201\n    VenetianRed            = 209, 0, 28\n    Venus                  = 138, 127, 128\n    Vermilion              = 251, 79, 20\n    VeryLightGrey          = 207, 207, 207\n    VidaLoca               = 94, 140, 49\n    Viking                 = 71, 171, 204\n    Viola                  = 180, 131, 149\n    ViolentViolet          = 50, 23, 77\n    Violet                 = 238, 130, 238\n    VioletRed              = 255, 57, 136\n    Viridian               = 64, 130, 109\n    VistaBlue              = 159, 226, 191\n    VividViolet            = 127, 62, 152\n    WaikawaGrey            = 83, 104, 149\n    Wasabi                 = 150, 165, 60\n    Watercourse            = 0, 106, 78\n    Wedgewood              = 67, 107, 149\n    WellRead               = 147, 61, 65\n    Wewak                  = 255, 152, 153\n    Wheat                  = 245, 222, 179\n    Whiskey                = 217, 154, 108\n    WhiskeySour            = 217, 144, 88\n    White                  = 255, 255, 255\n    WhiteSmoke             = 245, 245, 245\n    WildRice               = 228, 217, 111\n    WildSand               = 229, 228, 226\n    WildStrawberry         = 252, 65, 154\n    WildWatermelon         = 255, 84, 112\n    WildWillow             = 172, 191, 96\n    Windsor                = 76, 40, 130\n    Wisteria               = 191, 148, 228\n    Wistful                = 162, 162, 208\n    Yellow                 = 255, 255, 0\n    YellowGreen            = 154, 205, 50\n    YellowOrange           = 255, 174, 66\n    YourPink               = 244, 194, 194\n}"
  },
  {
    "path": "Private/Parameters/Script.RegistryDictionaries.ps1",
    "content": "﻿function Get-PSRegistryDictionaries {\n    <#\n    .SYNOPSIS\n    Retrieves a set of registry dictionaries for common registry hives and keys.\n\n    .DESCRIPTION\n    This function retrieves a set of registry dictionaries that provide mappings for common registry hives and keys. These dictionaries can be used to easily reference different registry locations in PowerShell scripts.\n\n    .EXAMPLE\n    Get-PSRegistryDictionaries\n\n    Description:\n    Retrieves all the registry dictionaries.\n\n    #>\n    [cmdletBinding()]\n    param()\n    if ($Script:Dictionary) {\n        return\n    }\n    $Script:Dictionary = @{\n        # Those don't really exists, but we want to allow targetting all users or default users\n        'HKUAD:'   = 'HKEY_ALL_USERS_DEFAULT' # All users in HKEY_USERS including .DEFAULT_USER (auto mapped from NTUSER.DAT)\n        'HKUA:'    = 'HKEY_ALL_USERS' # All users in HKEY_USERS excluding .DEFAULT / .DEFAULT_USER (auto mapped from NTUSER.DAT)\n        'HKUD:'    = 'HKEY_DEFAULT_USER' # DEFAULT_USER user in HKEY_USERS (auto mapped from NTUSER.DAT)\n        'HKUDUD:'  = 'HKEY_ALL_DOMAIN_USERS_DEFAULT' # All users in HKEY_USERS that are non SPECIAL accounts including .DEFAULT_USER (auto mapped from NTUSER.DAT)\n\n        # All users in HKEY_USERS that are non SPECIAL accounts excluding .DEFAULT / .DEFAULT_USER (auto mapped from NTUSER.DAT)\n        'HKUDU:'   = 'HKEY_ALL_DOMAIN_USERS'\n        # All users in HKEY_USERS that are non SPECIAL accounts excluding .DEFAULT / .DEFAULT_USER (auto mapped from NTUSER.DAT)\n        # But also including non-loaded users (not logged in) (auto mapped from NTUSER.DAT)\n        'HKUDUO:'  = 'HKEY_ALL_DOMAIN_USERS_OTHER'\n        # All users in HKEY_USERS that are non SPECIAL accounts including .DEFAULT_USER (auto mapped from NTUSER.DAT)\n        # But also including non-loaded users (not logged in) (auto mapped from NTUSER.DAT)\n        'HKUDUDO:' = 'HKEY_ALL_DOMAIN_USERS_OTHER_DEFAULT'\n        # order matters\n        'HKCR:'    = 'HKEY_CLASSES_ROOT'\n        'HKCU:'    = 'HKEY_CURRENT_USER'\n        'HKLM:'    = 'HKEY_LOCAL_MACHINE'\n        'HKU:'     = 'HKEY_USERS'\n        'HKCC:'    = 'HKEY_CURRENT_CONFIG'\n        'HKDD:'    = 'HKEY_DYN_DATA'\n        'HKPD:'    = 'HKEY_PERFORMANCE_DATA'\n    }\n\n    $Script:HiveDictionary = [ordered] @{\n        # Those don't really exists, but we want to allow targetting all users or default users\n        # The order matters\n        'HKEY_ALL_USERS_DEFAULT'              = 'All+Default'\n        'HKUAD'                               = 'All+Default'\n        'HKEY_ALL_USERS'                      = 'All'\n        'HKUA'                                = 'All'\n        'HKEY_ALL_DOMAIN_USERS_DEFAULT'       = 'AllDomain+Default'\n        'HKUDUD'                              = 'AllDomain+Default'\n        'HKEY_ALL_DOMAIN_USERS'               = 'AllDomain'\n        'HKUDU'                               = 'AllDomain'\n        'HKEY_DEFAULT_USER'                   = 'Default'\n        'HKUD'                                = 'Default'\n        'HKEY_ALL_DOMAIN_USERS_OTHER'         = 'AllDomain+Other'\n        'HKUDUO'                              = 'AllDomain+Other'\n        'HKUDUDO'                             = 'AllDomain+Other+Default'\n        'HKEY_ALL_DOMAIN_USERS_OTHER_DEFAULT' = 'AllDomain+Other+Default'\n        # Those exists\n        'HKEY_CLASSES_ROOT'                   = 'ClassesRoot'\n        'HKCR'                                = 'ClassesRoot'\n        'ClassesRoot'                         = 'ClassesRoot'\n        'HKCU'                                = 'CurrentUser'\n        'HKEY_CURRENT_USER'                   = 'CurrentUser'\n        'CurrentUser'                         = 'CurrentUser'\n        'HKLM'                                = 'LocalMachine'\n        'HKEY_LOCAL_MACHINE'                  = 'LocalMachine'\n        'LocalMachine'                        = 'LocalMachine'\n        'HKU'                                 = 'Users'\n        'HKEY_USERS'                          = 'Users'\n        'Users'                               = 'Users'\n        'HKCC'                                = 'CurrentConfig'\n        'HKEY_CURRENT_CONFIG'                 = 'CurrentConfig'\n        'CurrentConfig'                       = 'CurrentConfig'\n        'HKDD'                                = 'DynData'\n        'HKEY_DYN_DATA'                       = 'DynData'\n        'DynData'                             = 'DynData'\n        'HKPD'                                = 'PerformanceData'\n        'HKEY_PERFORMANCE_DATA '              = 'PerformanceData'\n        'PerformanceData'                     = 'PerformanceData'\n\n    }\n\n    $Script:ReverseTypesDictionary = [ordered] @{\n        'REG_SZ'        = 'string'\n        'REG_NONE'      = 'none'\n        'REG_EXPAND_SZ' = 'expandstring'\n        'REG_BINARY'    = 'binary'\n        'REG_DWORD'     = 'dword'\n        'REG_MULTI_SZ'  = 'multistring'\n        'REG_QWORD'     = 'qword'\n        'string'        = 'string'\n        'expandstring'  = 'expandstring'\n        'binary'        = 'binary'\n        'dword'         = 'dword'\n        'multistring'   = 'multistring'\n        'qword'         = 'qword'\n        'none'          = 'none'\n    }\n}"
  },
  {
    "path": "Private/Remove-ChildItems.ps1",
    "content": "﻿function Remove-ChildItems {\n    <#\n    .SYNOPSIS\n    Helper function that removes the child items of a given folder.\n\n    .DESCRIPTION\n    - Enumerates the folder's contents (recursively if requested).\n    - Removes each child item individually, respecting the chosen DeleteMethod.\n    - Respects -WhatIf and -Confirm (because of CmdletBinding with SupportsShouldProcess).\n    - Records attempts in Passthru objects if desired.\n\n    .PARAMETER TopLevelPath\n    Specifies the path to the folder whose contents are to be removed.\n\n    .PARAMETER DeleteMethod\n    Specifies the removal method: RemoveItem, DotNetDelete, or RecycleBin.\n\n    .PARAMETER Recursive\n    Specifies whether to enumerate child items recursively.\n\n    .PARAMETER Retries\n    Number of retry attempts for each item.\n\n    .PARAMETER Include\n    Include patterns for Get-ChildItem.\n\n    .PARAMETER Exclude\n    Exclude patterns for Get-ChildItem.\n\n    .PARAMETER Filter\n    Filter for Get-ChildItem.\n\n    .PARAMETER Passthru\n    If true, records results in $Results.\n\n    .PARAMETER Results\n    [System.Collections.Generic.List[PSObject]] passed in from the parent function.\n\n    .PARAMETER AllSucceededRef\n    [ref] reference to a boolean tracking overall success/failure.\n\n    .EXAMPLE\n    Remove-ChildItems -TopLevelPath \"C:\\Folder\" -DeleteMethod RemoveItem -Recursive -WhatIf\n\n    Shows (via WhatIf) which items would be removed inside \"C:\\Folder\".\n    #>\n    [CmdletBinding(SupportsShouldProcess)]\n    param(\n        [Parameter(Mandatory)][string] $TopLevelPath,\n\n        [Parameter(Mandatory)][ValidateSet(\"RemoveItem\", \"DotNetDelete\", \"RecycleBin\")]\n        [string] $DeleteMethod,\n\n        [switch] $Recursive,\n\n        [int] $Retries,\n\n        [string[]] $Include,\n\n        [string[]] $Exclude,\n\n        [string] $Filter,\n\n        [switch] $Passthru,\n\n        [System.Collections.Generic.List[PSObject]] $Results,\n\n        [ref] $AllSucceededRef\n    )\n    begin {\n        Write-Verbose -Message \"Remove-ItemAlternative - Removing contents of '$TopLevelPath' (SkipFolder).\"\n        $getChildItemSplat = @{\n            LiteralPath = $TopLevelPath\n            Force       = $true\n            Include     = $Include\n            Exclude     = $Exclude\n            Filter      = $Filter\n            ErrorAction = 'SilentlyContinue'\n        }\n        Remove-EmptyValue -Hashtable $getChildItemSplat\n\n        $Items = Get-ChildItem @getChildItemSplat\n        if ($Recursive) {\n            $Items = $Items | Sort-Object -Property FullName -Descending\n        }\n\n        # Detect if -WhatIf was explicitly set on this function call\n        $WhatIfUsed = $WhatIfPreference\n    }\n    process {\n        foreach ($Item in $Items) {\n            $Attempt = 0\n            $Deleted = $false\n            $LastError = $null\n\n            while ($Attempt -lt $Retries -and -not $Deleted) {\n                $Attempt++\n                Write-Verbose -Message \"Remove-ItemAlternative - Attempting to remove '$($Item.FullName)' (Attempt $Attempt of $Retries).\"\n\n                if ($WhatIfUsed) {\n                    # If -WhatIf is on, skip the actual removal\n                    $LastError = \"Skipped because -WhatIf was used.\"\n                }\n                if ($PSCmdlet.ShouldProcess($Item.FullName, \"Remove child item\")) {\n                    try {\n                        switch ($DeleteMethod) {\n                            'RemoveItem' {\n                                if ($Recursive -and $Item.PSIsContainer) {\n                                    Remove-Item -LiteralPath $Item.FullName -Recurse -Force -ErrorAction Stop\n                                } else {\n                                    Remove-Item -LiteralPath $Item.FullName -Force -ErrorAction Stop\n                                }\n                            }\n                            'DotNetDelete' {\n                                if ($Item.PSIsContainer) {\n                                    $Dir = [System.IO.DirectoryInfo] $Item.FullName\n                                    if ($Recursive) {\n                                        $Dir.Delete($true)\n                                    } else {\n                                        $Dir.Delete()\n                                    }\n                                } else {\n                                    $File = [System.IO.FileInfo] $Item.FullName\n                                    $File.Delete()\n                                }\n                            }\n                            'RecycleBin' {\n                                $Shell = [Activator]::CreateInstance([Type]::GetTypeFromProgID(\"Shell.Application\"))\n                                $FolderPath = Split-Path $Item.FullName\n                                $Leaf = Split-Path $Item.FullName -Leaf\n                                $Folder = $Shell.NameSpace($FolderPath)\n                                if (-not $Folder) {\n                                    throw \"Could not open folder: $FolderPath\"\n                                }\n                                $ShellItem = $Folder.ParseName($Leaf)\n                                if (-not $ShellItem) {\n                                    throw \"Item '$Leaf' not found in folder: $FolderPath\"\n                                }\n                                $ShellItem.InvokeVerb(\"delete\")\n                            }\n                        }\n                        $Deleted = $true\n                    } catch {\n                        $LastError = $_.Exception.Message\n                        Write-Verbose -Message \"Remove-ItemAlternative - Error deleting '$($Item.FullName)': $LastError\"\n\n                        if ($PSCmdlet.ErrorAction -eq 'Stop') {\n                            if ($Attempt -ge $Retries) {\n                                throw \"Remove-ItemAlternative - Couldn't delete '$($Item.FullName)' after $Retries attempts. Error: $LastError\"\n                            }\n                        } else {\n                            if ($Attempt -ge $Retries) {\n                                Write-Warning -Message \"Remove-ItemAlternative - Couldn't delete '$($Item.FullName)' after $Retries attempts. Error: $LastError\"\n                            }\n                        }\n                    }\n\n                }\n            }\n\n            # If it wasn't actually deleted and not just a -WhatIf skip, mark overall failure\n            if (-not $Deleted -and -not $WhatIfUsed) {\n                $AllSucceededRef.Value = $false\n            }\n\n            if ($Passthru) {\n                $Results.Add(\n                    [PSCustomObject]@{\n                        Path         = $Item.FullName\n                        Status       = $Deleted\n                        Reason       = if ($Deleted) { $null } else { $LastError }\n                        AttemptCount = $Attempt\n                        WhatIf       = $WhatIfUsed\n                    }\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "Private/Remove-PrivateRegistry.ps1",
    "content": "﻿function Remove-PrivateRegistry {\n    <#\n    .SYNOPSIS\n    Removes a private registry key on a local or remote computer.\n\n    .DESCRIPTION\n    The Remove-PrivateRegistry function removes a registry key on a specified computer. It can be used to delete registry keys for a specific hive key, subkey, and key value.\n\n    .PARAMETER Computer\n    Specifies the name of the computer where the registry key will be removed.\n\n    .PARAMETER Key\n    Specifies the key value to be removed.\n\n    .PARAMETER RegistryValue\n    Specifies the registry key information to be removed. This should be an IDictionary object containing the hive key, subkey, and key value.\n\n    .PARAMETER Remote\n    Indicates whether the registry operation should be performed on a remote computer.\n\n    .PARAMETER Suppress\n    Suppresses the error message if set to true.\n\n    .EXAMPLE\n    Remove-PrivateRegistry -Computer 'Server01' -Key 'Version' -RegistryValue @{ HiveKey = 'LocalMachine'; SubKeyName = 'Software\\MyApp' }\n\n    Description:\n    Removes the registry key 'Version' under 'LocalMachine\\Software\\MyApp' on the local computer 'Server01'.\n\n    .EXAMPLE\n    Remove-PrivateRegistry -Computer 'Workstation01' -Key 'Wallpaper' -RegistryValue @{ HiveKey = 'CurrentUser'; SubKeyName = 'Control Panel\\Desktop' } -Remote\n\n    Description:\n    Removes the registry key 'Wallpaper' under 'CurrentUser\\Control Panel\\Desktop' on the remote computer 'Workstation01'.\n    #>\n    [cmdletBinding(SupportsShouldProcess)]\n    param(\n        [string] $Computer,\n        [string] $Key,\n        [System.Collections.IDictionary] $RegistryValue,\n        [switch] $Remote,\n        [switch] $Suppress\n    )\n    $PSConnection = $null\n    $PSError = $null\n    $PSErrorMessage = $null\n    try {\n        if ($Remote) {\n            $BaseHive = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($RegistryValue.HiveKey, $Computer, 0 )\n        } else {\n            $BaseHive = [Microsoft.Win32.RegistryKey]::OpenBaseKey($RegistryValue.HiveKey, 0 )\n        }\n        $PSConnection = $true\n        $PSError = $null\n    } catch {\n        $PSConnection = $false\n        $PSError = $($_.Exception.Message)\n        if ($PSBoundParameters.ErrorAction -eq 'Stop') {\n            if ($null -ne $BaseHive) {\n                $BaseHive.Close()\n                $BaseHive.Dispose()\n            }\n            throw\n        } else {\n            Write-Warning \"Remove-PSRegistry - Removing registry $($RegistryValue.HiveKey)\\$($RegistryValue.SubKeyName) key $($RegistryValue.Key) on $Computer have failed. Error: $($_.Exception.Message.Replace([System.Environment]::NewLine, \" \"))\"\n        }\n    }\n    if ($PSError) {\n        if (-not $Suppress) {\n            [PSCustomObject] @{\n                PSComputerName = $Computer\n                PSConnection   = $PSConnection\n                PSError        = $true\n                PSErrorMessage = $PSError\n                Path           = \"$($RegistryValue.HiveKey)\\$($RegistryValue.SubKeyName)\"\n                Key            = $RegistryValue.Key\n            }\n        }\n    } else {\n        try {\n            if ($Key) {\n                $SubKey = $BaseHive.OpenSubKey($RegistryValue.SubKeyName, $true)\n                if ($PSCmdlet.ShouldProcess($Computer, \"Removing registry $($RegistryValue.HiveKey)\\$($RegistryValue.SubKeyName) key $($RegistryValue.Key)\")) {\n                    if ($SubKey) {\n                        $SubKey.DeleteValue($RegistryValue.Key, $true)\n                    }\n                } else {\n                    $PSError = $true\n                    $PSErrorMessage = \"WhatIf was used. No changes done.\"\n                }\n            } else {\n                if ($PSCmdlet.ShouldProcess($Computer, \"Removing registry $($RegistryValue.HiveKey)\\$($RegistryValue.SubKeyName) folder\")) {\n                    if ($BaseHive) {\n                        if ($Recursive) {\n                            $BaseHive.DeleteSubKeyTree($RegistryValue.SubKeyName, $true)\n                        } else {\n                            $BaseHive.DeleteSubKey($RegistryValue.SubKeyName, $true)\n                        }\n                    }\n                } else {\n                    $PSError = $true\n                    $PSErrorMessage = \"WhatIf was used. No changes done.\"\n                }\n            }\n            if (-not $Suppress) {\n                [PSCustomObject] @{\n                    PSComputerName = $Computer\n                    PSConnection   = $PSConnection\n                    PSError        = $PSError\n                    PSErrorMessage = $PSErrorMessage\n                    Path           = \"$($RegistryValue.HiveKey)\\$($RegistryValue.SubKeyName)\"\n                    Key            = $RegistryValue.Key\n                }\n            }\n        } catch {\n            if ($PSBoundParameters.ErrorAction -eq 'Stop') {\n                if ($null -ne $SubKey) {\n                    $SubKey.Close()\n                    $SubKey.Dispose()\n                }\n                if ($null -ne $BaseHive) {\n                    $BaseHive.Close()\n                    $BaseHive.Dispose()\n                }\n                throw\n            } else {\n                Write-Warning \"Remove-PSRegistry - Removing registry $($RegistryValue.HiveKey)\\$($RegistryValue.SubKeyName) key $($RegistryValue.Key) on $Computer have failed. Error: $($_.Exception.Message.Replace([System.Environment]::NewLine, \" \"))\"\n            }\n            if (-not $Suppress) {\n                [PSCustomObject] @{\n                    PSComputerName = $Computer\n                    PSConnection   = $PSConnection\n                    PSError        = $true\n                    PSErrorMessage = $_.Exception.Message\n                    Path           = \"$($RegistryValue.HiveKey)\\$($RegistryValue.SubKeyName)\"\n                    Key            = $RegistryValue.Key\n                }\n            }\n        }\n    }\n    if ($null -ne $SubKey) {\n        $SubKey.Close()\n        $SubKey.Dispose()\n    }\n    if ($null -ne $BaseHive) {\n        $BaseHive.Close()\n        $BaseHive.Dispose()\n    }\n}"
  },
  {
    "path": "Private/Request-Credential.ps1",
    "content": "﻿function Request-Credentials {\n    <#\n    .SYNOPSIS\n    Requests credentials for authentication purposes.\n\n    .DESCRIPTION\n    The Request-Credentials function is used to prompt the user for credentials. It provides options to input the username and password directly, read the password from a file, convert the password to a secure string, and handle various error scenarios.\n\n    .PARAMETER UserName\n    Specifies the username for authentication.\n\n    .PARAMETER Password\n    Specifies the password for authentication.\n\n    .PARAMETER AsSecure\n    Indicates whether the password should be converted to a secure string.\n\n    .PARAMETER FromFile\n    Specifies whether the password should be read from a file.\n\n    .PARAMETER Output\n    Indicates whether the function should return output in case of errors.\n\n    .PARAMETER NetworkCredentials\n    Specifies if network credentials are being requested.\n\n    .PARAMETER Service\n    Specifies the service for which credentials are being requested.\n\n    .EXAMPLE\n    Request-Credentials -UserName 'JohnDoe' -Password 'P@ssw0rd' -AsSecure\n    Requests credentials for the user 'JohnDoe' with the password 'P@ssw0rd' in a secure format.\n\n    .EXAMPLE\n    Request-Credentials -FromFile -Password 'C:\\Credentials.txt' -Output -Service 'FTP'\n    Reads the password from the file 'C:\\Credentials.txt' and returns an error message if the file is unreadable for the FTP service.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string] $UserName,\n        [string] $Password,\n        [switch] $AsSecure,\n        [switch] $FromFile,\n        [switch] $Output,\n        [switch] $NetworkCredentials,\n        [string] $Service\n    )\n    if ($FromFile) {\n        if (($Password -ne '') -and (Test-Path $Password)) {\n            # File is there and we are reading it into Password\n            Write-Verbose \"Request-Credentials - Reading password from file $Password\"\n            $Password = Get-Content -Path $Password\n        } else {\n            # File is not there or couldn't be read\n            if ($Output) {\n                return @{ Status = $false; Output = $Service; Extended = 'File with password unreadable.' }\n            } else {\n                Write-Warning \"Request-Credentials - Secure password from file couldn't be read. File not readable. Terminating.\"\n                return\n            }\n        }\n    }\n    if ($AsSecure) {\n        try {\n            $NewPassword = $Password | ConvertTo-SecureString -ErrorAction Stop\n        } catch {\n            $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n            if ($ErrorMessage -like '*Key not valid for use in specified state*') {\n                if ($Output) {\n                    return @{ Status = $false; Output = $Service; Extended = \"Couldn't use credentials provided. Most likely using credentials from other user/session/computer.\" }\n                } else {\n                    Write-Warning -Message \"Request-Credentials - Couldn't use credentials provided. Most likely using credentials from other user/session/computer.\"\n                    return\n                }\n            } else {\n                if ($Output) {\n                    return @{ Status = $false; Output = $Service; Extended = $ErrorMessage }\n                } else {\n                    Write-Warning -Message \"Request-Credentials - $ErrorMessage\"\n                    return\n                }\n            }\n        }\n\n    } else {\n        $NewPassword = $Password\n    }\n    if ($UserName -and $NewPassword) {\n        if ($AsSecure) {\n            $Credentials = New-Object System.Management.Automation.PSCredential($Username, $NewPassword)\n        } else {\n            Try {\n                $SecurePassword = $Password | ConvertTo-SecureString -asPlainText -Force -ErrorAction Stop\n            } catch {\n                $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n                if ($ErrorMessage -like '*Key not valid for use in specified state*') {\n                    if ($Output) {\n                        return  @{ Status = $false; Output = $Service; Extended = \"Couldn't use credentials provided. Most likely using credentials from other user/session/computer.\" }\n                    } else {\n                        Write-Warning -Message \"Request-Credentials - Couldn't use credentials provided. Most likely using credentials from other user/session/computer.\"\n                        return\n                    }\n                } else {\n                    if ($Output) {\n                        return @{ Status = $false; Output = $Service; Extended = $ErrorMessage }\n                    } else {\n                        Write-Warning -Message \"Request-Credentials - $ErrorMessage\"\n                        return\n                    }\n                }\n            }\n            $Credentials = New-Object System.Management.Automation.PSCredential($Username, $SecurePassword)\n        }\n    } else {\n        if ($Output) {\n            return @{ Status = $false; Output = $Service; Extended = 'Username or/and Password is empty' }\n        } else {\n            Write-Warning -Message 'Request-Credentials - UserName or Password are empty.'\n            return\n        }\n    }\n    if ($NetworkCredentials) {\n        return $Credentials.GetNetworkCredential()\n    } else {\n        return $Credentials\n    }\n}"
  },
  {
    "path": "Private/Resolve-Encoding.ps1",
    "content": "function Resolve-Encoding {\n    <#\n    .SYNOPSIS\n        Resolves encoding names to .NET System.Text.Encoding objects.\n\n    .DESCRIPTION\n        Converts encoding name strings to proper .NET encoding objects, with special handling\n        for UTF8BOM (UTF8 with BOM) and OEM encodings that aren't directly available in\n        System.Text.Encoding static properties.\n\n    .PARAMETER Name\n        The name of the encoding to resolve. Supports common encodings used in text file processing.\n\n    .EXAMPLE\n        Resolve-Encoding -Name 'UTF8BOM'\n        Returns a UTF8Encoding object configured to emit a BOM.\n\n    .EXAMPLE\n        Resolve-Encoding -Name 'ASCII'\n        Returns the ASCII encoding object.\n    #>\n    [CmdletBinding()]\n    param(\n        [Parameter(Mandatory)]\n        [ValidateSet('Ascii','BigEndianUnicode','Unicode','UTF7','UTF8','UTF8BOM','UTF32','Default','OEM')]\n        [string] $Name\n    )\n\n    switch ($Name.ToUpperInvariant()) {\n        'UTF8BOM' {\n            return [System.Text.UTF8Encoding]::new($true)\n        }\n        'UTF8' {\n            return [System.Text.UTF8Encoding]::new($false)\n        }\n        'OEM' {\n            return [System.Text.Encoding]::GetEncoding([Console]::OutputEncoding.CodePage)\n        }\n        default {\n            try {\n                return [System.Text.Encoding]::$Name\n            } catch {\n                throw \"Failed to resolve encoding '$Name': $($_.Exception.Message)\"\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Private/Resolve-PrivateRegistry.ps1",
    "content": "﻿function Resolve-PrivateRegistry {\n    <#\n    .SYNOPSIS\n    Resolves and standardizes registry paths for consistency and compatibility.\n\n    .DESCRIPTION\n    The Resolve-PrivateRegistry function resolves and standardizes registry paths to ensure uniformity and compatibility across different systems. It cleans up the paths, converts short hive names to full names, and handles special cases like DEFAULT USER mappings.\n\n    .PARAMETER RegistryPath\n    Specifies an array of registry paths to be resolved and standardized.\n\n    .EXAMPLE\n    Resolve-PrivateRegistry -RegistryPath 'Users\\.DEFAULT_USER\\Software\\MyApp'\n    Resolves the registry path 'Users\\.DEFAULT_USER\\Software\\MyApp' to 'HKUD\\Software\\MyApp' for consistent usage.\n\n    .EXAMPLE\n    Resolve-PrivateRegistry -RegistryPath 'HKCU\\Software\\MyApp'\n    Resolves the registry path 'HKCU\\Software\\MyApp' to 'HKEY_CURRENT_USER\\Software\\MyApp' for compatibility with standard naming conventions.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [alias('Path')][string[]] $RegistryPath\n    )\n    foreach ($R in $RegistryPath) {\n        # clean up the path\n        $R = $R.Replace(\"\\\\\", \"\\\").Replace(\"\\\\\", \"\\\")\n\n        # This is to address DEFAULT USER Mapping when after returning value from registry someone takes it and feeds it back to cmdlets\n        If ($R.StartsWith(\"Users\\.DEFAULT_USER\") -or $R.StartsWith('HKEY_USERS\\.DEFAULT_USER')) {\n            $R = $R.Replace(\"Users\\.DEFAULT_USER\", \"HKUD\")\n            $R.Replace('HKEY_USERS\\.DEFAULT_USER', \"HKUD\")\n        } elseif ($R -like '*:*') {\n            $Found = $false\n            # This makes sure any short HIVES are converted to expected values\n            foreach ($DictionaryKey in $Script:Dictionary.Keys) {\n                $SplitParts = $R.Split(\"\\\")\n                $FirstPart = $SplitParts[0]\n                if ($FirstPart -eq $DictionaryKey) {\n                    $R -replace $DictionaryKey, $Script:Dictionary[$DictionaryKey]\n                    $Found = $true\n                    break\n                }\n            }\n            # Lets try to fix things for user if he uses LONG HIVE names but still with colon\n            if (-not $Found) {\n                $R.Replace(\":\", \"\")\n            }\n        } else {\n            # This makes sure we do any string without \":\" as literal and follow what user wants\n            $R\n        }\n    }\n}"
  },
  {
    "path": "Private/Set-PrivateRegistry.ps1",
    "content": "﻿function Set-PrivateRegistry {\n    <#\n    .SYNOPSIS\n    Sets a registry value on a local or remote computer.\n\n    .DESCRIPTION\n    The Set-PrivateRegistry function sets a registry value on a specified computer. It can be used to create new registry keys and values, update existing ones, or delete them.\n\n    .PARAMETER RegistryValue\n    Specifies the registry value to be set. This parameter should be an IDictionary object containing the following properties:\n        - HiveKey: The registry hive key (e.g., 'LocalMachine', 'CurrentUser').\n        - SubKeyName: The subkey path where the value will be set.\n        - Key: The name of the registry value.\n        - Value: The data to be stored in the registry value.\n        - ValueKind: The type of data being stored (e.g., String, DWord, MultiString).\n\n    .PARAMETER Computer\n    Specifies the name of the computer where the registry value will be set.\n\n    .PARAMETER Remote\n    Indicates that the registry value should be set on a remote computer.\n\n    .PARAMETER Suppress\n    Suppresses error messages and warnings.\n\n    .EXAMPLE\n    Set-PrivateRegistry -RegistryValue @{HiveKey='LocalMachine'; SubKeyName='SOFTWARE\\MyApp'; Key='Version'; Value='1.0'; ValueKind='String'} -Computer 'Server01'\n    Sets the registry value 'Version' under 'HKEY_LOCAL_MACHINE\\SOFTWARE\\MyApp' to '1.0' on the local computer 'Server01'.\n\n    .EXAMPLE\n    Set-PrivateRegistry -RegistryValue @{HiveKey='CurrentUser'; SubKeyName='Environment'; Key='Path'; Value='C:\\MyApp'; ValueKind='String'} -Computer 'Server02' -Remote\n    Sets the registry value 'Path' under 'HKEY_CURRENT_USER\\Environment' to 'C:\\MyApp' on the remote computer 'Server02'.\n\n    .NOTES\n    File Name      : Set-PrivateRegistry.ps1\n    Prerequisite   : This function requires administrative privileges to modify the registry.\n    #>\n    [cmdletBinding(SupportsShouldProcess)]\n    param(\n        [System.Collections.IDictionary] $RegistryValue,\n        [string] $Computer,\n        [switch] $Remote,\n        [switch] $Suppress\n    )\n    Write-Verbose -Message \"Set-PSRegistry - Setting registry $($RegistryValue.HiveKey)\\$($RegistryValue.SubKeyName) on $($RegistryValue.Key) to $($RegistryValue.Value) of $($RegistryValue.ValueKind) on $Computer\"\n    if ($RegistryValue.ComputerName) {\n        if ($RegistryValue.ComputerName -ne $Computer) {\n            return\n        }\n    }\n    try {\n        if ($Remote) {\n            $BaseHive = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($RegistryValue.HiveKey, $Computer, 0 )\n        } else {\n            $BaseHive = [Microsoft.Win32.RegistryKey]::OpenBaseKey($RegistryValue.HiveKey, 0 )\n        }\n        $PSConnection = $true\n        $PSError = $null\n    } catch {\n        $PSConnection = $false\n        $PSError = $($_.Exception.Message)\n        if ($PSBoundParameters.ErrorAction -eq 'Stop') {\n            if ($null -ne $BaseHive) {\n                $BaseHive.Close()\n                $BaseHive.Dispose()\n            }\n            throw\n        } else {\n            Write-Warning \"Set-PSRegistry - Setting registry $($RegistryValue.HiveKey)\\$($RegistryValue.SubKeyName) on $($RegistryValue.Key) to $($RegistryValue.Value) of $($RegistryValue.ValueKind) on $Computer have failed. Error: $($_.Exception.Message.Replace([System.Environment]::NewLine, \" \"))\"\n        }\n    }\n    if ($PSCmdlet.ShouldProcess($Computer, \"Setting registry $($RegistryValue.HiveKey)\\$($RegistryValue.SubKeyName) on $($RegistryValue.Key) to $($RegistryValue.Value) of $($RegistryValue.ValueKind)\")) {\n        if ($PSError) {\n            if (-not $Suppress) {\n                [PSCustomObject] @{\n                    PSComputerName = $Computer\n                    PSConnection   = $PSConnection\n                    PSError        = $true\n                    PSErrorMessage = $PSError\n                    Path           = \"$($RegistryValue.HiveKey)\\$($RegistryValue.SubKeyName)\"\n                    Key            = $RegistryValue.Key\n                    Value          = $RegistryValue.Value\n                    Type           = $RegistryValue.ValueKind\n                }\n            }\n        } else {\n            try {\n                #$BaseHive = [Microsoft.Win32.RegistryKey]::OpenBaseKey($RegistryValue.HiveKey, 0 )\n                $SubKey = $BaseHive.OpenSubKey($RegistryValue.SubKeyName, $true)\n                if (-not $SubKey) {\n                    $SubKeysSplit = $RegistryValue.SubKeyName.Split('\\')\n                    $SubKey = $BaseHive.OpenSubKey($SubKeysSplit[0], $true)\n                    if (-not $SubKey) {\n                        $SubKey = $BaseHive.CreateSubKey($SubKeysSplit[0])\n                    }\n                    $SubKey = $BaseHive.OpenSubKey($SubKeysSplit[0], $true)\n                    foreach ($S in $SubKeysSplit | Select-Object -Skip 1) {\n                        $SubKey = $SubKey.CreateSubKey($S)\n                    }\n                }\n                if ($RegistryValue.ValueKind -eq [Microsoft.Win32.RegistryValueKind]::MultiString) {\n                    $SubKey.SetValue($RegistryValue.Key, [string[]] $RegistryValue.Value, $RegistryValue.ValueKind)\n                } elseif ($RegistryValue.ValueKind -in [Microsoft.Win32.RegistryValueKind]::None, [Microsoft.Win32.RegistryValueKind]::Binary) {\n                    $SubKey.SetValue($RegistryValue.Key, [byte[]] $RegistryValue.Value, $RegistryValue.ValueKind)\n                } else {\n                    $SubKey.SetValue($RegistryValue.Key, $RegistryValue.Value, $RegistryValue.ValueKind)\n                }\n                if (-not $Suppress) {\n                    [PSCustomObject] @{\n                        PSComputerName = $Computer\n                        PSConnection   = $PSConnection\n                        PSError        = $false\n                        PSErrorMessage = $null\n                        Path           = \"$($RegistryValue.HiveKey)\\$($RegistryValue.SubKeyName)\"\n                        Key            = $RegistryValue.Key\n                        Value          = $RegistryValue.Value\n                        Type           = $RegistryValue.ValueKind\n                    }\n                }\n            } catch {\n                if ($PSBoundParameters.ErrorAction -eq 'Stop') {\n                    if ($null -ne $SubKey) {\n                        $SubKey.Close()\n                        $SubKey.Dispose()\n                    }\n                    if ($null -ne $BaseHive) {\n                        $BaseHive.Close()\n                        $BaseHive.Dispose()\n                    }\n                    throw\n                } else {\n                    Write-Warning \"Set-PSRegistry - Setting registry $($RegistryValue.HiveKey)\\$($RegistryValue.SubKeyName) on $($RegistryValue.Key) to $($RegistryValue.Value) of $($RegistryValue.ValueKind) on $Computer have failed. Error: $($_.Exception.Message.Replace([System.Environment]::NewLine, \" \"))\"\n                }\n                if (-not $Suppress) {\n                    [PSCustomObject] @{\n                        PSComputerName = $Computer\n                        PSConnection   = $PSConnection\n                        PSError        = $true\n                        PSErrorMessage = $_.Exception.Message\n                        Path           = \"$($RegistryValue.HiveKey)\\$($RegistryValue.SubKeyName)\"\n                        Key            = $RegistryValue.Key\n                        Value          = $RegistryValue.Value\n                        Type           = $RegistryValue.ValueKind\n                    }\n                }\n            }\n        }\n    } else {\n        if (-not $Suppress) {\n            [PSCustomObject] @{\n                PSComputerName = $Computer\n                PSConnection   = $PSConnection\n                PSError        = $true\n                PSErrorMessage = if ($PSError) { $PSError } else { \"WhatIf used - skipping registry setting\" }\n                Path           = \"$($RegistryValue.HiveKey)\\$($RegistryValue.SubKeyName)\"\n                Key            = $RegistryValue.Key\n                Value          = $RegistryValue.Value\n                Type           = $RegistryValue.ValueKind\n            }\n        }\n    }\n    if ($null -ne $SubKey) {\n        $SubKey.Close()\n        $SubKey.Dispose()\n    }\n    if ($null -ne $BaseHive) {\n        $BaseHive.Close()\n        $BaseHive.Dispose()\n    }\n}"
  },
  {
    "path": "Private/Test-IPIsInNetwork.ps1",
    "content": "﻿function Test-IPIsInNetwork {\n    <#\n    .SYNOPSIS\n    Checks if an IP address falls within a specified range defined by binary start and end values.\n\n    .DESCRIPTION\n    This function compares the binary representation of an IP address with the binary start and end values to determine if the IP address falls within the specified range.\n\n    .EXAMPLE\n    Test-IPIsInNetwork -IP \"192.168.1.10\" -StartBinary \"11000000101010000000000100000000\" -EndBinary \"11000000101010000000000111111111\"\n\n    Description:\n    Checks if the IP address 192.168.1.10 falls within the range defined by the binary start and end values.\n\n    #>\n    [cmdletBinding()]\n    param(\n        [string] $IP,\n        [string] $StartBinary,\n        [string] $EndBinary\n    )\n    $TestIPBinary = Convert-IPToBinary $IP\n    [int64] $TestIPInt64 = [System.Convert]::ToInt64($TestIPBinary, 2)\n    [int64] $StartInt64 = [System.Convert]::ToInt64($StartBinary, 2)\n    [int64] $EndInt64 = [System.Convert]::ToInt64($EndBinary, 2)\n    if ($TestIPInt64 -ge $StartInt64 -and $TestIPInt64 -le $EndInt64) {\n        return $True\n    } else {\n        return $False\n    }\n}"
  },
  {
    "path": "Private/Unregister-MountedRegistry.ps1",
    "content": "﻿function Unregister-MountedRegistry {\n    <#\n    .SYNOPSIS\n    Unregisters mounted registry paths.\n\n    .DESCRIPTION\n    This function unregisters mounted registry paths that were previously mounted using Mount-PSRegistryPath.\n\n    .EXAMPLE\n    Unregister-MountedRegistry\n\n    Description:\n    Unregisters all mounted registry paths.\n\n    #>\n    [CmdletBinding()]\n    param(\n\n    )\n    if ($null -ne $Script:DefaultRegistryMounted) {\n        Write-Verbose -Message \"Unregister-MountedRegistry - Dismounting HKEY_USERS\\.DEFAULT_USER\"\n        $null = Dismount-PSRegistryPath -MountPoint \"HKEY_USERS\\.DEFAULT_USER\"\n        $Script:DefaultRegistryMounted = $null\n    }\n    if ($null -ne $Script:OfflineRegistryMounted) {\n        foreach ($Key in $Script:OfflineRegistryMounted.Keys) {\n            if ($Script:OfflineRegistryMounted[$Key].Status -eq $true) {\n                Write-Verbose -Message \"Unregister-MountedRegistry - Dismounting HKEY_USERS\\$Key\"\n                $null = Dismount-PSRegistryPath -MountPoint \"HKEY_USERS\\$Key\"\n            }\n        }\n        $Script:OfflineRegistryMounted = $null\n    }\n}"
  },
  {
    "path": "Public/ActiveDirectory/Convert-ADGuidToSchema.ps1",
    "content": "﻿function Convert-ADGuidToSchema {\n    <#\n    .SYNOPSIS\n    Converts Guid to schema properties\n\n    .DESCRIPTION\n    Converts Guid to schema properties\n\n    .PARAMETER Guid\n    Guid to Convert to Schema Name\n\n    .PARAMETER Domain\n    Domain to query. By default the current domain is used\n\n    .PARAMETER RootDSE\n    RootDSE to query. By default RootDSE is queried from the domain\n\n    .PARAMETER DisplayName\n    Return the schema name by display name. By default it returns as Name\n\n    .PARAMETER Credential\n    Alternate credentials for RootDSE/DC/schema queries.\n\n    .EXAMPLE\n    $T2 = '570b9266-bbb3-4fad-a712-d2e3fedc34dd'\n    $T = [guid] '570b9266-bbb3-4fad-a712-d2e3fedc34dd'\n\n    Convert-ADGuidToSchema -Guid $T\n    Convert-ADGuidToSchema -Guid $T2\n\n    .NOTES\n    General notes\n    #>\n    [alias('Get-WinADDomainGUIDs', 'Get-WinADForestGUIDs')]\n    [cmdletbinding()]\n    param(\n        [string] $Guid,\n        [string] $Domain,\n        [Microsoft.ActiveDirectory.Management.ADEntity] $RootDSE,\n        [switch] $DisplayName,\n        [pscredential] $Credential\n    )\n    $credentialSplat = @{}\n    if ($PSBoundParameters.ContainsKey('Credential')) {\n        $credentialSplat['Credential'] = $Credential\n    }\n    if (-not $Script:ADSchemaMap -or -not $Script:ADSchemaMapDisplayName) {\n        if ($RootDSE) {\n            $Script:RootDSE = $RootDSE\n        } elseif (-not $Script:RootDSE) {\n            if ($Domain) {\n                $Script:RootDSE = Get-ADRootDSE -Server $Domain @credentialSplat\n            } else {\n                $Script:RootDSE = Get-ADRootDSE @credentialSplat\n            }\n        }\n        $DomainCN = ConvertFrom-DistinguishedName -DistinguishedName $Script:RootDSE.defaultNamingContext -ToDomainCN\n        $QueryServer = (Get-ADDomainController -DomainName $DomainCN -Discover -ErrorAction Stop @credentialSplat).Hostname[0]\n\n        $Script:ADSchemaMap = @{ }\n        $Script:ADSchemaMapDisplayName = @{ }\n        $Script:ADSchemaMapDisplayName['00000000-0000-0000-0000-000000000000'] = 'All'\n        $Script:ADSchemaMap.Add('00000000-0000-0000-0000-000000000000', 'All')\n        Write-Verbose \"Convert-ADGuidToSchema - Querying Schema from $QueryServer\"\n        $Time = [System.Diagnostics.Stopwatch]::StartNew()\n        if (-not $Script:StandardRights) {\n            $Script:StandardRights = Get-ADObject -SearchBase $Script:RootDSE.schemaNamingContext -LDAPFilter \"(schemaidguid=*)\" -Properties name, lDAPDisplayName, schemaIDGUID -Server $QueryServer -ErrorAction Stop @credentialSplat | Select-Object name, lDAPDisplayName, schemaIDGUID\n        }\n        foreach ($S in $Script:StandardRights) {\n            $Script:ADSchemaMap[\"$(([System.GUID]$S.schemaIDGUID).Guid)\"] = $S.name\n            $Script:ADSchemaMapDisplayName[\"$(([System.GUID]$S.schemaIDGUID).Guid)\"] = $S.lDAPDisplayName\n        }\n        $Time.Stop()\n        $TimeToExecute = \"$($Time.Elapsed.Days) days, $($Time.Elapsed.Hours) hours, $($Time.Elapsed.Minutes) minutes, $($Time.Elapsed.Seconds) seconds, $($Time.Elapsed.Milliseconds) milliseconds\"\n        Write-Verbose \"Convert-ADGuidToSchema - Querying Schema from $QueryServer took $TimeToExecute\"\n        Write-Verbose \"Convert-ADGuidToSchema - Querying Extended Rights from $QueryServer\"\n        $Time = [System.Diagnostics.Stopwatch]::StartNew()\n        #Create a hashtable to store the GUID value of each extended right in the forest\n        if (-not $Script:ExtendedRightsGuids) {\n            $Script:ExtendedRightsGuids = Get-ADObject -SearchBase $Script:RootDSE.ConfigurationNamingContext -LDAPFilter \"(&(objectclass=controlAccessRight)(rightsguid=*))\" -Properties name, displayName, lDAPDisplayName, rightsGuid -Server $QueryServer -ErrorAction Stop @credentialSplat | Select-Object name, displayName, lDAPDisplayName, rightsGuid\n        }\n        foreach ($S in $Script:ExtendedRightsGuids) {\n            $Script:ADSchemaMap[\"$(([System.GUID]$S.rightsGUID).Guid)\"] = $S.name\n            $Script:ADSchemaMapDisplayName[\"$(([System.GUID]$S.rightsGUID).Guid)\"] = $S.displayName\n        }\n        $Time.Stop()\n        $TimeToExecute = \"$($Time.Elapsed.Days) days, $($Time.Elapsed.Hours) hours, $($Time.Elapsed.Minutes) minutes, $($Time.Elapsed.Seconds) seconds, $($Time.Elapsed.Milliseconds) milliseconds\"\n        Write-Verbose \"Convert-ADGuidToSchema - Querying Extended Rights from $QueryServer took $TimeToExecute\"\n    }\n    if ($Guid) {\n        if ($DisplayName) {\n            $Script:ADSchemaMapDisplayName[$Guid]\n        } else {\n            $Script:ADSchemaMap[$Guid]\n        }\n    } else {\n        if ($DisplayName) {\n            $Script:ADSchemaMapDisplayName\n        } else {\n            $Script:ADSchemaMap\n        }\n    }\n}\n"
  },
  {
    "path": "Public/ActiveDirectory/Convert-ADSchemaToGuid.ps1",
    "content": "﻿function Convert-ADSchemaToGuid {\n    <#\n    .SYNOPSIS\n    Converts name of schema properties to guids\n\n    .DESCRIPTION\n    Converts name of schema properties to guids\n\n    .PARAMETER SchemaName\n    Schema Name to convert to guid\n\n    .PARAMETER All\n    Get hashtable of all schema properties and their guids\n\n    .PARAMETER Domain\n    Domain to query. By default the current domain is used\n\n    .PARAMETER RootDSE\n    RootDSE to query. By default RootDSE is queried from the domain\n\n    .PARAMETER AsString\n    Return the guid as a string\n\n    .PARAMETER Credential\n    Alternate credentials for RootDSE/DC/schema queries.\n\n    .EXAMPLE\n    Convert-ADSchemaToGuid -SchemaName 'ms-Exch-MSO-Forward-Sync-Cookie'\n\n    .EXAMPLE\n    Convert-ADSchemaToGuid -SchemaName 'ms-Exch-MSO-Forward-Sync-Cookie' -AsString\n\n    .NOTES\n    General notes\n    #>\n    [CmdletBinding()]\n    param(\n        [string] $SchemaName,\n        [string] $Domain,\n        [Microsoft.ActiveDirectory.Management.ADEntity] $RootDSE,\n        [switch] $AsString,\n        [pscredential] $Credential\n    )\n    $credentialSplat = @{}\n    if ($PSBoundParameters.ContainsKey('Credential')) {\n        $credentialSplat['Credential'] = $Credential\n    }\n    if (-not $Script:ADGuidMap -or -not $Script:ADGuidMapString) {\n\n        if ($RootDSE) {\n            $Script:RootDSE = $RootDSE\n        } elseif (-not $Script:RootDSE) {\n            if ($Domain) {\n                $Script:RootDSE = Get-ADRootDSE -Server $Domain @credentialSplat\n            } else {\n                $Script:RootDSE = Get-ADRootDSE @credentialSplat\n            }\n        }\n        $DomainCN = ConvertFrom-DistinguishedName -DistinguishedName $Script:RootDSE.defaultNamingContext -ToDomainCN\n        $QueryServer = (Get-ADDomainController -DomainName $DomainCN -Discover -ErrorAction Stop @credentialSplat).Hostname[0]\n        # Create a hashtable to store the GUID value of each schema class and attribute\n\n        $Script:ADGuidMap = [ordered] @{\n            'All' = [System.GUID]'00000000-0000-0000-0000-000000000000'\n        }\n        $Script:ADGuidMapString = [ordered] @{\n            'All' = '00000000-0000-0000-0000-000000000000'\n        }\n        Write-Verbose \"Convert-ADSchemaToGuid - Querying Schema from $QueryServer\"\n        $Time = [System.Diagnostics.Stopwatch]::StartNew()\n        if (-not $Script:StandardRights) {\n            $Script:StandardRights = Get-ADObject -SearchBase $Script:RootDSE.schemaNamingContext -LDAPFilter \"(schemaidguid=*)\" -Properties name, lDAPDisplayName, schemaIDGUID -Server $QueryServer -ErrorAction Stop @credentialSplat | Select-Object name, lDAPDisplayName, schemaIDGUID\n        }\n        foreach ($Guid in $Script:StandardRights) {\n            $Script:ADGuidMapString[$Guid.lDAPDisplayName] = ([System.GUID]$Guid.schemaIDGUID).Guid\n            $Script:ADGuidMapString[$Guid.Name] = ([System.GUID]$Guid.schemaIDGUID).Guid\n            $Script:ADGuidMap[$Guid.lDAPDisplayName] = ([System.GUID]$Guid.schemaIDGUID)\n            $Script:ADGuidMap[$Guid.Name] = ([System.GUID]$Guid.schemaIDGUID)\n        }\n        $Time.Stop()\n        $TimeToExecute = \"$($Time.Elapsed.Days) days, $($Time.Elapsed.Hours) hours, $($Time.Elapsed.Minutes) minutes, $($Time.Elapsed.Seconds) seconds, $($Time.Elapsed.Milliseconds) milliseconds\"\n        Write-Verbose \"Convert-ADSchemaToGuid - Querying Schema from $QueryServer took $TimeToExecute\"\n        Write-Verbose \"Convert-ADSchemaToGuid - Querying Extended Rights from $QueryServer\"\n        $Time = [System.Diagnostics.Stopwatch]::StartNew()\n        #Create a hashtable to store the GUID value of each extended right in the forest\n        if (-not $Script:ExtendedRightsGuids) {\n            $Script:ExtendedRightsGuids = Get-ADObject -SearchBase $Script:RootDSE.ConfigurationNamingContext -LDAPFilter \"(&(objectclass=controlAccessRight)(rightsguid=*))\" -Properties name, displayName, lDAPDisplayName, rightsGuid -Server $QueryServer -ErrorAction Stop @credentialSplat | Select-Object name, displayName, lDAPDisplayName, rightsGuid\n        }\n        foreach ($Guid in $Script:ExtendedRightsGuids) {\n            $Script:ADGuidMapString[$Guid.Name] = ([System.GUID]$Guid.RightsGuid).Guid\n            $Script:ADGuidMapString[$Guid.DisplayName] = ([System.GUID]$Guid.RightsGuid).Guid\n            $Script:ADGuidMap[$Guid.Name] = ([System.GUID]$Guid.RightsGuid)\n            $Script:ADGuidMap[$Guid.DisplayName] = ([System.GUID]$Guid.RightsGuid)\n        }\n        $Time.Stop()\n        $TimeToExecute = \"$($Time.Elapsed.Days) days, $($Time.Elapsed.Hours) hours, $($Time.Elapsed.Minutes) minutes, $($Time.Elapsed.Seconds) seconds, $($Time.Elapsed.Milliseconds) milliseconds\"\n        Write-Verbose \"Convert-ADSchemaToGuid - Querying Extended Rights from $QueryServer took $TimeToExecute\"\n    }\n    if ($SchemaName) {\n        if ($AsString) {\n            return $Script:ADGuidMapString[$SchemaName]\n        } else {\n            return $Script:ADGuidMap[$SchemaName]\n        }\n    } else {\n        if ($AsString) {\n            $Script:ADGuidMapString\n        } else {\n            $Script:ADGuidMap\n        }\n    }\n}\n"
  },
  {
    "path": "Public/ActiveDirectory/Get-ADEncryptionTypes.ps1",
    "content": "﻿function Get-ADEncryptionTypes {\n    <#\n    .SYNOPSIS\n    Retrieves the supported encryption types based on the specified value.\n\n    .DESCRIPTION\n    This function returns the list of encryption types supported by Active Directory based on the provided value. Each encryption type is represented by a string.\n\n    .PARAMETER Value\n    Specifies the integer value representing the encryption types to retrieve.\n\n    .EXAMPLE\n    Get-ADEncryptionTypes -Value 24\n\n    Retrieves the following encryption types:\n    - AES128-CTS-HMAC-SHA1-96\n    - AES256-CTS-HMAC-SHA1-96\n\n    .NOTES\n    This function is designed to provide information about encryption types supported by Active Directory.\n    #>\n    [cmdletbinding()]\n    Param(\n        [parameter(Mandatory = $false, ValueFromPipeline = $True)][int32]$Value\n    )\n    # https://lists.samba.org/archive/cifs-protocol/attachments/20100111/e8bb3520/attachment-0001.pdf\n    # https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-kile/6cfc7b50-11ed-4b4d-846d-6f08f0812919\n    # https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-kile/1163bb03-7035-433e-b5a4-802247262d18#Appendix_A_9\n    [String[]]$EncryptionTypes = @(\n        Foreach ($V in $Value) {\n            if ([int32]$V -band 0x00000001) { \"DES-CBC-CRC\" } # KERB_ENCTYPE_DES_CBC_CRC -> CRC\n            if ([int32]$V -band 0x00000002) { \"DES-CBC-MD5\" } # KERB_ENCTYPE_DES_CBC_MD5 -> MD5\n            if ([int32]$V -band 0x00000004) { \"RC4-HMAC\" } # KERB_ENCTYPE_RC4_HMAC_MD5 -> RC4\n            if ([int32]$V -band 0x00000008) { \"AES128-CTS-HMAC-SHA1-96\" } # KERB_ENCTYPE_AES128_CTS_HMAC_SHA1_96 -> A128\n            if ([int32]$V -band 0x00000010) { \"AES256-CTS-HMAC-SHA1-96\" } # KERB_ENCTYPE_AES256_CTS_HMAC_SHA1_96 -> A256\n            if ([int32]$V -band 0x00000020) { \"FAST-supported\" } #\n            if ([int32]$V -band 0x00000040) { \"Compound-identity-supported\" } #\n            if ([int32]$V -band 0x00000080) { \"Claims-supported\" } #\n            if ([int32]$V -band 0x00000200) { \"Resource-SID-compression-disabled\" } #\n        }\n    )\n    $EncryptionTypes\n}"
  },
  {
    "path": "Public/ActiveDirectory/Get-ADTrustAttributes.ps1",
    "content": "﻿function Get-ADTrustAttributes {\n    <#\n    .SYNOPSIS\n    Retrieves and interprets Active Directory trust attributes based on the provided value.\n\n    .DESCRIPTION\n    This function retrieves and interprets Active Directory trust attributes based on the provided value. It decodes the binary value into human-readable trust attributes.\n\n    .PARAMETER Value\n    Specifies the integer value representing the trust attributes.\n\n    .EXAMPLE\n    Get-ADTrustAttributes -Value 1\n    Retrieves and interprets the trust attributes for the value 1.\n\n    .EXAMPLE\n    1, 2, 4 | Get-ADTrustAttributes\n    Retrieves and interprets the trust attributes for the values 1, 2, and 4.\n\n    .NOTES\n    This function provides a convenient way to decode Active Directory trust attributes.\n    #>\n    [cmdletbinding()]\n    Param(\n        [parameter(Mandatory = $false, ValueFromPipeline = $True)][int32]$Value\n    )\n    # https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/e9a2d23c-c31e-4a6f-88a0-6646fdb51a3c\n    [String[]]$TrustAttributes = @(\n        Foreach ($V in $Value) {\n            if ([int32]$V -band 0x00000001) { \"Non Transitive\" } # TRUST_ATTRIBUTE_NON_TRANSITIVE\n            if ([int32]$V -band 0x00000002) { \"UpLevel Only\" } # TRUST_ATTRIBUTE_UPLEVEL_ONLY\n            if ([int32]$V -band 0x00000004) { \"Quarantined Domain\" } # TRUST_ATTRIBUTE_QUARANTINED_DOMAIN\n            if ([int32]$V -band 0x00000008) { \"Forest Transitive\" } # TRUST_ATTRIBUTE_FOREST_TRANSITIVE\n            if ([int32]$V -band 0x00000010) { \"Cross Organization\" } #TRUST_ATTRIBUTE_CROSS_ORGANIZATION\n            if ([int32]$V -band 0x00000020) { \"Within Forest\" } # TRUST_ATTRIBUTE_WITHIN_FOREST\n            if ([int32]$V -band 0x00000040) { \"Treat as External\" } # TRUST_ATTRIBUTE_TREAT_AS_EXTERNAL\n            if ([int32]$V -band 0x00000080) { \"Uses RC4 Encryption\" } # TRUST_ATTRIBUTE_USES_RC4_ENCRYPTION\n            if ([int32]$V -band 0x00000200) { \"No TGT DELEGATION\" } # TRUST_ATTRIBUTE_CROSS_ORGANIZATION_NO_TGT_DELEGATION\n            if ([int32]$V -band 0x00000800) { \"Enable TGT DELEGATION\" } #TRUST_ATTRIBUTE_CROSS_ORGANIZATION_ENABLE_TGT_DELEGATION\n            if ([int32]$V -band 0x00000400) { \"PIM Trust\" } #TRUST_ATTRIBUTE_PIM_TRUST\n        }\n    )\n    return $TrustAttributes\n}"
  },
  {
    "path": "Public/ActiveDirectory/Get-WinADDSAGuid.ps1",
    "content": "﻿function Get-WinADDSAGuid {\n    <#\n    .SYNOPSIS\n    Get DSA GUIDs from a forest for all domain controllers\n\n    .DESCRIPTION\n    This function retrieves DSA GUIDs from a forest for all domain controllers\n\n    .PARAMETER Forest\n    Target different Forest, by default current forest is used\n\n    .PARAMETER ExcludeDomains\n    Exclude domain from search, by default whole forest is scanned\n\n    .PARAMETER IncludeDomains\n    Include only specific domains, by default whole forest is scanned\n\n    .PARAMETER ExcludeDomainControllers\n    Exclude specific domain controllers, by default there are no exclusions, as long as VerifyDomainControllers switch is enabled. Otherwise this parameter is ignored.\n\n    .PARAMETER IncludeDomainControllers\n    Include only specific domain controllers, by default all domain controllers are included, as long as VerifyDomainControllers switch is enabled. Otherwise this parameter is ignored.\n\n    .PARAMETER SkipRODC\n    Skip Read-Only Domain Controllers. By default all domain controllers are included.\n\n    .PARAMETER ExtendedForestInformation\n    Ability to provide Forest Information from another command to speed up processing\n\n    .PARAMETER Credential\n    Alternate credentials passed through to Get-WinADForestDetails.\n\n    .EXAMPLE\n    Get-WinADDSAGuid | Format-Table\n\n    .NOTES\n    General notes\n    #>\n    [CmdletBinding()]\n    param(\n        [alias('ForestName')][string] $Forest,\n        [string[]] $ExcludeDomains,\n        [string[]] $ExcludeDomainControllers,\n        [alias('Domain', 'Domains')][string[]] $IncludeDomains,\n        [alias('DomainControllers', 'ComputerName')][string[]] $IncludeDomainControllers,\n        [switch] $SkipRODC,\n        [System.Collections.IDictionary] $ExtendedForestInformation,\n        [pscredential] $Credential\n    )\n    $Forest = Get-WinADForestDetails -Forest $Forest -ExtendedForestInformation $ExtendedForestInformation -ExcludeDomains $ExcludeDomains -ExcludeDomainControllers $ExcludeDomainControllers -IncludeDomains $IncludeDomains -IncludeDomainControllers $IncludeDomainControllers -SkipRODC:$SkipRODC -Credential $Credential\n    $ListDSA = [ordered]@{}\n    foreach ($DC in $Forest.ForestDomainControllers) {\n        $ListDSA[$DC.DsaGuid] = [PSCustomObject] @{\n            Domain      = $DC.Domain\n            HostName    = $DC.HostName\n            DsaGuid     = $DC.DsaGuid\n            DsaGuidName = $DC.DsaGuidName\n        }\n    }\n    if ($Hashtable) {\n        $ListDSA\n    } else {\n        $ListDSA.Values | ForEach-Object { $_ }\n    }\n}\n"
  },
  {
    "path": "Public/ActiveDirectory/Get-WinADForestControllers.ps1",
    "content": "function Get-WinADForestControllers {\n    <#\n    .SYNOPSIS\n    Retrieves information about domain controllers in the specified domain(s).\n\n    .DESCRIPTION\n    This function retrieves detailed information about domain controllers in the specified domain(s), including hostname, IP addresses, roles, and other relevant details.\n\n    .PARAMETER TestAvailability\n    Specifies whether to test the availability of domain controllers.\n\n    .EXAMPLE\n    Get-WinADForestControllers -TestAvailability\n    Tests the availability of domain controllers in the forest.\n\n    .EXAMPLE\n    Get-WinADDomainControllers\n    Retrieves information about all domain controllers in the forest.\n\n    .EXAMPLE\n    Get-WinADDomainControllers -Credential $Credential\n    Retrieves information about all domain controllers in the forest using specified credentials.\n\n    .PARAMETER Credential\n    Alternate credentials for forest and domain controller discovery.\n\n    .EXAMPLE\n    Get-WinADDomainControllers | Format-Table *\n    Displays detailed information about all domain controllers in a tabular format.\n\n    Output:\n    Domain        HostName          Forest        IPV4Address     IsGlobalCatalog IsReadOnly SchemaMaster DomainNamingMasterMaster PDCEmulator RIDMaster InfrastructureMaster Comment\n    ------        --------          ------        -----------     --------------- ---------- ------------ ------------------------ ----------- --------- -------------------- -------\n    ad.evotec.xyz AD1.ad.evotec.xyz ad.evotec.xyz 192.168.240.189            True      False         True                     True        True      True                 True\n    ad.evotec.xyz AD2.ad.evotec.xyz ad.evotec.xyz 192.168.240.192            True      False        False                    False       False     False                False\n    ad.evotec.pl                    ad.evotec.xyz                                                   False                    False       False     False                False Unable to contact the server. This may be becau...\n\n    .NOTES\n    This function provides essential information about domain controllers in the forest.\n    #>\n    [alias('Get-WinADDomainControllers')]\n    [CmdletBinding()]\n    param(\n        [string[]] $Domain,\n        [switch] $TestAvailability,\n        [switch] $SkipEmpty,\n        [pscredential] $Credential\n    )\n    $credentialSplat = @{}\n    if ($PSBoundParameters.ContainsKey('Credential')) {\n        $credentialSplat['Credential'] = $Credential\n    }\n    try {\n        $Forest = Get-ADForest @credentialSplat\n        if (-not $Domain) {\n            $Domain = $Forest.Domains\n        }\n    } catch {\n        $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n        Write-Warning \"Get-WinADForestControllers - Couldn't use Get-ADForest feature. Error: $ErrorMessage\"\n        return\n    }\n    $Servers = foreach ($D in $Domain) {\n        try {\n            $LocalServer = Get-ADDomainController -Discover -DomainName $D -ErrorAction Stop -Writable @credentialSplat\n            $DC = Get-ADDomainController -Server $LocalServer.HostName[0] -Filter * -ErrorAction Stop @credentialSplat\n            foreach ($S in $DC) {\n                $Server = [ordered] @{\n                    Domain               = $D\n                    HostName             = $S.HostName\n                    Name                 = $S.Name\n                    Forest               = $Forest.RootDomain\n                    IPV4Address          = $S.IPV4Address\n                    IPV6Address          = $S.IPV6Address\n                    IsGlobalCatalog      = $S.IsGlobalCatalog\n                    IsReadOnly           = $S.IsReadOnly\n                    Site                 = $S.Site\n                    SchemaMaster         = ($S.OperationMasterRoles -contains 'SchemaMaster')\n                    DomainNamingMaster   = ($S.OperationMasterRoles -contains 'DomainNamingMaster')\n                    PDCEmulator          = ($S.OperationMasterRoles -contains 'PDCEmulator')\n                    RIDMaster            = ($S.OperationMasterRoles -contains 'RIDMaster')\n                    InfrastructureMaster = ($S.OperationMasterRoles -contains 'InfrastructureMaster')\n                    LdapPort             = $S.LdapPort\n                    SslPort              = $S.SslPort\n                    Pingable             = $null\n                    Comment              = ''\n                }\n                if ($TestAvailability) {\n                    $Server['Pingable'] = foreach ($_ in $Server.IPV4Address) {\n                        Test-Connection -Count 1 -Server $_ -Quiet -ErrorAction SilentlyContinue\n                    }\n                }\n                [PSCustomObject] $Server\n            }\n        } catch {\n            [PSCustomObject]@{\n                Domain                   = $D\n                HostName                 = ''\n                Name                     = ''\n                Forest                   = $Forest.RootDomain\n                IPV4Address              = ''\n                IPV6Address              = ''\n                IsGlobalCatalog          = ''\n                IsReadOnly               = ''\n                Site                     = ''\n                SchemaMaster             = $false\n                DomainNamingMasterMaster = $false\n                PDCEmulator              = $false\n                RIDMaster                = $false\n                InfrastructureMaster     = $false\n                LdapPort                 = ''\n                SslPort                  = ''\n                Pingable                 = $null\n                Comment                  = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n            }\n        }\n    }\n    if ($SkipEmpty) {\n        return $Servers | Where-Object { $_.HostName -ne '' }\n    }\n    return $Servers\n}\n"
  },
  {
    "path": "Public/ActiveDirectory/Get-WinADForestDetails.ps1",
    "content": "﻿function Get-WinADForestDetails {\n    <#\n    .SYNOPSIS\n    Get details about Active Directory Forest, Domains and Domain Controllers in a single query\n\n    .DESCRIPTION\n    Get details about Active Directory Forest, Domains and Domain Controllers in a single query\n\n    .PARAMETER Forest\n    Target different Forest, by default current forest is used\n\n    .PARAMETER ExcludeDomains\n    Exclude domain from search, by default whole forest is scanned\n\n    .PARAMETER IncludeDomains\n    Include only specific domains, by default whole forest is scanned\n\n    .PARAMETER ExcludeDomainControllers\n    Exclude specific domain controllers, by default there are no exclusions, as long as VerifyDomainControllers switch is enabled. Otherwise this parameter is ignored.\n\n    .PARAMETER IncludeDomainControllers\n    Include only specific domain controllers, by default all domain controllers are included, as long as VerifyDomainControllers switch is enabled. Otherwise this parameter is ignored.\n\n    .PARAMETER SkipRODC\n    Skip Read-Only Domain Controllers. By default all domain controllers are included.\n\n    .PARAMETER ExtendedForestInformation\n    Ability to provide Forest Information from another command to speed up processing\n\n    .PARAMETER Filter\n    Filter for Get-ADDomainController\n\n    .PARAMETER TestAvailability\n    Check if Domain Controllers are available\n\n    .PARAMETER Test\n    Pick what to check for availability. Options are: All, Ping, WinRM, PortOpen, Ping+WinRM, Ping+PortOpen, WinRM+PortOpen. Default is All\n\n    .PARAMETER Ports\n    Ports to check for availability. Default is 135\n\n    .PARAMETER PortsTimeout\n    Ports timeout for availability check. Default is 100\n\n    .PARAMETER PingCount\n    How many pings to send. Default is 1\n\n    .PARAMETER PreferWritable\n    Prefer writable domain controllers over read-only ones when returning Query Servers\n\n    .PARAMETER Credential\n    Alternate credentials to use for all Active Directory queries\n\n    .PARAMETER Extended\n    Return extended information about domains with NETBIOS names\n\n    .EXAMPLE\n    Get-WinADForestDetails | Format-Table\n\n    .EXAMPLE\n    Get-WinADForestDetails -Forest 'ad.evotec.xyz' | Format-Table\n\n    .NOTES\n    General notes\n    #>\n    [CmdletBinding()]\n    param(\n        [alias('ForestName')][string] $Forest,\n        [string[]] $ExcludeDomains,\n        [string[]] $ExcludeDomainControllers,\n        [alias('Domain', 'Domains')][string[]] $IncludeDomains,\n        [alias('DomainControllers', 'ComputerName')][string[]] $IncludeDomainControllers,\n        [switch] $SkipRODC,\n        [string] $Filter = '*',\n        [switch] $TestAvailability,\n        [ValidateSet('All', 'Ping', 'WinRM', 'PortOpen', 'Ping+WinRM', 'Ping+PortOpen', 'WinRM+PortOpen')] $Test = 'All',\n        [int[]] $Ports = 135,\n        [int] $PortsTimeout = 100,\n        [int] $PingCount = 1,\n        [switch] $PreferWritable,\n        [System.Management.Automation.PSCredential] $Credential,\n        [switch] $Extended,\n        [System.Collections.IDictionary] $ExtendedForestInformation\n    )\n    $credentialSplat = @{}\n    if ($PSBoundParameters.ContainsKey('Credential')) {\n        $credentialSplat['Credential'] = $Credential\n    }\n\n    if ($Global:ProgressPreference -ne 'SilentlyContinue') {\n        $TemporaryProgress = $Global:ProgressPreference\n        $Global:ProgressPreference = 'SilentlyContinue'\n    }\n\n    if (-not $ExtendedForestInformation) {\n        # standard situation, building data from AD\n        $Findings = [ordered] @{ }\n        try {\n            if ($Forest) {\n                $ForestInformation = Get-ADForest -ErrorAction Stop -Identity $Forest @credentialSplat\n            } else {\n                $ForestInformation = Get-ADForest -ErrorAction Stop @credentialSplat\n            }\n            <#\n            $ForestInformation = [ordered] @{\n                ApplicationPartitions = $ForestInf.ApplicationPartitions | ForEach-Object -Process { $_ } # : {DC=DomainDnsZones,DC=ad,DC=evotec,DC=xyz, DC=DomainDnsZones,DC=ad,DC=evotec,DC=pl, DC=ForestDnsZones,DC=ad,DC=evotec,DC=xyz}\n                CrossForestReferences = $ForestInf.CrossForestReferences | ForEach-Object -Process { $_ } # : {}\n                DomainNamingMaster    = $ForestInf.DomainNamingMaster    # : AD1.ad.evotec.xyz\n                Domains               = $ForestInf.Domains | ForEach-Object -Process { $_ }              # : {ad.evotec.xyz, ad.evotec.pl}\n                ForestMode            = $ForestInf.ForestMode            # : Windows2012R2Forest\n                GlobalCatalogs        = $ForestInf.GlobalCatalogs | ForEach-Object -Process { $_ }        # : {AD1.ad.evotec.xyz, AD2.ad.evotec.xyz, ADRODC.ad.evotec.pl, AD3.ad.evotec.xyz...}\n                Name                  = $ForestInf.Name                  # : ad.evotec.xyz\n                PartitionsContainer   = $ForestInf.PartitionsContainer   # : CN=Partitions,CN=Configuration,DC=ad,DC=evotec,DC=xyz\n                RootDomain            = $ForestInf.RootDomain            # : ad.evotec.xyz\n                SchemaMaster          = $ForestInf.SchemaMaster          # : AD1.ad.evotec.xyz\n                Sites                 = $ForestInf.Sites | ForEach-Object -Process { $_ }                # : {KATOWICE-1, KATOWICE-2}\n                SPNSuffixes           = $ForestInf.SPNSuffixes | ForEach-Object -Process { $_ }         # : {}\n                UPNSuffixes           = $ForestInf.UPNSuffixes | ForEach-Object -Process { $_ }          # : {myneva.eu, single.evotec.xyz, newUPN@com, evotec.xyz...}\n            }\n            #>\n        } catch {\n            Write-Warning \"Get-WinADForestDetails - Error discovering DC for Forest - $($_.Exception.Message)\"\n            return\n        }\n        if (-not $ForestInformation) {\n            return\n        }\n        $Findings['Forest'] = $ForestInformation\n        $Findings['ForestDomainControllers'] = @()\n        $Findings['QueryServers'] = @{ }\n        $Findings['DomainDomainControllers'] = @{ }\n        [Array] $Findings['Domains'] = foreach ($Domain in $ForestInformation.Domains) {\n            if ($IncludeDomains) {\n                if ($Domain -in $IncludeDomains) {\n                    $Domain.ToLower()\n                }\n                # We skip checking for exclusions\n                continue\n            }\n            if ($Domain -notin $ExcludeDomains) {\n                $Domain.ToLower()\n            }\n        }\n        # We want to have QueryServers always available for all domains\n        [Array] $DomainsActive = foreach ($Domain in $Findings['Forest'].Domains) {\n            try {\n                $DC = Get-ADDomainController -DomainName $Domain -Discover -ErrorAction Stop -Writable:$PreferWritable.IsPresent @credentialSplat\n\n                $OrderedDC = [ordered] @{\n                    Domain      = $DC.Domain\n                    Forest      = $DC.Forest\n                    HostName    = [Array] $DC.HostName\n                    IPv4Address = $DC.IPv4Address\n                    IPv6Address = $DC.IPv6Address\n                    Name        = $DC.Name\n                    Site        = $DC.Site\n                }\n\n            } catch {\n                Write-Warning \"Get-WinADForestDetails - Error discovering DC for domain $Domain - $($_.Exception.Message)\"\n                continue\n            }\n            if ($Domain -eq $Findings['Forest']['Name']) {\n                $Findings['QueryServers']['Forest'] = $OrderedDC\n            }\n            $Findings['QueryServers'][\"$Domain\"] = $OrderedDC\n            # lets return domain as something that wroks\n            $Domain\n        }\n\n        # we need to make sure to remove domains that don't have DCs for some reason\n        [Array] $Findings['Domains'] = foreach ($Domain in $Findings['Domains']) {\n            if ($Domain -notin $DomainsActive) {\n                Write-Warning \"Get-WinADForestDetails - Domain $Domain doesn't seem to be active (no DCs). Skipping.\"\n                continue\n            }\n            $Domain\n        }\n\n        [Array] $Findings['ForestDomainControllers'] = foreach ($Domain in $Findings.Domains) {\n            $QueryServer = $Findings['QueryServers'][$Domain]['HostName'][0]\n\n            [Array] $AllDC = try {\n                try {\n                    $DomainControllers = Get-ADDomainController -Filter $Filter -Server $QueryServer -ErrorAction Stop @credentialSplat\n                } catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] {\n                    # Some environments (e.g. with WAN optimizers registered) can break -Filter *; fall back to known replica list\n                    try {\n                        $DomainControllers = (Get-ADDomain -Identity $Domain -Server $QueryServer @credentialSplat).ReplicaDirectoryServers | ForEach-Object {\n                            try {\n                                Get-ADDomainController -Identity $_ -Server $QueryServer -ErrorAction Stop @credentialSplat\n                            } catch {\n                                Write-Warning \"Get-WinADForestDetails - Error listing DC $_ for domain $Domain during fallback - $($_.Exception.Message)\"\n                                $null\n                            }\n                        }\n                        $DomainControllers = $DomainControllers | Where-Object { $_ }\n                    } catch {\n                        Write-Warning \"Get-WinADForestDetails - Error listing DCs for domain $Domain using fallback - $($_.Exception.Message)\"\n                        continue\n                    }\n                } catch {\n                    Write-Warning \"Get-WinADForestDetails - Error listing DCs for domain $Domain - $($_.Exception.Message)\"\n                    continue\n                }\n                foreach ($S in $DomainControllers) {\n                    if ($IncludeDomainControllers.Count -gt 0) {\n                        if (-not $IncludeDomainControllers[0].Contains('.')) {\n                            if ($S.Name -notin $IncludeDomainControllers) {\n                                continue\n                            }\n                        } else {\n                            if ($S.HostName -notin $IncludeDomainControllers) {\n                                continue\n                            }\n                        }\n                    }\n                    if ($ExcludeDomainControllers.Count -gt 0) {\n                        if (-not $ExcludeDomainControllers[0].Contains('.')) {\n                            if ($S.Name -in $ExcludeDomainControllers) {\n                                continue\n                            }\n                        } else {\n                            if ($S.HostName -in $ExcludeDomainControllers) {\n                                continue\n                            }\n                        }\n                    }\n                    # We need to get DSA GUID from NTDSSettingsObjectDN\n                    # this is useful for some other operations such as repadmin\n                    $DSAGuid = (Get-ADObject -Identity $S.NTDSSettingsObjectDN -Server $QueryServer @credentialSplat).ObjectGUID\n                    $Server = [ordered] @{\n                        Domain                 = $Domain\n                        HostName               = $S.HostName\n                        Name                   = $S.Name\n                        Forest                 = $ForestInformation.RootDomain\n                        Site                   = $S.Site\n                        IPV4Address            = $S.IPV4Address\n                        IPV6Address            = $S.IPV6Address\n                        IsGlobalCatalog        = $S.IsGlobalCatalog\n                        IsReadOnly             = $S.IsReadOnly\n                        IsSchemaMaster         = ($S.OperationMasterRoles -contains 'SchemaMaster')\n                        IsDomainNamingMaster   = ($S.OperationMasterRoles -contains 'DomainNamingMaster')\n                        IsPDC                  = ($S.OperationMasterRoles -contains 'PDCEmulator')\n                        IsRIDMaster            = ($S.OperationMasterRoles -contains 'RIDMaster')\n                        IsInfrastructureMaster = ($S.OperationMasterRoles -contains 'InfrastructureMaster')\n                        OperatingSystem        = $S.OperatingSystem\n                        OperatingSystemVersion = $S.OperatingSystemVersion\n                        OperatingSystemLong    = ConvertTo-OperatingSystem -OperatingSystem $S.OperatingSystem -OperatingSystemVersion $S.OperatingSystemVersion\n                        LdapPort               = $S.LdapPort\n                        SslPort                = $S.SslPort\n                        DistinguishedName      = $S.ComputerObjectDN\n                        NTDSSettingsObjectDN   = $S.NTDSSettingsObjectDN\n                        DsaGuid                = $DSAGuid\n                        DsaGuidName            = \"$DSAGuid._msdcs.$($ForestInformation.RootDomain)\"\n                        Pingable               = $null\n                        WinRM                  = $null\n                        PortOpen               = $null\n                        Comment                = ''\n                    }\n                    if ($TestAvailability) {\n                        if ($Test -eq 'All' -or $Test -like 'Ping*') {\n                            $Server.Pingable = Test-Connection -ComputerName $Server.IPV4Address -Quiet -Count $PingCount\n                        }\n                        if ($Test -eq 'All' -or $Test -like '*WinRM*') {\n                            $Server.WinRM = (Test-WinRM -ComputerName $Server.HostName).Status\n                        }\n                        if ($Test -eq 'All' -or '*PortOpen*') {\n                            $Server.PortOpen = (Test-ComputerPort -Server $Server.HostName -PortTCP $Ports -Timeout $PortsTimeout).Status\n                        }\n                    }\n                    [PSCustomObject] $Server\n                }\n            } catch {\n                [PSCustomObject]@{\n                    Domain                   = $Domain\n                    HostName                 = ''\n                    Name                     = ''\n                    Forest                   = $ForestInformation.RootDomain\n                    IPV4Address              = ''\n                    IPV6Address              = ''\n                    IsGlobalCatalog          = ''\n                    IsReadOnly               = ''\n                    Site                     = ''\n                    SchemaMaster             = $false\n                    DomainNamingMasterMaster = $false\n                    PDCEmulator              = $false\n                    RIDMaster                = $false\n                    InfrastructureMaster     = $false\n                    LdapPort                 = ''\n                    SslPort                  = ''\n                    DistinguishedName        = ''\n                    NTDSSettingsObjectDN     = ''\n                    DsaGuid                  = ''\n                    DsaGuidName              = ''\n                    Pingable                 = $null\n                    WinRM                    = $null\n                    PortOpen                 = $null\n                    Comment                  = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n                }\n            }\n            if ($SkipRODC) {\n                [Array] $Findings['DomainDomainControllers'][$Domain] = $AllDC | Where-Object { $_.IsReadOnly -eq $false }\n                #$Findings[$Domain] = $AllDC | Where-Object { $_.IsReadOnly -eq $false }\n            } else {\n                [Array] $Findings['DomainDomainControllers'][$Domain] = $AllDC\n                #$Findings[$Domain] = $AllDC\n            }\n            # Building all DCs for whole Forest\n            if ($null -ne $Findings['DomainDomainControllers'][$Domain]) {\n                [Array] $Findings['DomainDomainControllers'][$Domain]\n            }\n        }\n        if ($Extended) {\n            $Findings['DomainsExtended'] = @{ }\n            $Findings['DomainsExtendedNetBIOS'] = @{ }\n            foreach ($DomainEx in $Findings['Domains']) {\n                try {\n                    #$Findings['DomainsExtended'][$DomainEx] = Get-ADDomain -Server $Findings['QueryServers'][$DomainEx].HostName[0]\n\n                    $Findings['DomainsExtended'][$DomainEx] = Get-ADDomain -Server $Findings['QueryServers'][$DomainEx].HostName[0] @credentialSplat | ForEach-Object {\n                        # We need to use ForEach-Object to convert ADPropertyValueCollection to normal strings. Otherwise Copy-Dictionary fails\n                        #True     False    ADPropertyValueCollection                System.Collections.CollectionBase\n\n                        [ordered] @{\n                            AllowedDNSSuffixes                 = $_.AllowedDNSSuffixes | ForEach-Object -Process { $_ }                #: { }\n                            ChildDomains                       = $_.ChildDomains | ForEach-Object -Process { $_ }                      #: { }\n                            ComputersContainer                 = $_.ComputersContainer                 #: CN = Computers, DC = ad, DC = evotec, DC = xyz\n                            DeletedObjectsContainer            = $_.DeletedObjectsContainer            #: CN = Deleted Objects, DC = ad, DC = evotec, DC = xyz\n                            DistinguishedName                  = $_.DistinguishedName                  #: DC = ad, DC = evotec, DC = xyz\n                            DNSRoot                            = $_.DNSRoot                            #: ad.evotec.xyz\n                            DomainControllersContainer         = $_.DomainControllersContainer         #: OU = Domain Controllers, DC = ad, DC = evotec, DC = xyz\n                            DomainMode                         = $_.DomainMode                         #: Windows2012R2Domain\n                            DomainSID                          = $_.DomainSID.Value                        #: S - 1 - 5 - 21 - 853615985 - 2870445339 - 3163598659\n                            ForeignSecurityPrincipalsContainer = $_.ForeignSecurityPrincipalsContainer #: CN = ForeignSecurityPrincipals, DC = ad, DC = evotec, DC = xyz\n                            Forest                             = $_.Forest                             #: ad.evotec.xyz\n                            InfrastructureMaster               = $_.InfrastructureMaster               #: AD1.ad.evotec.xyz\n                            LastLogonReplicationInterval       = $_.LastLogonReplicationInterval       #:\n                            LinkedGroupPolicyObjects           = $_.LinkedGroupPolicyObjects | ForEach-Object -Process { $_ }           #:\n                            LostAndFoundContainer              = $_.LostAndFoundContainer              #: CN = LostAndFound, DC = ad, DC = evotec, DC = xyz\n                            ManagedBy                          = $_.ManagedBy                          #:\n                            Name                               = $_.Name                               #: ad\n                            NetBIOSName                        = $_.NetBIOSName                        #: EVOTEC\n                            ObjectClass                        = $_.ObjectClass                        #: domainDNS\n                            ObjectGUID                         = $_.ObjectGUID                         #: bc875580 - 4c70-41ad-a487-c57337e26024\n                            ParentDomain                       = $_.ParentDomain                       #:\n                            PDCEmulator                        = $_.PDCEmulator                        #: AD1.ad.evotec.xyz\n                            PublicKeyRequiredPasswordRolling   = $_.PublicKeyRequiredPasswordRolling | ForEach-Object -Process { $_ }   #:\n                            QuotasContainer                    = $_.QuotasContainer                    #: CN = NTDS Quotas, DC = ad, DC = evotec, DC = xyz\n                            ReadOnlyReplicaDirectoryServers    = $_.ReadOnlyReplicaDirectoryServers | ForEach-Object -Process { $_ }    #: { }\n                            ReplicaDirectoryServers            = $_.ReplicaDirectoryServers | ForEach-Object -Process { $_ }           #: { AD1.ad.evotec.xyz, AD2.ad.evotec.xyz, AD3.ad.evotec.xyz }\n                            RIDMaster                          = $_.RIDMaster                          #: AD1.ad.evotec.xyz\n                            SubordinateReferences              = $_.SubordinateReferences | ForEach-Object -Process { $_ }            #: { DC = ForestDnsZones, DC = ad, DC = evotec, DC = xyz, DC = DomainDnsZones, DC = ad, DC = evotec, DC = xyz, CN = Configuration, DC = ad, DC = evotec, DC = xyz }\n                            SystemsContainer                   = $_.SystemsContainer                   #: CN = System, DC = ad, DC = evotec, DC = xyz\n                            UsersContainer                     = $_.UsersContainer                     #: CN = Users, DC = ad, DC = evotec, DC = xyz\n                        }\n                    }\n\n                    $NetBios = $Findings['DomainsExtended'][$DomainEx]['NetBIOSName']\n                    $Findings['DomainsExtendedNetBIOS'][$NetBios] = $Findings['DomainsExtended'][$DomainEx]\n                } catch {\n                    Write-Warning \"Get-WinADForestDetails - Error gathering Domain Information for domain $DomainEx - $($_.Exception.Message)\"\n                    continue\n                }\n            }\n        }\n        # Bring back setting as per default\n        if ($TemporaryProgress) {\n            $Global:ProgressPreference = $TemporaryProgress\n        }\n\n        $Findings\n    } else {\n        # this takes care of limiting output to only what we requested, but based on prior input\n        # this makes sure we ask once for all AD stuff and then subsequent calls just filter out things\n        # this should be much faster then asking again and again for stuff from AD\n        $Findings = Copy-DictionaryManual -Dictionary $ExtendedForestInformation\n        [Array] $Findings['Domains'] = foreach ($_ in $Findings.Domains) {\n            if ($IncludeDomains) {\n                if ($_ -in $IncludeDomains) {\n                    $_.ToLower()\n                }\n                # We skip checking for exclusions\n                continue\n            }\n            if ($_ -notin $ExcludeDomains) {\n                $_.ToLower()\n            }\n        }\n        # Now that we have Domains we need to remove all DCs that are not from domains we excluded or included\n        foreach ($_ in [string[]] $Findings.DomainDomainControllers.Keys) {\n            if ($_ -notin $Findings.Domains) {\n                $Findings.DomainDomainControllers.Remove($_)\n            }\n        }\n        # Same as above but for query servers - we don't remove queried servers\n        #foreach ($_ in [string[]] $Findings.QueryServers.Keys) {\n        #    if ($_ -notin $Findings.Domains -and $_ -ne 'Forest') {\n        #        $Findings.QueryServers.Remove($_)\n        #    }\n        #}\n        # Now that we have Domains we need to remove all Domains that are excluded or included\n        foreach ($_ in [string[]] $Findings.DomainsExtended.Keys) {\n            if ($_ -notin $Findings.Domains) {\n                $Findings.DomainsExtended.Remove($_)\n                $NetBiosName = $Findings.DomainsExtended.$_.'NetBIOSName'\n                if ($NetBiosName) {\n                    $Findings.DomainsExtendedNetBIOS.Remove($NetBiosName)\n                }\n            }\n        }\n        [Array] $Findings['ForestDomainControllers'] = foreach ($Domain in $Findings.Domains) {\n            [Array] $AllDC = foreach ($S in $Findings.DomainDomainControllers[\"$Domain\"]) {\n                if ($IncludeDomainControllers.Count -gt 0) {\n                    if (-not $IncludeDomainControllers[0].Contains('.')) {\n                        if ($S.Name -notin $IncludeDomainControllers) {\n                            continue\n                        }\n                    } else {\n                        if ($S.HostName -notin $IncludeDomainControllers) {\n                            continue\n                        }\n                    }\n                }\n                if ($ExcludeDomainControllers.Count -gt 0) {\n                    if (-not $ExcludeDomainControllers[0].Contains('.')) {\n                        if ($S.Name -in $ExcludeDomainControllers) {\n                            continue\n                        }\n                    } else {\n                        if ($S.HostName -in $ExcludeDomainControllers) {\n                            continue\n                        }\n                    }\n                }\n                $S\n            }\n            if ($SkipRODC) {\n                [Array] $Findings['DomainDomainControllers'][$Domain] = $AllDC | Where-Object { $_.IsReadOnly -eq $false }\n            } else {\n                [Array] $Findings['DomainDomainControllers'][$Domain] = $AllDC\n            }\n            # Building all DCs for whole Forest\n            [Array] $Findings['DomainDomainControllers'][$Domain]\n        }\n        $Findings\n    }\n}\n"
  },
  {
    "path": "Public/ActiveDirectory/Get-WinADForestOptions.ps1",
    "content": "﻿Function Get-WinADForestOptions {\n    <#\n    .SYNOPSIS\n        This Cmdlet gets Active Directory Site Options.\n\n    .DESCRIPTION\n        This Cmdlet gets Active Directory Site Options.\n        We can fill out the rest of this comment-based help later.\n\n    .PARAMETER Domain\n        Target domain/forest to query. Defaults to current domain.\n\n    .PARAMETER Credential\n        Alternate credentials for RootDSE and site option queries.\n\n    .LINK\n        https://serverfault.com/questions/543143/detecting-ad-site-options-using-powershell\n\n    .NOTES\n        Written by Ryan Ries, October 2013. ryanries09@gmail.com.\n    #>\n    [CmdletBinding()]\n    Param(\n        [string] $Domain = $Env:USERDNSDOMAIN,\n        [pscredential] $Credential\n    )\n    $credentialSplat = @{}\n    if ($PSBoundParameters.ContainsKey('Credential')) {\n        $credentialSplat['Credential'] = $Credential\n    }\n    BEGIN {\n        # This enum comes from NtDsAPI.h in the Windows SDK.\n        # Also thanks to Jason Scott for pointing it out to me. http://serverfault.com/users/23067/jscott\n        Add-Type -TypeDefinition @\"\n                                   [System.Flags]\n                                   public enum nTDSSiteSettingsFlags {\n                                   NTDSSETTINGS_OPT_IS_AUTO_TOPOLOGY_DISABLED            = 0x00000001,\n                                   NTDSSETTINGS_OPT_IS_TOPL_CLEANUP_DISABLED             = 0x00000002,\n                                   NTDSSETTINGS_OPT_IS_TOPL_MIN_HOPS_DISABLED            = 0x00000004,\n                                   NTDSSETTINGS_OPT_IS_TOPL_DETECT_STALE_DISABLED        = 0x00000008,\n                                   NTDSSETTINGS_OPT_IS_INTER_SITE_AUTO_TOPOLOGY_DISABLED = 0x00000010,\n                                   NTDSSETTINGS_OPT_IS_GROUP_CACHING_ENABLED             = 0x00000020,\n                                   NTDSSETTINGS_OPT_FORCE_KCC_WHISTLER_BEHAVIOR          = 0x00000040,\n                                   NTDSSETTINGS_OPT_FORCE_KCC_W2K_ELECTION               = 0x00000080,\n                                   NTDSSETTINGS_OPT_IS_RAND_BH_SELECTION_DISABLED        = 0x00000100,\n                                   NTDSSETTINGS_OPT_IS_SCHEDULE_HASHING_ENABLED          = 0x00000200,\n                                   NTDSSETTINGS_OPT_IS_REDUNDANT_SERVER_TOPOLOGY_ENABLED = 0x00000400,\n                                   NTDSSETTINGS_OPT_W2K3_IGNORE_SCHEDULES                = 0x00000800,\n                                   NTDSSETTINGS_OPT_W2K3_BRIDGES_REQUIRED                = 0x00001000  }\n\"@\n\n        if ($Domain) {\n            $RootDSE = Get-ADRootDSE -Server $Domain @credentialSplat\n        } else {\n            $RootDSE = Get-ADRootDSE @credentialSplat\n        }\n        $DomainCN = ConvertFrom-DistinguishedName -DistinguishedName $RootDSE.defaultNamingContext -ToDomainCN\n        $QueryServer = (Get-ADDomainController -DomainName $DomainCN -Discover -ErrorAction Stop @credentialSplat).Hostname[0]\n\n        $Sites = Get-ADObject -Filter 'objectClass -eq \"site\"' -SearchBase ($RootDSE).ConfigurationNamingContext -Server $QueryServer @credentialSplat\n        ForEach ($Site In $Sites) {\n            $SiteSettings = Get-ADObject \"CN=NTDS Site Settings,$($Site.DistinguishedName)\" -Properties Options -Server $QueryServer @credentialSplat\n            If (!$SiteSettings.PSObject.Properties.Match('Options').Count -OR $SiteSettings.Options -EQ 0) {\n                # I went with '(none)' here to give it a more classic repadmin.exe feel.\n                # You could also go with $Null, or omit the property altogether for a more modern, Powershell feel.\n                [PSCustomObject]@{\n                    SiteName          = $Site.Name\n                    DistinguishedName = $Site.DistinguishedName\n                    SiteOptions       = '(none)'\n                }\n            } Else {\n                [PSCustomObject]@{\n                    SiteName          = $Site.Name\n                    DistinguishedName = $Site.DistinguishedName\n                    SiteOptions       = [Enum]::Parse('nTDSSiteSettingsFlags', $SiteSettings.Options)\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Public/Computers/Get-CimData.ps1",
    "content": "function Get-CimData {\n    <#\n    .SYNOPSIS\n    Helper function for retreiving CIM data from local and remote computers\n\n    .DESCRIPTION\n    Helper function for retreiving CIM data from local and remote computers\n\n    .PARAMETER ComputerName\n    Specifies computer on which you want to run the CIM operation. You can specify a fully qualified domain name (FQDN), a NetBIOS name, or an IP address. If you do not specify this parameter, the cmdlet performs the operation on the local computer using Component Object Model (COM).\n\n    .PARAMETER Protocol\n    Specifies the protocol to use. The acceptable values for this parametDer are: DCOM, Default, or Wsman.\n\n    .PARAMETER Class\n    Specifies the name of the CIM class for which to retrieve the CIM instances. You can use tab completion to browse the list of classes, because PowerShell gets a list of classes from the local WMI server to provide a list of class names.\n\n    .PARAMETER Properties\n    Specifies a set of instance properties to retrieve. Use this parameter when you need to reduce the size of the object returned, either in memory or over the network. The object returned also contains the key properties even if you have not listed them using the Property parameter. Other properties of the class are present but they are not populated.\n\n    .PARAMETER NameSpace\n    Specifies the namespace for the CIM operation. The default namespace is root\\cimv2. You can use tab completion to browse the list of namespaces, because PowerShell gets a list of namespaces from the local WMI server to provide a list of namespaces.\n\n    .PARAMETER Credential\n    Specifies a user account that has permission to perform this action. The default is the current user.\n\n    .EXAMPLE\n    Get-CimData -Class 'win32_bios' -ComputerName AD1,EVOWIN\n\n    .EXAMPLE\n    Get-CimData -Class 'win32_bios'\n\n    .EXAMPLE\n    Get-CimClass to get all classes\n\n    .NOTES\n    General notes\n    #>\n\n    [CmdletBinding()]\n    param(\n        [parameter(Mandatory)][string] $Class,\n        [string] $NameSpace = 'root\\cimv2',\n        [string[]] $ComputerName = $Env:COMPUTERNAME,\n        [ValidateSet('Default', 'Dcom', 'Wsman')][string] $Protocol = 'Default',\n        [pscredential] $Credential,\n        [string[]] $Properties = '*'\n    )\n    $ExcludeProperties = 'CimClass', 'CimInstanceProperties', 'CimSystemProperties', 'SystemCreationClassName', 'CreationClassName'\n\n    # Querying CIM locally usually doesn't work. This means if you're querying same computer you neeed to skip CimSession/ComputerName if it's local query\n    [Array] $ComputersSplit = Get-ComputerSplit -ComputerName $ComputerName\n\n    $CimObject = @(\n        # requires removal of this property for query\n        [string[]] $PropertiesOnly = $Properties | Where-Object { $_ -ne 'PSComputerName' }\n        # Process all remote computers\n        $Computers = $ComputersSplit[1]\n        if ($Computers.Count -gt 0) {\n            if ($Protocol -eq 'Default' -and $null -eq $Credential) {\n                Get-CimInstance -ClassName $Class -ComputerName $Computers -ErrorAction SilentlyContinue -Property $PropertiesOnly -Namespace $NameSpace -Verbose:$false -ErrorVariable ErrorsToProcess | Select-Object -Property $Properties -ExcludeProperty $ExcludeProperties\n            } else {\n                $Option = New-CimSessionOption -Protocol $Protocol\n                $newCimSessionSplat = @{\n                    ComputerName  = $Computers\n                    SessionOption = $Option\n                    ErrorAction   = 'SilentlyContinue'\n                }\n                if ($Credential) {\n                    $newCimSessionSplat['Credential'] = $Credential\n                }\n                $Session = New-CimSession @newCimSessionSplat -Verbose:$false\n                if ($Session) {\n                    Try {\n                        $Info = Get-CimInstance -ClassName $Class -CimSession $Session -ErrorAction Stop -Property $PropertiesOnly -Namespace $NameSpace -Verbose:$false -ErrorVariable ErrorsToProcess | Select-Object -Property $Properties -ExcludeProperty $ExcludeProperties\n                    } catch {\n                        Write-Warning -Message \"Get-CimData - No data for computer $($E.OriginInfo.PSComputerName). Failed with errror: $($E.Exception.Message)\"\n                    }\n                    try {\n                        $null = Remove-CimSession -CimSession $Session -ErrorAction SilentlyContinue\n                    } catch {\n                        Write-Warning -Message \"Get-CimData - Failed to remove CimSession $($Session). Failed with errror: $($E.Exception.Message)\"\n                    }\n                    $Info\n                } else {\n                    Write-Warning -Message \"Get-CimData - Failed to create CimSession for $($Computers). Problem with credentials?\"\n                }\n            }\n            foreach ($E in $ErrorsToProcess) {\n                Write-Warning -Message \"Get-CimData - No data for computer $($E.OriginInfo.PSComputerName). Failed with errror: $($E.Exception.Message)\"\n            }\n        } else {\n            # Process local computer\n            $Computers = $ComputersSplit[0]\n            if ($Computers.Count -gt 0) {\n                $Info = Get-CimInstance -ClassName $Class -ErrorAction SilentlyContinue -Property $PropertiesOnly -Namespace $NameSpace -Verbose:$false -ErrorVariable ErrorsLocal | Select-Object -Property $Properties -ExcludeProperty $ExcludeProperties\n                $Info | Add-Member -Name 'PSComputerName' -Value $Computers -MemberType NoteProperty -Force\n                $Info\n            }\n            foreach ($E in $ErrorsLocal) {\n                Write-Warning -Message \"Get-CimData - No data for computer $($Env:COMPUTERNAME). Failed with errror: $($E.Exception.Message)\"\n            }\n        }\n    )\n    $CimObject\n}"
  },
  {
    "path": "Public/Computers/Get-Computer.ps1",
    "content": "﻿function Get-Computer {\n    <#\n    .SYNOPSIS\n    Retrieves various information about a computer or server based on specified types.\n\n    .DESCRIPTION\n    This function retrieves information about a computer or server based on the specified types. It can gather details about applications, BIOS, CPU, RAM, Disk, Logical Disk, Network, Network Firewall, Operating System, Services, System, Startup, Time, and Windows Updates.\n\n    .PARAMETER ComputerName\n    Specifies the name of the computer or server to retrieve information from. Defaults to the local computer.\n\n    .PARAMETER Type\n    Specifies the types of information to retrieve. Valid values include 'Application', 'BIOS', 'CPU', 'RAM', 'Disk', 'DiskLogical', 'Network', 'NetworkFirewall', 'OperatingSystem', 'Services', 'System', 'Startup', 'Time', and 'WindowsUpdates'. If not specified, retrieves all available types.\n\n    .PARAMETER Credential\n    Alternate credentials passed to all underlying queries.\n\n    .PARAMETER AsHashtable\n    Indicates whether to return the output as a hashtable.\n\n    .EXAMPLE\n    Get-Computer -ComputerName \"Server01\" -Type \"CPU\", \"RAM\"\n    Retrieves CPU and RAM information from a remote server named Server01.\n\n    .EXAMPLE\n    Get-Computer -ComputerName \"Workstation01\" -Type \"Application\" -AsHashtable\n    Retrieves application information from a workstation named Workstation01 and returns the output as a hashtable.\n\n    #>\n    [cmdletBinding()]\n    param(\n        [string[]] $ComputerName = $Env:COMPUTERNAME,\n        [ValidateSet('Application',\n            'BIOS', 'CPU', 'RAM', 'Disk', 'DiskLogical',\n            'Network', 'NetworkFirewall',\n            'OperatingSystem', 'Services', 'System', 'Startup', 'Time', 'WindowsUpdates'\n        )][string[]] $Type,\n        [pscredential] $Credential,\n        [switch] $AsHashtable\n    )\n    Begin {\n\n    }\n    Process {\n        foreach ($Computer in $ComputerName) {\n            $OutputObject = [ordered] @{}\n            if ($Type -contains 'Application' -or $null -eq $Type) {\n                Write-Verbose \"Get-Computer - Processing Application for $Computer\"\n                $Application = Get-ComputerApplication -ComputerName $Computer -Credential $Credential\n                $OutputObject['Application'] = $Application\n            }\n            if ($Type -contains 'BIOS' -or $null -eq $Type) {\n                Write-Verbose \"Get-Computer - Processing BIOS for $Computer\"\n                $BIOS = Get-ComputerBios -ComputerName $Computer -Credential $Credential\n                $OutputObject['BIOS'] = $BIOS\n            }\n            if ($Type -contains 'CPU' -or $null -eq $Type) {\n                Write-Verbose \"Get-Computer - Processing CPU for $Computer\"\n                $CPU = Get-ComputerCPU -ComputerName $Computer -Credential $Credential\n                $OutputObject['CPU'] = $CPU\n            }\n            if ($Type -contains 'RAM' -or $null -eq $Type) {\n                Write-Verbose \"Get-Computer - Processing RAM for $Computer\"\n                $RAM = Get-ComputerRAM -ComputerName $Computer -Credential $Credential\n                $OutputObject['RAM'] = $RAM\n            }\n            if ($Type -contains 'Disk' -or $null -eq $Type) {\n                Write-Verbose \"Get-Computer - Processing Disk for $Computer\"\n                $Disk = Get-ComputerDisk -ComputerName $Computer -Credential $Credential\n                $OutputObject['Disk'] = $Disk\n            }\n            if ($Type -contains 'DiskLogical' -or $null -eq $Type) {\n                Write-Verbose \"Get-Computer - Processing DiskLogical for $Computer\"\n                $DiskLogical = Get-ComputerDiskLogical -ComputerName $Computer -Credential $Credential\n                $OutputObject['DiskLogical'] = $DiskLogical\n            }\n            if ($Type -contains 'OperatingSystem' -or $null -eq $Type) {\n                Write-Verbose \"Get-Computer - Processing OperatingSystem for $Computer\"\n                $OperatingSystem = Get-ComputerOperatingSystem -ComputerName $Computer -Credential $Credential\n                $OutputObject['OperatingSystem'] = $OperatingSystem\n            }\n            if ($Type -contains 'Network' -or $null -eq $Type) {\n                Write-Verbose \"Get-Computer - Processing Network for $Computer\"\n                $Network = Get-ComputerNetwork -ComputerName $Computer -Credential $Credential\n                $OutputObject['Network'] = $Network\n            }\n            if ($Type -contains 'NetworkFirewall' -or $null -eq $Type) {\n                Write-Verbose \"Get-Computer - Processing NetworkFirewall for $Computer\"\n                $NetworkFirewall = Get-ComputerNetwork -ComputerName $Computer -Credential $Credential -NetworkFirewallOnly\n                $OutputObject['NetworkFirewall'] = $NetworkFirewall\n            }\n            if ($Type -contains 'RDP' -or $null -eq $Type) {\n                Write-Verbose \"Get-Computer - Processing RDP for $Computer\"\n                $RDP = Get-ComputerRDP -ComputerName $Computer -Credential $Credential\n                $OutputObject['RDP'] = $RDP\n            }\n            if ($Type -contains 'Services' -or $null -eq $Type) {\n                Write-Verbose \"Get-Computer - Processing Services for $Computer\"\n                $Services = Get-ComputerService -ComputerName $Computer -Credential $Credential\n                $OutputObject['Services'] = $Services\n            }\n            if ($Type -contains 'System' -or $null -eq $Type) {\n                Write-Verbose \"Get-Computer - Processing System for $Computer\"\n                $System = Get-ComputerSystem -ComputerName $Computer -Credential $Credential\n                $OutputObject['System'] = $System\n            }\n            if ($Type -contains 'Startup' -or $null -eq $Type) {\n                Write-Verbose \"Get-Computer - Processing Startup for $Computer\"\n                $Startup = Get-ComputerStartup -ComputerName $Computer -Credential $Credential\n                $OutputObject['Startup'] = $Startup\n            }\n            if ($Type -contains 'Time' -or $null -eq $Type) {\n                Write-Verbose \"Get-Computer - Processing Time for $Computer\"\n                $Time = Get-ComputerTime -TimeTarget $Computer -Credential $Credential\n                $OutputObject['Time'] = $Time\n            }\n            if ($Type -contains 'Tasks' -or $null -eq $Type) {\n                Write-Verbose \"Get-Computer - Processing Tasks for $Computer\"\n                $Tasks = Get-ComputerTask -ComputerName $Computer -Credential $Credential\n                $OutputObject['Tasks'] = $Tasks\n            }\n            if ($Type -contains 'WindowsUpdates' -or $null -eq $Type) {\n                Write-Verbose \"Get-Computer - Processing WindowsUpdates for $Computer\"\n                $WindowsUpdates = Get-ComputerWindowsUpdates -ComputerName $Computer -Credential $Credential\n                $OutputObject['WindowsUpdates'] = $WindowsUpdates\n            }\n            if ($AsHashtable) {\n                $OutputObject\n            } else {\n                [PSCustomObject] $OutputObject\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Public/Computers/Get-ComputerApplication.ps1",
    "content": "function Get-ComputerApplication {\n    <#\n    .SYNOPSIS\n    Get software installed on computer or server\n\n    .DESCRIPTION\n    Get software installed on computer or server\n\n    .PARAMETER ComputerName\n    Specifies computer on which you want to run the operation.\n\n    .PARAMETER Credential\n    Alternate credentials for remote Invoke-Command when collecting installed apps.\n\n    .EXAMPLE\n    Get-ComputerApplications -Verbose | Format-Table\n\n    .EXAMPLE\n    Get-ComputerApplications -Verbose -ComputerName AD1, AD2 | Format-Table\n\n    .NOTES\n    General notes\n    #>\n    [alias('Get-ComputerApplications')]\n    [CmdletBinding()]\n    param(\n        [string[]] $ComputerName = $Env:COMPUTERNAME,\n        [pscredential] $Credential\n    )\n    $ScriptBlock = {\n        $objapp1 = Get-ItemProperty HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*\n        $objapp2 = Get-ItemProperty HKLM:\\Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*\n\n        $app1 = $objapp1 | Select-Object Displayname, Displayversion , Publisher, Installdate, @{Expression = { 'x64' }; Label = 'WindowsType' }\n        $app2 = $objapp2 | Select-Object Displayname, Displayversion , Publisher, Installdate, @{Expression = { 'x86' }; Label = 'WindowsType' } | Where-Object { -NOT (([string]$_.displayname).contains('Security Update for Microsoft') -or ([string]$_.displayname).contains('Update for Microsoft')) }\n        $app = $app1 + $app2 #| Sort-Object -Unique\n        $app | Where-Object { $null -ne $_.Displayname } #| Sort-Object DisplayName\n    }\n    foreach ($Computer in $ComputerName) {\n        try {\n            $LocalComputerDNSName = [System.Net.Dns]::GetHostByName($Env:COMPUTERNAME).HostName\n        } catch {\n            $LocalComputerDNSName = $Computer\n        }\n\n        if ($Computer -eq $Env:COMPUTERNAME -or $Computer -eq $LocalComputerDNSName) {\n            $Parameters = @{\n                ScriptBlock = $ScriptBlock\n            }\n        } else {\n            $Parameters = @{\n                ComputerName = $Computer\n                ScriptBlock  = $ScriptBlock\n            }\n            if ($Credential) { $Parameters.Credential = $Credential }\n        }\n        try {\n            $Data = Invoke-Command @Parameters\n        } catch {\n            Write-Warning \"Get-ComputerApplication - No data for computer $Computer\"\n            continue\n        }\n        foreach ($Information in $Data) {\n            if ($Information.Installdate) {\n                try {\n                    $InstallDate = [datetime]::ParseExact($Information.Installdate, 'yyyyMMdd', $null)\n                } catch {\n                    Write-Verbose \"Get-ComputerApplication - InstallDate $($Information.Installdate) couldn't be converted.\"\n                    $InstallDate = $null\n                }\n            } else {\n                $InstallDate = $null\n            }\n            [PSCustomObject] @{\n                DisplayName  = $Information.DisplayName\n                Version      = $Information.DisplayVersion\n                Publisher    = $Information.Publisher\n                Installdate  = $InstallDate\n                Type         = $Information.WindowsType\n                ComputerName = $Computer\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Public/Computers/Get-ComputerBios.ps1",
    "content": "function Get-ComputerBios {\n    <#\n    .SYNOPSIS\n    Retrieves BIOS information from a remote or local computer.\n\n    .DESCRIPTION\n    This function retrieves BIOS information from a specified computer using CIM/WMI.\n\n    .PARAMETER ComputerName\n    Specifies the name of the computer to retrieve BIOS information from. Defaults to the local computer.\n\n    .PARAMETER Protocol\n    Specifies the protocol to use for communication. Valid values are 'Default', 'Dcom', or 'Wsman'. Default is 'Default'.\n\n    .PARAMETER Credential\n    Alternate credentials for CIM queries. Default is current user.\n\n    .PARAMETER All\n    Switch parameter to retrieve all available BIOS properties.\n\n    .EXAMPLE\n    Get-ComputerBios -ComputerName \"RemoteComputer\" -Protocol Wsman\n    Retrieves BIOS information from a remote computer using the Wsman protocol.\n\n    .EXAMPLE\n    Get-ComputerBios -All\n    Retrieves all available BIOS information from the local computer.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string] $ComputerName = $Env:COMPUTERNAME,\n        [ValidateSet('Default', 'Dcom', 'Wsman')][string] $Protocol = 'Default',\n        [pscredential] $Credential,\n        [switch] $All\n    )\n    [string] $Class = 'win32_bios'\n    if ($All) {\n        [string] $Properties = '*'\n    } else {\n        [string[]] $Properties = 'PSComputerName', 'Status', 'Version', 'PrimaryBIOS', 'Manufacturer', 'ReleaseDate', 'SerialNumber', 'SMBIOSBIOSVersion', 'SMBIOSMajorVersion', 'SMBIOSMinorVersion', 'SystemBiosMajorVersion', 'SystemBiosMinorVersion'\n\n    }\n    $Information = Get-CimData -ComputerName $ComputerName -Protocol $Protocol -Credential $Credential -Class $Class -Properties $Properties\n    if ($All) {\n        $Information\n    } else {\n        foreach ($Info in $Information) {\n            foreach ($Data in $Info) {\n                # # Remember to expand if changing properties above\n                [PSCustomObject] @{\n                    ComputerName = if ($Data.PSComputerName) { $Data.PSComputerName } else { $Env:COMPUTERNAME }\n                    Status       = $Data.Status\n                    Version      = $Data.Version\n                    VersionBIOS  = -join ($Data.SMBIOSMajorVersion, \".\", $Data.SMBIOSMinorVersion, \".\", $Data.SystemBiosMajorVersion, \".\", $Data.SystemBiosMinorVersion)\n                    PrimaryBIOS  = $Data.PrimaryBIOS\n                    Manufacturer = $Data.Manufacturer\n                    ReleaseDate  = $Data.ReleaseDate\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Public/Computers/Get-ComputerCPU.ps1",
    "content": "function Get-ComputerCPU {\n    <#\n    .SYNOPSIS\n    Retrieves CPU information from specified computers.\n\n    .DESCRIPTION\n    This function retrieves CPU information from the specified computers. It provides details such as Name, DeviceID, Caption, SystemName, CurrentClockSpeed, MaxClockSpeed, ProcessorID, ThreadCount, Architecture, Status, LoadPercentage, L3CacheSize, Manufacturer, NumberOfCores, NumberOfEnabledCore, and NumberOfLogicalProcessors.\n\n    .PARAMETER ComputerName\n    Specifies the names of the computers for which to retrieve CPU information.\n\n    .PARAMETER Protocol\n    Specifies the protocol to use for retrieving CPU information. Valid values are 'Default', 'Dcom', and 'Wsman'.\n\n    .PARAMETER Credential\n    Alternate credentials for CIM queries. Default is current user.\n\n    .PARAMETER All\n    Indicates whether to retrieve all available CPU information.\n\n    .EXAMPLE\n    Get-ComputerCPU -ComputerName Server01, Server02 -Protocol Wsman -All\n    Retrieves all available CPU information from remote computers Server01 and Server02 using Wsman protocol.\n\n    .EXAMPLE\n    Get-ComputerCPU -ComputerName \"Workstation01\" -Protocol Default\n    Retrieves CPU information from a single remote computer named Workstation01 using the default protocol.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string[]] $ComputerName = $Env:COMPUTERNAME,\n        [ValidateSet('Default', 'Dcom', 'Wsman')][string] $Protocol = 'Default',\n        [pscredential] $Credential,\n        [switch] $All\n    )\n    [string] $Class = 'win32_processor'\n    if ($All) {\n        [string] $Properties = '*'\n    } else {\n        [string[]] $Properties = 'PSComputerName', 'Name', 'DeviceID', 'Caption', 'SystemName', 'CurrentClockSpeed', 'MaxClockSpeed', 'ProcessorID', 'ThreadCount', 'Architecture', 'Status', 'LoadPercentage', 'L3CacheSize', 'Manufacturer', 'VirtualizationFirmwareEnabled', 'NumberOfCores', 'NumberOfEnabledCore', 'NumberOfLogicalProcessors'\n\n    }\n    $Information = Get-CimData -ComputerName $ComputerName -Protocol $Protocol -Credential $Credential -Class $Class -Properties $Properties\n    if ($All) {\n        $Information\n    } else {\n        foreach ($Info in $Information) {\n            foreach ($Data in $Info) {\n                # # Remember to expand if changing properties above\n                [PSCustomObject] @{\n                    ComputerName                  = if ($Data.PSComputerName) { $Data.PSComputerName } else { $Env:COMPUTERNAME }\n                    Name                          = $Data.Name\n                    DeviceID                      = $Data.DeviceID\n                    Caption                       = $Data.Caption\n                    CurrentClockSpeed             = $Data.CurrentClockSpeed\n                    MaxClockSpeed                 = $Data.MaxClockSpeed\n                    ProcessorID                   = $Data.ProcessorID\n                    ThreadCount                   = $Data.ThreadCount\n                    Architecture                  = $Data.Architecture\n                    Status                        = $Data.Status\n                    LoadPercentage                = $Data.LoadPercentage\n                    Manufacturer                  = $Data.Manufacturer\n                    #VirtualizationFirmwareEnabled = $Data.VirtualizationFirmwareEnabled\n                    NumberOfCores                 = $Data.NumberOfCores\n                    NumberOfEnabledCore           = $Data.NumberOfEnabledCore\n                    NumberOfLogicalProcessors     = $Data.NumberOfLogicalProcessors    \n                }\n            }\n        }\n    }\n}\n\n\n#get-counter -Counter '\\Processor(*)\\% Processor Time' -SampleInterval 1 -MaxSamples 3 | select -ExpandProperty countersamples | select -ExpandProperty cookedvalue | Measure-Object -Average | select -ExpandProperty Average\n"
  },
  {
    "path": "Public/Computers/Get-ComputerCulture.ps1",
    "content": "function Get-ComputerCulture {\n    <#\n    .SYNOPSIS\n    Retrieves culture information from a specified computer.\n\n    .DESCRIPTION\n    This function retrieves culture information from the specified computer. It provides details such as KeyboardLayoutId, DisplayName, and Windows Language.\n\n    .PARAMETER ComputerName\n    Specifies the name of the computer from which to retrieve culture information. Defaults to the local computer.\n\n    .PARAMETER Credential\n    Alternate credentials for remote Invoke-Command.\n\n    .EXAMPLE\n    Get-ComputerCulture\n    Retrieves culture information from the local computer.\n\n    .EXAMPLE\n    Get-ComputerCulture -ComputerName \"Server01\"\n    Retrieves culture information from a remote computer named Server01.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string] $ComputerName = $Env:COMPUTERNAME,\n        [pscredential] $Credential\n    )\n    $ScriptBlock = {\n        Get-Culture | Select-Object KeyboardLayoutId, DisplayName, @{Expression = { $_.ThreeLetterWindowsLanguageName }; Label = \"Windows Language\" }\n    }\n    if ($ComputerName -eq $Env:COMPUTERNAME) {\n        $Data8 = Invoke-Command -ScriptBlock $ScriptBlock\n    } else {\n        $invokeSplat = @{ ComputerName = $ComputerName; ScriptBlock = $ScriptBlock }\n        if ($Credential) { $invokeSplat.Credential = $Credential }\n        $Data8 = Invoke-Command @invokeSplat\n    }\n    return $Data8\n}\n"
  },
  {
    "path": "Public/Computers/Get-ComputerDevice.ps1",
    "content": "﻿function Get-ComputerDevice {\n    <#\n    .SYNOPSIS\n    Retrieves information about computer devices.\n\n    .DESCRIPTION\n    This function retrieves information about computer devices using WMI.\n\n    .PARAMETER ComputerName\n    Specifies the name of the computer to query. Defaults to the local computer.\n\n    .PARAMETER Protocol\n    Specifies the protocol to use for the query. Valid values are 'Default', 'Dcom', or 'Wsman'. Default is 'Default'.\n\n    .PARAMETER Credential\n    Alternate credentials for CIM queries. Default is current user.\n\n    .PARAMETER All\n    Retrieves all properties of the computer devices.\n\n    .PARAMETER Extended\n    Retrieves extended properties of the computer devices.\n\n    .EXAMPLE\n    Get-ComputerDevice -ComputerName \"Computer01\" -Protocol \"Wsman\" -All\n    Retrieves all properties of computer devices from a remote computer using Wsman protocol.\n\n    .EXAMPLE\n    Get-ComputerDevice -ComputerName \"Computer02\" -Extended\n    Retrieves extended properties of computer devices from a remote computer.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string] $ComputerName = $Env:COMPUTERNAME,\n        [ValidateSet('Default', 'Dcom', 'Wsman')][string] $Protocol = 'Default',\n        [pscredential] $Credential,\n        [switch] $All,\n        [switch] $Extended\n    )\n    [string] $Class = 'win32_pnpentity'\n    if ($All) {\n        [string] $Properties = '*'\n    } else {\n        [string[]] $Properties = @(\n            #'Caption'\n            #'Description'\n            #'InstallDate'\n            'PNPClass'\n            'Name'\n            'Status'\n            #'Availability'\n            'ConfigManagerErrorCode'\n            #'ConfigManagerUserConfig'\n            'DeviceID'\n            'ErrorCleared'\n            'ErrorDescription'\n            'LastErrorCode'\n            #'PNPDeviceID'\n            #'PowerManagementCapabilities'\n            #'PowerManagementSupported'\n            'StatusInfo'\n            #'SystemName'\n            'ClassGuid'\n            'CompatibleID'\n            'HardwareID'\n            'Manufacturer'\n\n            #'Present'\n            #'Service'\n            'PSComputerName'\n        )\n    }\n\n    $ConfigManagerErrorCode = @{\n        '0'  = \"This device is working properly.\"\n        '1'  = 'This device is not configured correctly.'\n        '2'  = 'Windows cannot load the driver for this device.'\n        '3'  = \"The driver for this device might be corrupted, or your system may be running low on memory or other resources.\"\n        '4'  = \"This device is not working properly. One of its drivers or your registry might be corrupted.\"\n        '5'  = \"The driver for this device needs a resource that Windows cannot manage.\"\n        '6'  = \"The boot configuration for this device conflicts with other devices.\"\n        '7'  = \"Cannot filter.\"\n        '8'  = \"The driver loader for the device is missing.\"\n        '9'  = \"This device is not working properly because the controlling firmware is reporting the resources for the device incorrectly.\"\n        '10' = \"This device cannot start.\"\n        '11' = \"This device failed.\"\n        '12' = \"This device cannot find enough free resources that it can use.\"\n        '13' = \"Windows cannot verify this device's resources.\"\n        '14' = \"This device cannot work properly until you restart your computer.\"\n        '15' = \"This device is not working properly because there is probably a re-enumeration problem.\"\n        '16' = \"Windows cannot identify all the resources this device uses.\"\n        '17' = \"This device is asking for an unknown resource type.\"\n        '18' = \"Reinstall the drivers for this device.\"\n        '19' = \"Failure using the VxD loader.\"\n        '20' = \"Your registry might be corrupted.\"\n        '21' = \"System failure: Try changing the driver for this device. If that does not work, see your hardware documentation. Windows is removing this device.\"\n        '22' = \"This device is disabled.\"\n        '23' = \"System failure: Try changing the driver for this device. If that doesn't work, see your hardware documentation.\"\n        '24' = \"This device is not present, is not working properly, or does not have all its drivers installed.\"\n        '25' = \"Windows is still setting up this device.\"\n        '26' = \"Windows is still setting up this device.\"\n        '27' = \"This device does not have valid log configuration.\"\n        '28' = \"The drivers for this device are not installed.\"\n        '29' = \"This device is disabled because the firmware of the device did not give it the required resources.\"\n        '30' = \"This device is using an Interrupt Request (IRQ) resource that another device is using.\"\n        '31' = \"This device is not working properly because Windows cannot load the drivers required for this device.\"\n    }\n    $Information = Get-CimData -ComputerName $ComputerName -Protocol $Protocol -Credential $Credential -Class $Class -Properties $Properties\n    if ($All) {\n        $Information\n    } else {\n        foreach ($Info in $Information) {\n            foreach ($Data in $Info) {\n                # # Remember to expand if changing properties above\n                $Device = [ordered]@{\n                    ComputerName  = if ($Data.PSComputerName) { $Data.PSComputerName } else { $Env:COMPUTERNAME }\n                    #'Caption'                     = $Data.Caption\n                    #'Description'                 = $Data.Description\n                    #'InstallDate'                 = $Data.InstallDate\n                    'DeviceClass' = $Data.PNPClass\n                    'Name'        = $Data.Name\n                    'Status'      = $Data.Status\n                    #'Availability'                = $Data.Availability\n                    'ErrorCode'   = $ConfigManagerErrorCode[\"$($Data.ConfigManagerErrorCode)\"]\n                    'DeviceID'    = $Data.DeviceID\n                }\n                if ($Extended) {\n                    $DeviceUpgrade = [ordered]@{\n                        #'ConfigManagerUserConfig'     = $Data.ConfigManagerUserConfig\n                        'ErrorCleared'     = $Data.ErrorCleared\n                        'ErrorDescription' = $Data.ErrorDescription\n                        'LastErrorCode'    = $Data.LastErrorCode\n                        #'PNPDeviceID'                 = $Data.PNPDeviceID\n                        #'PowerManagementCapabilities' = $Data.PowerManagementCapabilities\n                        #'PowerManagementSupported'    = $Data.PowerManagementSupported\n                        'StatusInfo'       = $Data.StatusInfo\n                        #'SystemName'                  = $Data.SystemName\n                        'ClassGuid'        = $Data.ClassGuid\n                        'CompatibleID'     = $Data.CompatibleID\n                        'HardwareID'       = $Data.HardwareID\n                        'Manufacturer'     = if ($Data.Manufacturer) { $Data.Manufacturer.Replace('(', '').Replace(')', '') } else { }\n                        #'Present'                     = $Data.Present\n                        #'Service'                     = $Data.Service\n                    }\n                    [PSCustomObject] ($Device + $DeviceUpgrade)\n                } else {\n                    [PSCustomObject] $Device\n                }\n            }\n        }\n    }\n}\n#Get-ComputerDevice | Format-Table *\n#Get-ComputerDevice -ComputerName AD1 -Extended | Format-Table *\n"
  },
  {
    "path": "Public/Computers/Get-ComputerDisk.ps1",
    "content": "function Get-ComputerDisk {\n    <#\n    .SYNOPSIS\n    Retrieves disk information from remote computers.\n\n    .DESCRIPTION\n    This function retrieves disk information from remote computers specified by the ComputerName parameter. It provides details such as Index, Model, Caption, SerialNumber, Description, MediaType, FirmwareRevision, Partitions, SizeGB, and PNPDeviceID.\n\n    .PARAMETER ComputerName\n    Specifies the names of the remote computers from which to retrieve disk information.\n\n    .PARAMETER Protocol\n    Specifies the protocol to be used for retrieving disk information. Valid values are 'Default', 'Dcom', and 'Wsman'.\n\n    .PARAMETER Credential\n    Alternate credentials for CIM queries. Default is current user.\n\n    .PARAMETER All\n    Indicates whether to retrieve all available disk information.\n\n    .EXAMPLE\n    Get-ComputerDisk -ComputerName AD1, AD2, EVO1, AD2019 | Format-Table -AutoSize *\n\n    Output:\n    WARNING: Get-ComputerSystem - No data for computer AD2019. Most likely an error on receiving side.\n\n    ComputerName Index Model                     Caption                   SerialNumber         Description MediaType             FirmwareRevision Partitions SizeGB PNPDeviceID\n    ------------ ----- -----                     -------                   ------------         ----------- ---------             ---------------- ---------- ------ -----------\n    AD1              0 Microsoft Virtual Disk    Microsoft Virtual Disk                         Disk drive  Fixed hard disk media 1.0                       3    127 SCSI\\DISK&VEN_MSFT&PROD_VIRTUAL_DISK\\000000\n    AD2              0 Microsoft Virtual Disk    Microsoft Virtual Disk                         Disk drive  Fixed hard disk media 1.0                       3    127 SCSI\\DISK&VEN_MSFT&PROD_VIRTUAL_DISK\\000000\n    EVO1             0 WDC WD30EFRX-68AX9N0      WDC WD30EFRX-68AX9N0      WD-WMC1T2351095      Disk drive  Fixed hard disk media 80.00A80                  1   2795 SCSI\\DISK&VEN_WDC&PROD_WD30EFRX-68AX9N0\\4&191557A4&0&000000\n    EVO1             2 Samsung SSD 950 PRO 512GB Samsung SSD 950 PRO 512GB 0025_3857_61B0_0EF2. Disk drive  Fixed hard disk media 2B0Q                      3    477 SCSI\\DISK&VEN_NVME&PROD_SAMSUNG_SSD_950\\5&35365596&0&000000\n    EVO1             1 Samsung SSD 860 EVO 500GB Samsung SSD 860 EVO 500GB S3Z2NB0K176976A      Disk drive  Fixed hard disk media RVT01B6Q                  1    466 SCSI\\DISK&VEN_SAMSUNG&PROD_SSD\\4&191557A4&0&000100\n\n    .NOTES\n    This function uses the Get-CimData cmdlet to retrieve disk information from remote computers.\n    #>\n    [CmdletBinding()]\n    param(\n        [string[]] $ComputerName = $Env:COMPUTERNAME,\n        [ValidateSet('Default', 'Dcom', 'Wsman')][string] $Protocol = 'Default',\n        [pscredential] $Credential,\n        [switch] $All\n    )\n    [string] $Class = 'win32_diskdrive'\n    if ($All) {\n        [string] $Properties = '*'\n    } else {\n        [string[]] $Properties = 'Index', 'Model', 'Caption', 'SerialNumber', 'Description', 'MediaType', 'FirmwareRevision', 'Partitions', 'Size', 'PNPDeviceID', 'PSComputerName'\n    }\n    $Information = Get-CimData -ComputerName $ComputerName -Protocol $Protocol -Credential $Credential -Class $Class -Properties $Properties\n    if ($All) {\n        $Information\n    } else {\n        foreach ($Info in $Information) {\n            foreach ($Data in $Info) {\n                # # Remember to expand if changing properties above\n                [PSCustomObject] @{\n                    ComputerName     = if ($Data.PSComputerName) { $Data.PSComputerName } else { $Env:COMPUTERNAME }\n                    Index            = $Data.Index\n                    Model            = $Data.Model\n                    Caption          = $Data.Caption\n                    SerialNumber     = if ($Data.SerialNumber) { $Data.SerialNumber.Trim() } else { '' }\n                    Description      = $Data.Description\n                    MediaType        = $Data.MediaType\n                    FirmwareRevision = $Data.FirmwareRevision\n                    Partitions       = $Data.Partitions\n                    SizeGB           = $Data.Size / 1Gb -as [int]\n                    PNPDeviceID      = $Data.PNPDeviceID\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Public/Computers/Get-ComputerDiskLogical.ps1",
    "content": "function Get-ComputerDiskLogical {\n    <#\n    .SYNOPSIS\n    Retrieves logical disk information for specified computers.\n\n    .DESCRIPTION\n    This function retrieves logical disk information for the specified computers. It provides details such as DeviceID, DriveType, ProviderName, FreeSpace, UsedSpace, TotalSpace, FreePercent, UsedPercent, and VolumeName.\n\n    .PARAMETER ComputerName\n    Specifies the names of the computers for which to retrieve disk information.\n\n    .PARAMETER Protocol\n    Specifies the protocol to use for retrieving disk information. Valid values are 'Default', 'Dcom', and 'Wsman'.\n\n    .PARAMETER Credential\n    Alternate credentials for CIM queries. Default is current user.\n\n    .PARAMETER RoundingPlace\n    Specifies the number of decimal places to round the disk space values to.\n\n    .PARAMETER OnlyLocalDisk\n    Indicates that only local disks should be included in the output.\n\n    .PARAMETER All\n    Indicates that information for all disks should be retrieved.\n\n    .EXAMPLE\n    Get-ComputerDiskLogical -ComputerName AD1, AD2, EVOWIN -OnlyLocalDisk | ft -AutoSize\n\n    Output:\n\n    ComputerName DeviceID DriveType  ProviderName FreeSpace UsedSpace TotalSpace FreePercent UsedPercent VolumeName\n    ------------ -------- ---------  ------------ --------- --------- ---------- ----------- ----------- ----------\n    AD2          C:       Local Disk                  96,96     29,49     126,45       76,68       23,32\n    AD1          C:       Local Disk                 103,17     23,28     126,45       81,59       18,41\n    EVOWIN       C:       Local Disk                 133,31    343,03     476,34       27,99       72,01\n    EVOWIN       D:       Local Disk                   2433     361,4    2794,39       87,07       12,93 Media\n    EVOWIN       E:       Local Disk                  66,05     399,7     465,75       14,18       85,82 Testing Environment\n\n    .NOTES\n    Additional notes about the function.\n    #>\n\n    [CmdletBinding()]\n    param(\n        [string[]] $ComputerName = $Env:COMPUTERNAME,\n        [ValidateSet('Default', 'Dcom', 'Wsman')][string] $Protocol = 'Default',\n        [pscredential] $Credential,\n        [string][ValidateSet('GB', 'TB', 'MB')] $Size = 'GB',\n        [int] $RoundingPlace = 2,\n        [int] $RoundingPlacePercent = 2,\n        [switch] $OnlyLocalDisk,\n        [switch] $All\n    )\n\n    if (-Not ('Pinvoke.Win32Utils' -as [type])) {\n        Add-Type -TypeDefinition @'\n        using System.Runtime.InteropServices;\n        using System.Text;\n        namespace pinvoke {\n            public static class Win32Utils {\n                [DllImport(\"kernel32.dll\", CharSet = CharSet.Auto, SetLastError = true)]\n                public static extern uint QueryDosDevice(string lpDeviceName, StringBuilder lpTargetPath, int ucchMax);\n            }\n        }\n'@\n    }\n\n    [string] $Class = 'win32_logicalDisk'\n    if ($All) {\n        [string] $Properties = '*'\n    } else {\n        [string[]] $Properties = 'DeviceID', 'DriveType', 'ProviderName', 'FreeSpace', 'Size', 'VolumeName', 'PSComputerName'\n    }\n\n    $DriveType = @{\n        '0' = 'Unknown'\n        '1' = 'No Root Directory'\n        '2' = 'Removable Disk'\n        '3' = 'Local Disk'\n        '4' = 'Network Drive'\n        '5' = 'Compact Disc'\n        '6' = 'RAM Disk'\n    }\n\n    $Divider = \"1$Size\"\n\n    $Information = Get-CimData -ComputerName $ComputerName -Protocol $Protocol -Credential $Credential -Class $Class -Properties $Properties\n    if ($All) {\n        $Information\n    } else {\n        $Output = foreach ($Info in $Information) {\n            foreach ($Data in $Info) {\n                if ($Info.ComputerName -eq $Env:COMPUTERNAME) {\n                    $DiskPartitionName = [System.Text.StringBuilder]::new(1024)\n                    if ($Data.DeviceID) {\n                        [void][PInvoke.Win32Utils]::QueryDosDevice(($Data.DeviceID), $DiskPartitionName, $DiskPartitionName.Capacity)\n                    }\n                    $DiskPartitionNumber = $DiskPartitionName.ToString()\n                } else {\n                    $DiskPartitionNumber = ''\n                }\n                # # Remember to expand if changing properties above\n                [PSCustomObject] @{\n                    ComputerName  = if ($Data.PSComputerName) { $Data.PSComputerName } else { $Env:COMPUTERNAME }\n                    DeviceID      = $Data.DeviceID\n                    DriveType     = $DriveType[\"$($Data.DriveType)\"]\n                    ProviderName  = $Data.ProviderName\n                    #SerialNumber     = if ($Data.SerialNumber) { $Data.SerialNumber.Trim() } else { '' }\n                    FreeSpace     = [Math]::Round($Data.FreeSpace / $Divider, $RoundingPlace)\n                    UsedSpace     = [Math]::Round(($Data.Size - $Data.FreeSpace) / $Divider, $RoundingPlace)\n                    TotalSpace    = [Math]::Round($Data.Size / $Divider, $RoundingPlace)\n\n                    FreePercent   = if ($Data.Size -gt 0 ) { [Math]::round(($Data.FreeSpace / $Data.Size) * 100, $RoundingPlacePercent) } else { '0' }\n                    UsedPercent   = if ($Data.Size -gt 0 ) { [Math]::round((($Data.Size - $Data.FreeSpace) / $Data.Size) * 100, $RoundingPlacePercent) } else { '0' }\n                    VolumeName    = $Data.VolumeName\n                    DiskPartition = $DiskPartitionNumber\n                    # Partitions       = $Data.Partitions\n                    # SizeGB           = $Data.Size / 1Gb -as [int]\n                    # PNPDeviceID      = $Data.PNPDeviceID\n                    # UsedSpace(in GB)    FreeSpace(in GB)    TotalSpace(in GB)\n                }\n\n            }\n        }\n        if ($OnlyLocalDisk) {\n            $Output | Where-Object { $_.DriveType -eq 'Local Disk' }\n        } else {\n            $Output\n        }\n    }\n}\n"
  },
  {
    "path": "Public/Computers/Get-ComputerFirewall.ps1",
    "content": "﻿function Get-ComputerFirewall {\n    <#\n    .SYNOPSIS\n    Short description\n\n    .DESCRIPTION\n    Long description\n\n    .EXAMPLE\n    $Data = Get-ComputerFirewall\n    $Data | Format-Table -AutoSize\n\n    .EXAMPLE\n    $Data = Get-ComputerFirewall\n    $Data | Out-HtmlView -ScrollX -Filtering -Title \"Firewall Rules\" -DataStore JavaScript\n\n    .NOTES\n    General notes\n    #>\n    [CmdletBinding()]\n    param(\n        [string] $ComputerName\n    )\n    ## Cache rules and ports for cross referencing\n\n    $CimData = [ordered] @{\n        CimSession    = $ComputerName\n        ErrorAction   = 'SilentlyContinue'\n        ErrorVariable = 'ErrorVar'\n    }\n    Remove-EmptyValue -Hashtable $CimData\n\n    if ($ComputerName) {\n        $ComputerNameDisplay = $ComputerName\n    } else {\n        $ComputerNameDisplay = 'Localhost'\n    }\n    Write-Verbose -Message \"Get-ComputerFirewall - Getting firewall rules ($ComputerNameDisplay)\"\n    $Allrules = Get-NetFirewallRule @CimData\n    if ($ErrorVar) {\n        Write-Warning -Message \"Get-ComputerFirewall - Error getting firewall rules. Try running as admin? $($ErrorVar)\"\n    }\n    Write-Verbose -Message \"Get-ComputerFirewall - Getting firewall filters ($ComputerNameDisplay)\"\n    $Allports = Get-NetFirewallPortFilter @CimData\n    if ($ErrorVar) {\n        Write-Warning -Message \"Get-ComputerFirewall - Error getting firewall ports. Try running as admin? $($ErrorVar)\"\n    }\n    Write-Verbose -Message \"Get-ComputerFirewall - Getting firewall filters ($ComputerNameDisplay)\"\n    $AllFilters = Get-NetFirewallApplicationFilter @CimData | Select-Object Program, AppPath, InstanceID, Description, Package\n    if ($ErrorVar) {\n        Write-Warning -Message \"Get-ComputerFirewall - Error getting firewall filters. Try running as admin? $($ErrorVar)\"\n    }\n\n    Write-Verbose -Message \"Get-ComputerFirewall - Matching rules, ports and filters\"\n    $FiltersCache = @{}\n    $RulesCache = @{}\n    $PortCache = @{}\n    foreach ($Rule in $Allrules) {\n        $RulesCache[$Rule.Name] = $Rule\n    }\n    foreach ($Port in $Allports) {\n        $PortCache[$Port.InstanceID] = $Port\n    }\n    foreach ($Filter in $AllFilters) {\n        $FiltersCache[$Filter.InstanceID] = $Filter\n    }\n\n    foreach ($Rule in $RulesCache.Values) {\n        [PSCustomObject]@{\n            Name                          = $Rule.Name                          # : NETDIS-UPnPHost-Out-TCP\n            ID                            = $Rule.ID                            # : NETDIS-UPnPHost-Out-TCP\n            DisplayName                   = $Rule.DisplayName                   # : Network Discovery (UPnP-Out)\n            Group                         = $Rule.Group                         # : @FirewallAPI.dll,-32752\n            Enabled                       = $Rule.Enabled                       # : False\n            Profile                       = $Rule.Profile                       # : Public\n            Platform                      = $Rule.Platform                      # : {}\n            Direction                     = $Rule.Direction                     # : Outbound\n            Action                        = $Rule.Action                        # : Allow\n            EdgeTraversalPolicy           = $Rule.EdgeTraversalPolicy           # : Block\n            LSM                           = $Rule.LSM                           # : False\n            PrimaryStatus                 = $Rule.PrimaryStatus                 # : OK\n            Status                        = $Rule.Status                        # : The rule was parsed successfully from the store. (65536)\n            EnforcementStatus             = $Rule.EnforcementStatus             # : NotApplicable\n            PolicyStoreSourceType         = $Rule.PolicyStoreSourceType         # : Local\n            Caption                       = $Rule.Caption                       # :\n            Description                   = $Rule.Description                   # : Outbound rule for Network Discovery to allow use of Universal Plug and Play. [TCP]\n            ElementName                   = $Rule.ElementName                   # : @FirewallAPI.dll,-32765\n            InstanceID                    = $Rule.InstanceID                    # : NETDIS-UPnPHost-Out-TCP\n            CommonName                    = $Rule.CommonName                    # :\n            PolicyKeywords                = $Rule.PolicyKeywords                # :\n            PolicyDecisionStrategy        = $Rule.PolicyDecisionStrategy        # : 2\n            PolicyRoles                   = $Rule.PolicyRoles                   # :\n            ConditionListType             = $Rule.ConditionListType             # : 3\n            CreationClassName             = $Rule.CreationClassName             # : MSFT|FW|FirewallRule|NETDIS-UPnPHost-Out-TCP\n            ExecutionStrategy             = $Rule.ExecutionStrategy             # : 2\n            Mandatory                     = $Rule.Mandatory                     # :\n            PolicyRuleName                = $Rule.PolicyRuleName                # :\n            Priority                      = $Rule.Priority                      # :\n            RuleUsage                     = $Rule.RuleUsage                     # :\n            SequencedActions              = $Rule.SequencedActions              # : 3\n            SystemCreationClassName       = $Rule.SystemCreationClassName       # :\n            SystemName                    = $Rule.SystemName                    # :\n            DisplayGroup                  = $Rule.DisplayGroup                  # : Network Discovery\n            LocalOnlyMapping              = $Rule.LocalOnlyMapping              # : False\n            LooseSourceMapping            = $Rule.LooseSourceMapping            # : False\n            Owner                         = $Rule.Owner                         # :\n            PackageFamilyName             = $Rule.PackageFamilyName             # :\n            Platforms                     = $Rule.Platforms                     # : {}\n            PolicyAppId                   = $Rule.PolicyAppId                   # :\n            PolicyStoreSource             = $Rule.PolicyStoreSource             # : PersistentStore\n            Profiles                      = $Rule.Profiles                      # : 4\n            RemoteDynamicKeywordAddresses = $Rule.RemoteDynamicKeywordAddresses # : {}\n            RuleGroup                     = $Rule.RuleGroup                     # : @FirewallAPI.dll,-32752\n            StatusCode                    = $Rule.StatusCode                    # : 65536\n            Program                       = $FiltersCache[$Rule.Name].Program\n            AppPath                       = $FiltersCache[$Rule.Name].AppPath\n            Protocol                      = $PortCache[$Rule.Name].Protocol      # : TCP\n            LocalPort                     = $PortCache[$Rule.Name].LocalPort     # : Any\n            RemotePort                    = $PortCache[$Rule.Name].RemotePort    # : 2869\n            IcmpType                      = $PortCache[$Rule.Name].IcmpType      # : Any\n            DynamicTarget                 = $PortCache[$Rule.Name].DynamicTarget # : Any\n        }\n    }\n}"
  },
  {
    "path": "Public/Computers/Get-ComputerInstalledUpdates.ps1",
    "content": "﻿function Get-ComputerInstalledUpdates {\n    <#\n    .SYNOPSIS\n    This function retrieves the history of updates installed on a computer or multiple computers.\n\n    .DESCRIPTION\n    The `Get-ComputerInstalledUpdates` function uses the Windows Update Agent API to query the history of updates installed on a computer. It returns a list of updates with details such as the KB number, installation date, update type, version, and more.\n\n    .PARAMETER ComputerName\n    An array of computer names. The default value is the name of the current computer.\n\n    .PARAMETER IncludeType\n    An array of update types to include in the results. Valid values are 'Antivirus', 'CumulativeUpdate', 'WindowsUpdate', 'ServicingStackUpdate', and 'Other'.\n\n    .PARAMETER ExcludeType\n    An array of update types to exclude from the results. Valid values are the same as for `IncludeType`.\n\n    .PARAMETER SearchKB\n    A string to search for in the KB numbers of the updates.\n\n    .PARAMETER Credential\n    A PSCredential object to use when connecting to the computers.\n\n    .EXAMPLE\n    # Get all updates installed on the current computer\n    Get-ComputerInstalledUpdates\n\n    .EXAMPLE\n    # Get all 'Windows Update' type updates installed on the computer 'Computer1'\n    Get-ComputerInstalledUpdates -ComputerName 'Computer1' -IncludeType 'WindowsUpdate'\n\n    .EXAMPLE\n    # Get all updates except 'Antivirus' type updates installed on the computers 'Computer1' and 'Computer2'\n    Get-ComputerInstalledUpdates -ComputerName 'Computer1', 'Computer2' -ExcludeType 'Antivirus'\n\n    .EXAMPLE\n    # Search for a specific KB number on the current computer\n    Get-ComputerInstalledUpdates -SearchKB 'KB123456'\n\n    .NOTES\n    This function uses the COM interface of the Windows Update Agent API, which requires administrative privileges. If you run this function without administrative privileges, it may not return all updates.\n    #>\n    [CmdletBinding()]\n    param(\n        [string[]] $ComputerName = $Env:COMPUTERNAME,\n        [ValidateSet(\n            'Antivirus',\n            'CumulativeUpdate',\n            'WindowsUpdate',\n            'ServicingStackUpdate',\n            'Other'\n        )][string[]] $IncludeType,\n        [ValidateSet(\n            'Antivirus',\n            'CumulativeUpdate',\n            'WindowsUpdate',\n            'ServicingStackUpdate',\n            'Other'\n        )][string[]] $ExcludeType,\n        [string] $SearchKB,\n        [pscredential] $Credential\n    )\n    # https://learn.microsoft.com/en-us/windows/win32/api/wuapi/\n    <#\n    These properties are part of the `IUpdateHistoryEntry` interface in the Windows Update Agent API. Here's what they mean:\n\n    - `Operation`: This property indicates the type of operation that was performed. It's an integer that corresponds to one of the following values:\n      - 1: Installation\n      - 2: Uninstallation\n      - 3: Other\n\n    - `ResultCode`: This property indicates the result of the operation. It's an integer that corresponds to one of the following values:\n      - 1: In Progress\n      - 2: Succeeded\n      - 3: Succeeded With Errors\n      - 4: Failed\n      - 5: Aborted\n\n    - `HResult`: This property contains the HRESULT of the operation. An HRESULT is a type of error code used in Windows programming. A value of 0 typically means the operation was successful.\n\n    - `UnmappedResultCode`: This property contains the result code of the operation as returned by the update installer. The exact meaning of this value can vary depending on the installer that was used.\n\n    - `ServerSelection`: This property indicates the type of server that was used for the operation. It's an integer that corresponds to one of the following values:\n      - 0: Default\n      - 1: Managed server\n      - 2: Self-update server\n      - 3: Other\n\n    - `ServiceID`: This property contains the ID of the service that performed the operation. For updates installed through Windows Update, this will typically be the ID of the Windows Update service.\n\n    Please note that these are general descriptions and the exact meaning of these properties can depend on the specific update and the context in which it was installed. For more detailed information, you may need to refer to the documentation for the Windows Update Agent API.\n    #>\n    $Properties = @(\n        'ComputerName', 'InstalledOn', 'KB', 'Categories', 'Type', 'Version', 'Title', 'ClientApplicationID', 'InstalledFrom',\n        'Description', 'Operation', 'Status', 'SupportUrl', 'UpdateID', 'RevisionNumber',\n        'UnmappedResultCode', 'HResult', 'ServiceID', 'UninstallationSteps', 'UninstallationNotes'\n    )\n    $ScriptBlock = {\n        <#\n        $Session = New-Object -ComObject Microsoft.Update.Session\n        $Searcher = $Session.CreateUpdateSearcher()\n        $historyCount = $Searcher.GetTotalHistoryCount()\n        $QueryHistory = $Searcher.QueryHistory(0, $historyCount)\n        $QueryHistory\n        #>\n        $Session = New-Object -ComObject Microsoft.Update.Session\n        $Searcher = $Session.CreateUpdateSearcher()\n        $historyCount = $Searcher.GetTotalHistoryCount()\n        $kbRegex = '(KB\\d+)'\n        $versionRegex = 'Version (\\d+\\.\\d+\\.\\d+\\.\\d+)'\n\n        $QueryHistory = $Searcher.QueryHistory(0, $historyCount)\n        $QueryHistory | Where-Object date -GT (Get-Date \"1/1/2000\") | ForEach-Object {\n            $KbMatch = Select-String $kbRegex -InputObject $_.Title\n            $Kb = if ($kbMatch) { $kbMatch.matches.groups[0].value } else { $null }\n\n            $VersionMatch = Select-String $VersionRegex -InputObject $_.Title\n            $Version = if ($VersionMatch) { $VersionMatch.matches.groups[1].value } else { $null }\n\n            $Categories = $_.Categories | ForEach-Object { $_.Name }\n            # $uninstallationSteps = $_.UninstallationSteps | ForEach-Object { $_ }\n\n            if ($_.Title -like \"*Security Intelligence Update*\" -or $_.Title -like \"*Antivirus*\" -or $_.Title -like \"*Malicious Software*\") {\n                $Type = \"Antivirus\"\n            } elseif ($_.Title -like \"*Cumulative Update*\") {\n                $Type = \"CumulativeUpdate\"\n            } elseif ($_.Title -like \"*Update for Windows*\" -or $_.Title -like \"*Security Update*\" -or $_.Title -like \"*Update for Microsoft*\" -or $_.Title -like \"*Update for Internet Explorer*\") {\n                $Type = \"WindowsUpdate\"\n            } elseif ($_.Title -like \"*Servicing Stack Update*\") {\n                $Type = \"ServicingStackUpdate\"\n            } else {\n                $Type = \"Other\"\n            }\n\n            [PSCustomObject]@{\n                \"ComputerName\"        = $Env:COMPUTERNAME\n                \"InstalledOn\"         = $_.Date\n                \"KB\"                  = $Kb\n                \"Categories\"          = $Categories #-join ', '\n                \"Type\"                = $Type\n                \"Version\"             = $Version\n                \"ClientApplicationID\" = $_.ClientApplicationID\n                \"InstalledFrom\"       = switch ($_.ServerSelection) { 0 { \"Default\" }; 1 { \"Managed Server\" }; 2 { \"Windows Update\" }; 3 { \"Others\" } }\n                \"Title\"               = $_.Title\n                \"Description\"         = $_.Description\n                \"Operation\"           = switch ($_.operation) { 1 { \"Installation\" }; 2 { \"Uninstallation\" }; 3 { \"Other\" } }\n                \"Status\"              = switch ($_.resultcode) { 1 { \"In Progress\" }; 2 { \"Succeeded\" }; 3 { \"Succeeded With Errors\" }; 4 { \"Failed\" }; 5 { \"Aborted\" } }\n                \"SupportUrl\"          = $_.SupportUrl\n                \"UpdateID\"            = $_.UpdateIdentity.UpdateID\n                \"RevisionNumber\"      = $_.UpdateIdentity.RevisionNumber\n                \"UnmappedResultCode\"  = $_.UnmappedResultCode\n                \"HResult\"             = $_.HResult\n                \"ServiceID\"           = $_.ServiceID\n                \"UninstallationSteps\" = $_.UninstallationSteps.Name\n                \"UninstallationNotes\" = $_.UninstallationNotes\n            }\n        }\n    }\n\n    [Array] $ComputersSplit = Get-ComputerSplit -ComputerName $ComputerName\n\n    $Computers = $ComputersSplit[1]\n    $Data = if ($Computers.Count -gt 0) {\n        foreach ($Computer in $Computers) {\n            try {\n                $invokeCommandSplat = @{\n                    ComputerName = $Computer\n                    ScriptBlock  = $ScriptBlock\n                    ErrorAction  = 'Stop'\n                }\n                if ($Credential) {\n                    $invokeCommandSplat.Credential = $Credential\n                }\n                Invoke-Command @invokeCommandSplat | Select-Object -Property $Properties\n            } catch {\n                Write-Warning -Message \"Get-ComputerInstalledUpdates - No data for computer $Computer. Failed with error: $($_.Exception.Message)\"\n            }\n        }\n    } else {\n        try {\n            $invokeCommandSplat = @{\n                ScriptBlock = $ScriptBlock\n                ErrorAction = 'Stop'\n            }\n            if ($Credential) {\n                $invokeCommandSplat.Credential = $Credential\n            }\n            Invoke-Command @invokeCommandSplat\n        } catch {\n            Write-Warning -Message \"Get-ComputerInstalledUpdates - No data for computer $($Env:COMPUTERNAME). Failed with error: $($_.Exception.Message)\"\n        }\n    }\n    if ($SearchKB) {\n        foreach ($D in $Data) {\n            if ($D.KB -like \"*$SearchKB*\") {\n                $D\n            }\n        }\n    } else {\n        foreach ($Update in $Data) {\n            if ($IncludeType -and $IncludeType -notcontains $Update.Type) {\n                continue\n            }\n            if ($ExcludeType -and $ExcludeType -contains $Update.Type) {\n                continue\n            }\n            $Update\n        }\n    }\n}"
  },
  {
    "path": "Public/Computers/Get-ComputerMemory.ps1",
    "content": "﻿function Get-ComputerMemory {\n    <#\n    .SYNOPSIS\n    Retrieves memory information from specified computers.\n\n    .DESCRIPTION\n    This function retrieves memory information from specified computers, including details about physical memory usage, virtual memory usage, and memory percentages.\n\n    .PARAMETER ComputerName\n    Specifies the name of the computer(s) to retrieve memory information from. Defaults to the local computer.\n\n    .PARAMETER Protocol\n    Specifies the protocol to use for retrieving memory information. Valid values are 'Default', 'Dcom', and 'Wsman'. Defaults to 'Default'.\n\n    .PARAMETER Credential\n    Alternate credentials for CIM queries. Default is current user.\n\n    .PARAMETER All\n    Switch parameter to retrieve all available memory properties.\n\n    .EXAMPLE\n    Get-ComputerMemory -ComputerName \"Server01\"\n    Retrieves memory information from a remote computer named Server01.\n\n    .EXAMPLE\n    Get-ComputerMemory -ComputerName \"WorkstationA\", \"WorkstationB\" -Protocol Wsman -All\n    Retrieves all available memory properties from multiple remote computers using the Wsman protocol.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string[]] $ComputerName = $Env:COMPUTERNAME,\n        [ValidateSet('Default', 'Dcom', 'Wsman')][string] $Protocol = 'Default',\n        [pscredential] $Credential,\n        [switch] $All\n    )\n    [string] $Class = 'win32_operatingsystem'\n    if ($All) {\n        [string] $Properties = '*'\n    } else {\n        [string] $Properties = \"*\"\n    }\n    $Information = Get-CimData -ComputerName $ComputerName -Protocol $Protocol -Credential $Credential -Class $Class -Properties $Properties\n    if ($All) {\n        $Information\n    } else {\n        foreach ($Data in $Information) {\n            $FreeMB = [math]::Round($Data.FreePhysicalMemory / 1024, 2)\n            $TotalMB = [math]::Round($Data.TotalVisibleMemorySize / 1024, 2)\n            $UsedMB = $TotalMB - $FreeMB\n            $UsedPercent = [math]::Round(($UsedMB / $TotalMB) * 100, 2)\n            $FreeVirtualMB = [math]::Round($Data.FreeVirtualMemory / 1024, 2)\n            $TotalVirtualMB = [math]::Round($Data.TotalVirtualMemorySize / 1024, 2)\n            $UsedVirtualMB = $TotalVirtualMB - $FreeVirtualMB\n            $UsedVirtualPercent = [math]::Round(($UsedVirtualMB / $TotalVirtualMB) * 100, 2)\n\n            [PSCustomObject] @{\n                ComputerName                = if ($Data.PSComputerName) { $Data.PSComputerName } else { $Env:COMPUTERNAME }\n                MemoryUsed                  = $UsedMB\n                MemoryFree                  = $FreeMB\n                MemoryTotal                 = $TotalMB\n                MemoryUsedPercentage        = $UsedPercent\n                VirtualMemoryUsed           = $UsedVirtualMB\n                VirtualMemoryUsedPercentage = $UsedVirtualPercent\n                VirtualMemoryFree           = $FreeVirtualMB\n                VirtualMemoryTotal          = $TotalVirtualMB\n            }\n        }\n    }\n}\n\n#Get-ComputerMemory -ComputerName AD0, AD1 | Format-Table *\n"
  },
  {
    "path": "Public/Computers/Get-ComputerMissingDrivers.ps1",
    "content": "function Get-ComputerMissingDrivers {\n    <#\n    .SYNOPSIS\n    Retrieves information about missing drivers on a specified computer.\n\n    .DESCRIPTION\n    This function retrieves information about missing drivers on a specified computer by querying the Win32_PNPEntity WMI class.\n\n    .PARAMETER ComputerName\n    Specifies the name of the computer to query. Defaults to the local computer.\n\n    .PARAMETER Credential\n    Alternate credentials for the WMI query.\n\n    .EXAMPLE\n    Get-ComputerMissingDrivers -ComputerName \"Computer01\"\n    Retrieves information about missing drivers on a computer named \"Computer01\".\n\n    .EXAMPLE\n    Get-ComputerMissingDrivers\n    Retrieves information about missing drivers on the local computer.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string] $ComputerName = $Env:COMPUTERNAME,\n        [pscredential] $Credential\n    )\n    $wmiParams = @{ Class = 'Win32_PNPEntity'; ComputerName = $ComputerName }\n    if ($Credential) { $wmiParams['Credential'] = $Credential }\n    $Data = Get-WmiObject @wmiParams | Where-Object { $_.Configmanagererrorcode -ne 0 } | Select-Object Caption, ConfigmanagererrorCode, Description, DeviceId, HardwareId, PNPDeviceID\n    return $Data\n}\n"
  },
  {
    "path": "Public/Computers/Get-ComputerNetFramework.ps1",
    "content": "﻿function Get-ComputerNetFramework {\n    <#\n    .SYNOPSIS\n    Get the installed .NET Framework version on a computer\n\n    .DESCRIPTION\n    Get the installed .NET Framework version on a computer\n\n    .PARAMETER ComputerName\n    The name of the computer to check the .NET Framework version on\n\n    .EXAMPLE\n    $DCs = Get-ADDomainController -Filter * -Server 'ad.evotec.xyz'\n    Get-ComputerNetFramework -ComputerName $Dcs.HostName | Format-Table *\n\n    .NOTES\n    General notes\n    #>\n    [CmdletBinding()]\n    param(\n        [string[]] $ComputerName = $env:COMPUTERNAME\n    )\n    foreach ($Computer in $ComputerName) {\n        $Output1 = Get-PSRegistry -ComputerName $Computer -RegistryPath 'HKLM:\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Client'\n        #$Output2 = Get-PSRegistry -ComputerName $Computer -RegistryPath 'HKLM:\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full'\n        if ($Output1.PSError -eq $false) {\n            [PSCustomObject] @{\n                ComputerName        = $Computer\n                NetFrameworkVersion = $Output1.Version\n                NetFrameworkRelease = $Output1.Release\n                Message             = \"\"\n            }\n        } else {\n            [PSCustomObject] @{\n                ComputerName        = $Computer\n                NetFrameworkVersion = 'Not Installed'\n                NetFrameworkRelease = 'Not Installed'\n                Message             = $Output1.PSErrorMessage\n            }\n        }\n    }\n}"
  },
  {
    "path": "Public/Computers/Get-ComputerNetwork.ps1",
    "content": "﻿function Get-ComputerNetwork {\n    <#\n    .SYNOPSIS\n    Retrieves network information for specified computers.\n\n    .DESCRIPTION\n    This function retrieves network information for the specified computers, including details about network cards, firewall profiles, and connectivity status.\n\n    .PARAMETER ComputerName\n    Specifies the name of the computer(s) for which to retrieve network information.\n\n    .PARAMETER NetworkFirewallOnly\n    Indicates whether to retrieve only firewall information for the specified computers.\n\n    .PARAMETER NetworkFirewallSummaryOnly\n    Indicates whether to retrieve a summary of firewall information for the specified computers.\n\n    .PARAMETER Credential\n    Alternate credentials for CIM/firewall queries on remote hosts.\n\n    .EXAMPLE\n    Get-ComputerNetworkCard -ComputerName AD1, AD2, AD3\n\n    Output\n\n    Name          NetworkCardName             NetworkCardIndex     FirewallProfile FirewallStatus IPv4Connectivity IPv6Connectivity Caption Description ElementName DefaultInboundAction DefaultOutboundAction AllowInboundRules AllowLocalFirewallRules AllowLocalIPsecRules AllowUserApps AllowUserPorts AllowUnicastResponseToMulticast NotifyOnListen EnableStealthModeForIPsec LogFileName                                           LogMaxSizeKilobytes LogAllowed LogBlo\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                        cked\n    ----          ---------------             ----------------     --------------- -------------- ---------------- ---------------- ------- ----------- ----------- -------------------- --------------------- ----------------- ----------------------- -------------------- ------------- -------------- ------------------------------- -------------- ------------------------- -----------                                           ------------------- ---------- ------\n    ad.evotec.xyz vEthernet (External Switch)               13 DomainAuthenticated           True         Internet        NoTraffic                                        NotConfigured         NotConfigured     NotConfigured           NotConfigured        NotConfigured NotConfigured  NotConfigured                   NotConfigured           True             NotConfigured %systemroot%\\system32\\LogFiles\\Firewall\\pfirewall.log                4096      False  False\n    Network  2    Ethernet 2                                 2             Private           True         Internet        NoTraffic                                                Block                 Allow     NotConfigured           NotConfigured        NotConfigured NotConfigured  NotConfigured                   NotConfigured          False             NotConfigured %systemroot%\\system32\\LogFiles\\Firewall\\pfirewall.log                4096      False  False\n    Network       Ethernet                                   2             Private           True     LocalNetwork        NoTraffic                                        NotConfigured         NotConfigured     NotConfigured           NotConfigured        NotConfigured NotConfigured  NotConfigured                   NotConfigured          False             NotConfigured %systemroot%\\system32\\LogFiles\\Firewall\\pfirewall.log                4096      False  False\n    ad.evotec.xyz Ethernet 5                                 3 DomainAuthenticated          False         Internet        NoTraffic                                        NotConfigured         NotConfigured     NotConfigured           NotConfigured        NotConfigured NotConfigured  NotConfigured                   NotConfigured          False             NotConfigured %systemroot%\\system32\\LogFiles\\Firewall\\pfirewall.log                4096      False  False\n    Network 2     Ethernet 4                                12             Private          False     LocalNetwork        NoTraffic                                        NotConfigured         NotConfigured     NotConfigured           NotConfigured        NotConfigured NotConfigured  NotConfigured                   NotConfigured          False             NotConfigured %systemroot%\\system32\\LogFiles\\Firewall\\pfirewall.log                4096      False  False\n\n    .EXAMPLE\n    Get-ComputerNetworkCard -ComputerName EVOWIN -NetworkFirewallOnly\n\n    PSComputerName Profile Enabled DefaultInboundAction DefaultOutboundAction AllowInboundRules AllowLocalFirewallRules AllowLocalIPsecRules AllowUserApps AllowUserPorts AllowUnicastResponseToMulticast NotifyOnListen EnableStealthModeForIPsec LogMaxSizeKilobytes LogAllowed LogBlocked    LogIgnored Caption Description ElementName InstanceID                      DisabledInterfaceAliases LogFileName                                           Name    CimClass\n    -------------- ------- ------- -------------------- --------------------- ----------------- ----------------------- -------------------- ------------- -------------- ------------------------------- -------------- ------------------------- ------------------- ---------- ----------    ---------- ------- ----------- ----------- ----------                      ------------------------ -----------                                           ----    --------\n    EVOWIN         Domain     True        NotConfigured         NotConfigured     NotConfigured           NotConfigured        NotConfigured NotConfigured  NotConfigured                   NotConfigured           True             NotConfigured                4096      False      False NotConfigured                                 MSFT|FW|FirewallProfile|Domain  {NotConfigured}          %systemroot%\\system32\\LogFiles\\Firewall\\pfirewall.log Domain  root/stand...\n    EVOWIN         Private    True        NotConfigured         NotConfigured     NotConfigured           NotConfigured        NotConfigured NotConfigured  NotConfigured                   NotConfigured           True             NotConfigured                4096      False      False NotConfigured                                 MSFT|FW|FirewallProfile|Private {NotConfigured}          %systemroot%\\system32\\LogFiles\\Firewall\\pfirewall.log Private root/stand...\n    EVOWIN         Public     True        NotConfigured         NotConfigured     NotConfigured           NotConfigured        NotConfigured NotConfigured  NotConfigured                   NotConfigured           True             NotConfigured                4096      False      False NotConfigured                                 MSFT|FW|FirewallProfile|Public  {NotConfigured}          %systemroot%\\system32\\LogFiles\\Firewall\\pfirewall.log Public  root/stand...\n\n    .NOTES\n    General notes\n    #>\n    [alias('Get-ComputerNetworkCard')]\n    [CmdletBinding()]\n    param(\n        [string[]] $ComputerName = $Env:COMPUTERNAME,\n        [pscredential] $Credential,\n        [switch] $NetworkFirewallOnly,\n        [switch] $NetworkFirewallSummaryOnly,\n        [alias('Joiner')][string] $Splitter\n    )\n    [Array] $CollectionComputers = $ComputerName.Where( { $_ -eq $Env:COMPUTERNAME }, 'Split')\n\n    $remoteSessionTargets = $CollectionComputers[1]\n    $remoteCimSession = $null\n    if ($remoteSessionTargets.Count -gt 0 -and $Credential) {\n        try {\n            $remoteCimSession = New-CimSession -ComputerName $remoteSessionTargets -Credential $Credential -ErrorAction Stop\n            $remoteSessionTargets = $remoteCimSession\n        } catch {\n            Write-Verbose \"Get-ComputerNetwork - Failed to create CimSession with supplied credentials. Falling back to default context. $_\"\n        }\n    }\n\n    $Firewall = @{ }\n    $NetworkFirewall = @(\n        if ($CollectionComputers[0].Count -gt 0) {\n            $Firewall[$Env:COMPUTERNAME] = @{ }\n            $Output = Get-NetFirewallProfile\n            foreach ($_ in $Output) {\n                Add-Member -InputObject $_ -Name 'PSComputerName' -Value $Env:COMPUTERNAME -Type NoteProperty -Force\n                $_\n                if ($_.Name -eq 'Domain') {\n                    $Firewall[$Env:COMPUTERNAME]['DomainAuthenticated'] = $_\n                } else {\n                    $Firewall[$Env:COMPUTERNAME][$($_.Name)] = $_\n                }\n            }\n\n        }\n        if ($CollectionComputers[1].Count -gt 0) {\n            foreach ($_ in $CollectionComputers[1]) {\n                $Firewall[$_] = @{ }\n            }\n            $Output = Get-NetFirewallProfile -CimSession $remoteSessionTargets\n            foreach ($_ in $Output) {\n                if ($_.Name -eq 'Domain') {\n                    $Firewall[$_.PSComputerName]['DomainAuthenticated'] = $_\n                    #  $Firewall[$_.PSComputerName][\"DomainAuthenticatedEverything\"] = $_\n                } else {\n                    $Firewall[$_.PSComputerName][$($_.Name)] = $_\n                    #$Firewall[$_.PSComputerName][\"$($_.Name)Everything\"] = $_\n                }\n\n            }\n        }\n    )\n    if ($NetworkFirewallOnly) {\n        if ($remoteCimSession) { $remoteCimSession | Remove-CimSession }\n        return $NetworkFirewall\n    }\n    if ($NetworkFirewallSummaryOnly) {\n        <#\n        Name                           Value\n        ----                           -----\n        AD1                            {Private, DomainAuthenticated, Public}\n        DC1                            {Private, DomainAuthenticated, Public}\n        AD2                            {Private, DomainAuthenticated, Public}\n        EVOWIN                         {Private, DomainAuthenticated, Public}\n        AD3                            {Private, DomainAuthenticated, Public}\n\n        Where $T['EvoWin']['Private']\n\n        Name                            : Private\n        Enabled                         : True\n        DefaultInboundAction            : NotConfigured\n        DefaultOutboundAction           : NotConfigured\n        AllowInboundRules               : NotConfigured\n        AllowLocalFirewallRules         : NotConfigured\n        AllowLocalIPsecRules            : NotConfigured\n        AllowUserApps                   : NotConfigured\n        AllowUserPorts                  : NotConfigured\n        AllowUnicastResponseToMulticast : NotConfigured\n        NotifyOnListen                  : True\n        EnableStealthModeForIPsec       : NotConfigured\n        LogFileName                     : %systemroot%\\system32\\LogFiles\\Firewall\\pfirewall.log\n        LogMaxSizeKilobytes             : 4096\n        LogAllowed                      : False\n        LogBlocked                      : False\n        LogIgnored                      : NotConfigured\n        DisabledInterfaceAliases        : {NotConfigured}\n\n        #>\n        if ($remoteCimSession) { $remoteCimSession | Remove-CimSession }\n        return $Firewall\n    }\n    $NetworkCards = @(\n        if ($CollectionComputers[0].Count -gt 0) {\n            $Output = Get-NetConnectionProfile\n            foreach ($_ in $Output) {\n                Add-Member -InputObject $_ -Name 'PSComputerName' -Value $Env:COMPUTERNAME -Type NoteProperty -Force\n                $_\n\n            }\n        }\n        if ($CollectionComputers[1].Count -gt 0) {\n            Get-NetConnectionProfile -CimSession $remoteSessionTargets\n        }\n    )\n    foreach ($_ in $NetworkCards) {\n\n        $NetworkCardsConfiguration = Get-CimData -ComputerName $ComputerName -Class 'Win32_NetworkAdapterConfiguration' -Credential $Credential\n        $CurrentCard = foreach ($Configuration in $NetworkCardsConfiguration) {\n            if ($_.PSComputerName -eq $Configuration.PSComputerName) {\n                if ($Configuration.InterfaceIndex -eq $_.InterfaceIndex) {\n                    $Configuration\n                }\n            }\n        }\n\n        $NetbiosTCPIP = @{\n            '0' = 'Default'\n            '1' = 'Enabled'\n            '2' = 'Disabled'\n        }\n\n        [PSCustomObject] @{\n            Name                            = $_.Name\n            NetworkCardName                 = $_.InterfaceAlias\n            NetworkCardIndex                = $_.InterfaceIndex\n            FirewallProfile                 = $_.NetworkCategory\n            FirewallStatus                  = $Firewall[$_.PSComputerName][\"$($_.NetworkCategory)\"].'Enabled'\n\n            IPAddress                       = $CurrentCard.IPAddress\n            IPGateway                       = $CurrentCard.DefaultIPGateway\n            IPSubnet                        = $CurrentCard.IPSubnet\n            IPv4Connectivity                = $_.IPv4Connectivity\n            IPv6Connectivity                = $_.IPv6Connectivity\n            DNSServerSearchOrder            = $CurrentCard.DNSServerSearchOrder\n            DNSDomainSuffixSearchOrder      = $CurrentCard.DNSDomainSuffixSearchOrder\n            FullDNSRegistrationEnabled      = $CurrentCard.FullDNSRegistrationEnabled\n            DHCPEnabled                     = $CurrentCard.DHCPEnabled\n            DHCPServer                      = $CurrentCard.DHCPServer\n            DHCPLeaseObtained               = $CurrentCard.DHCPLeaseObtained\n            NetBIOSOverTCPIP                = $NetBiosTCPIP[\"$($CurrentCard.TcpipNetbiosOptions)\"]\n            Caption                         = $_.Caption\n            Description                     = $_.Description\n            ElementName                     = $_.ElementName\n            # Firewall based fields\n            DefaultInboundAction            = $Firewall[$_.PSComputerName][\"$($_.NetworkCategory)\"].DefaultInboundAction\n            DefaultOutboundAction           = $Firewall[$_.PSComputerName][\"$($_.NetworkCategory)\"].DefaultOutboundAction\n            AllowInboundRules               = $Firewall[$_.PSComputerName][\"$($_.NetworkCategory)\"].AllowInboundRules\n            AllowLocalFirewallRules         = $Firewall[$_.PSComputerName][\"$($_.NetworkCategory)\"].AllowLocalFirewallRules\n            AllowLocalIPsecRules            = $Firewall[$_.PSComputerName][\"$($_.NetworkCategory)\"].AllowLocalIPsecRules\n            AllowUserApps                   = $Firewall[$_.PSComputerName][\"$($_.NetworkCategory)\"].AllowUserApps\n            AllowUserPorts                  = $Firewall[$_.PSComputerName][\"$($_.NetworkCategory)\"].AllowUserPorts\n            AllowUnicastResponseToMulticast = $Firewall[$_.PSComputerName][\"$($_.NetworkCategory)\"].AllowUnicastResponseToMulticast\n            NotifyOnListen                  = $Firewall[$_.PSComputerName][\"$($_.NetworkCategory)\"].NotifyOnListen\n            EnableStealthModeForIPsec       = $Firewall[$_.PSComputerName][\"$($_.NetworkCategory)\"].EnableStealthModeForIPsec\n            LogFileName                     = $Firewall[$_.PSComputerName][\"$($_.NetworkCategory)\"].LogFileName\n            LogMaxSizeKilobytes             = $Firewall[$_.PSComputerName][\"$($_.NetworkCategory)\"].LogMaxSizeKilobytes\n            LogAllowed                      = $Firewall[$_.PSComputerName][\"$($_.NetworkCategory)\"].LogAllowed\n            LogBlocked                      = $Firewall[$_.PSComputerName][\"$($_.NetworkCategory)\"].LogBlocked\n            LogIgnored                      = $Firewall[$_.PSComputerName][\"$($_.NetworkCategory)\"].LogIgnored\n            ComputerName                    = $_.PSComputerName\n        }\n    }\n    if ($remoteCimSession) { $remoteCimSession | Remove-CimSession }\n}\n\n#Get-ComputerNetwork -ComputerName AD1, AD2 | Format-Table -a *\n#Get-CimData -ComputerName AD1 -Class 'Win32_NetworkAdapterConfiguration'\n"
  },
  {
    "path": "Public/Computers/Get-ComputerOEMInformation.ps1",
    "content": "function Get-ComputerOemInformation {\n    <#\n    .SYNOPSIS\n    Retrieves OEM information from a specified computer.\n\n    .DESCRIPTION\n    This function retrieves OEM information such as Model, Manufacturer, Logo, Support Phone, Support URL, and Support Hours from the specified computer.\n\n    .PARAMETER ComputerName\n    Specifies the name of the computer from which to retrieve the OEM information. If not specified, the local computer name is used.\n\n    .PARAMETER Credential\n    Alternate credentials for remote Invoke-Command.\n\n    .EXAMPLE\n    Get-ComputerOemInformation\n    Retrieves OEM information from the local computer.\n\n    .EXAMPLE\n    Get-ComputerOemInformation -ComputerName \"Computer01\"\n    Retrieves OEM information from a remote computer named \"Computer01\".\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string] $ComputerName = $Env:COMPUTERNAME,\n        [pscredential] $Credential\n    )\n    $ScriptBlock = { Get-ItemProperty HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\OEMInformation | Select-Object Model, Manufacturer, Logo, SupportPhone, SupportURL, SupportHours }\n    if ($ComputerName -eq $Env:COMPUTERNAME) {\n        $Data = Invoke-Command -ScriptBlock $ScriptBlock\n    } else {\n        $invokeSplat = @{ ComputerName = $ComputerName; ScriptBlock = $ScriptBlock }\n        if ($Credential) { $invokeSplat.Credential = $Credential }\n        $Data = Invoke-Command @invokeSplat\n    }\n    return $Data\n}\n"
  },
  {
    "path": "Public/Computers/Get-ComputerOperatingSystem.ps1",
    "content": "function Get-ComputerOperatingSystem {\n    <#\n    .SYNOPSIS\n    Retrieves operating system information from remote computers.\n\n    .DESCRIPTION\n    This function retrieves operating system information from remote computers using CIM/WMI queries. It provides details such as the operating system name, version, manufacturer, architecture, language, product suite, installation date, last boot-up time, and more.\n\n    .PARAMETER ComputerName\n    Specifies the name of the remote computer(s) to retrieve the operating system information from. Defaults to the local computer.\n\n    .PARAMETER Protocol\n    Specifies the protocol to use for the connection (Default, Dcom, or Wsman). Default is 'Default'.\n\n    .PARAMETER Credential\n    Alternate credentials for CIM queries. Default is current user.\n\n    .PARAMETER All\n    Switch parameter to retrieve all available properties of the operating system.\n\n    .EXAMPLE\n    Get-ComputerOperatingSystem -ComputerName \"Server01\" -Protocol Wsman\n    Retrieves operating system information from a single remote computer named \"Server01\" using the Wsman protocol.\n\n    .EXAMPLE\n    Get-ComputerOperatingSystem -ComputerName \"Server01\", \"Server02\" -All\n    Retrieves all available operating system properties from multiple remote computers named \"Server01\" and \"Server02\".\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string[]] $ComputerName = $Env:COMPUTERNAME,\n        [ValidateSet('Default', 'Dcom', 'Wsman')][string] $Protocol = 'Default',\n        [pscredential] $Credential,\n        [switch] $All\n    )\n    [string] $Class = 'win32_operatingsystem'\n    if ($All) {\n        [string] $Properties = '*'\n    } else {\n        [string[]] $Properties = 'Caption', 'Manufacturer', 'InstallDate', 'OSArchitecture', 'Version', 'SerialNumber', 'BootDevice', 'WindowsDirectory', 'CountryCode', 'OSLanguage', 'OSProductSuite', 'PSComputerName', 'LastBootUpTime', 'LocalDateTime'\n    }\n    $Information = Get-CimData -ComputerName $ComputerName -Protocol $Protocol -Credential $Credential -Class $Class -Properties $Properties\n    if ($All) {\n        $Information\n    } else {\n        foreach ($Data in $Information) {\n            # # Remember to expand if changing properties above\n            [PSCustomObject] @{\n                ComputerName           = if ($Data.PSComputerName) { $Data.PSComputerName } else { $Env:COMPUTERNAME }\n                OperatingSystem        = $Data.Caption\n                OperatingSystemVersion = ConvertTo-OperatingSystem -OperatingSystem $Data.Caption -OperatingSystemVersion $Data.Version\n                OperatingSystemBuild   = $Data.Version\n                Manufacturer           = $Data.Manufacturer\n                OSArchitecture         = $Data.OSArchitecture\n                OSLanguage             = ConvertFrom-LanguageCode -LanguageCode $Data.OSLanguage\n                OSProductSuite         = [Microsoft.PowerShell.Commands.OSProductSuite] $($Data.OSProductSuite)\n                InstallDate            = $Data.InstallDate\n                LastBootUpTime         = $Data.LastBootUpTime\n                LocalDateTime          = $Data.LocalDateTime\n                SerialNumber           = $Data.SerialNumber\n                BootDevice             = $Data.BootDevice\n                WindowsDirectory       = $Data.WindowsDirectory\n                CountryCode            = $Data.CountryCode\n            }\n        }\n    }\n}\n\n#Get-ComputerOperatingSystem -ComputerName AD1, AD2, AD3, DC1 -All #| ft -a *\n\n#Get-CimInstance SoftwareLicensingProduct -ComputerName AD1 -Filter \"ApplicationID = '55c92734-d682-4d71-983e-d6ec3f16059f'\" | where licensestatus -eq 1 | `\n#    select name, description, @{Label = 'computer'; Expression = { $_.PscomputerName } } | Format-List  name, description, computer\n\n#Get-CimInstance -class SoftwareLicensingProduct | where { $_.name -match 'office' -AND $_.licensefamily } | ft -a *\n\n#$L = Get-CimData -Class 'SoftwareLicensingProduct' -ComputerName AD1,AD2,EVOWIN\n#$L | Where-Object { $_.Name -match 'windows' } | ft -a Name, ApplicationID,Description,ExtendedGrace,graceperiodremaining, GenuineStatus,LicenseFamily,LicenseStatus,LicenseStatusReason,PSComputerName\n\n<#\n$T = foreach ($_ in $L) {\n\n    $LicensStatus = switch ($_.LicenseStatus) {\n        0 { \"Unlicensed\" }\n        1 { \"Licensed\" }\n        2 { \"Out-Of-Box Grace Period\" }\n        3 { \"Out-Of-Tolerance Grace Period\" }\n        4 { \"Non-Genuine Grace Period\" }\n        5 { 'Evaluation' }\n    }\n\n\n    [PSCustomObject] @{\n        Name                     = $_.Name\n        Description              = $_.Description\n        LicenseFamily            = $_.LicenseFamily\n        LicenseStatus            = $LicensStatus\n        LicenseStatusReason      = $_.LicenseStatusReason\n        GracePeriodRemainingDays = $_.graceperiodremaining / 1440\n        ComputerName             = $_.PSComputerName\n    }\n}\n\n$T | ft -a\n\n#>\n"
  },
  {
    "path": "Public/Computers/Get-ComputerPorts.ps1",
    "content": "﻿function Get-ComputerPorts {\n    <#\n    .SYNOPSIS\n    Retrieves TCP connection information from a specified computer.\n\n    .DESCRIPTION\n    The Get-ComputerPorts function retrieves information about TCP connections on a specified computer.\n    It can filter connections based on state, local address, remote address, applied setting, local port, and remote port.\n\n    .PARAMETER ComputerName\n    The name of the computer from which to retrieve TCP connection information. If not specified, the local computer is used.\n\n    .PARAMETER State\n    The state of the TCP connections to retrieve. Valid states include Bound, Closed, CloseWait, Closing, DeleteTCB, Established, FinWait1, FinWait2, LastAck, Listen, SynReceived, SynSent, and TimeWait.\n\n    .PARAMETER LocalAddress\n    The local addresses of the TCP connections to retrieve.\n\n    .PARAMETER RemoteAddress\n    The remote addresses of the TCP connections to retrieve.\n\n    .PARAMETER AppliedSetting\n    The applied settings of the TCP connections to retrieve. Valid settings include Compat, Datacenter, DatacenterCustom, Internet, and InternetCustom.\n\n    .PARAMETER LocalPort\n    The local ports of the TCP connections to retrieve.\n\n    .PARAMETER RemotePort\n    The remote ports of the TCP connections to retrieve.\n\n    .EXAMPLE\n    Get-ComputerPorts -ComputerName 'AD1' -LocalPort 389, 636, 88, 53, 3268, 3269, 445, 135 | Sort-Object RemotePort | Format-Table -AutoSize *\n\n    Retrieves and displays TCP connection information from the computer 'AD1' for the specified local ports.\n\n    .EXAMPLE\n    Get-ComputerPorts -ComputerName 'AD1' -State 'Established' | Sort-Object RemotePort | Format-Table -AutoSize *\n\n    Retrieves and displays TCP connection information from the computer 'AD1' for connections in the 'Established' state.\n\n    .EXAMPLE\n    Get-ComputerPorts -ComputerName 'AD1' | ft -AutoSize\n\n    Retrieves and displays all TCP connection information from the computer 'AD1'.\n\n    .NOTES\n    This function requires administrative privileges to retrieve process information.\n    #>\n    [CmdletBinding()]\n    param(\n        [string] $ComputerName,\n        [ValidateSet(\n            'Bound', 'Closed', 'CloseWait', 'Closing', 'DeleteTCB', 'Established', 'FinWait1', 'FinWait2', 'LastAck', 'Listen', 'SynReceived', 'SynSent', 'TimeWait'\n        )][string[]] $State,\n        [string[]] $LocalAddress,\n        [string[]] $RemoteAddress,\n        [ValidateSet(\n            'Compat', 'Datacenter', 'DatacenterCustom', 'Internet', 'InternetCustom'\n        )][string[]] $AppliedSetting,\n        [int[]] $LocalPort,\n        [int[]] $RemotePort\n    )\n    $CachedProcesses = [ordered] @{}\n\n    $getNetTCPConnectionSplat = @{\n        State          = $State\n        LocalAddress   = $LocalAddress\n        RemoteAddress  = $RemoteAddress\n        AppliedSetting = $AppliedSetting\n        LocalPort      = $LocalPort\n        RemotePort     = $RemotePort\n        CimSession     = $ComputerName\n        ErrorAction    = 'Stop'\n    }\n    Remove-EmptyValue -Hashtable $getNetTCPConnectionSplat\n\n    try {\n        $Connections = Get-NetTCPConnection @getNetTCPConnectionSplat\n    } catch {\n        Write-Warning -Message \"Get-ComputerPorts - Error getting connections. Try running as admin? $($_.Exception.Message)\"\n        return\n    }\n    try {\n        if ($ComputerName) {\n            # https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.process.getprocesses?view=net-8.0#system-diagnostics-process-getprocesses(system-string)\n            # $Processes = Invoke-Command -ComputerName $ComputerName {\n            #    Get-Process\n            #}\n            $Processes = [System.Diagnostics.Process]::GetProcesses($ComputerName)\n        } else {\n            #Get-Process\n            $Processes = [System.Diagnostics.Process]::GetProcesses()\n        }\n    } catch {\n        Write-Warning -Message \"Get-ComputerPorts - Error getting processes. Try running as admin? $($_.Exception.Message)\"\n        return\n    }\n    foreach ($Process in $Processes) {\n        $CachedProcesses[\"$($Process.Id)\"] = $Process\n    }\n    foreach ($Connection in $Connections) {\n        $Process = $CachedProcesses[\"$($Connection.OwningProcess)\"]\n        [PSCustomObject] @{\n            LocalAddress   = $Connection.LocalAddress\n            LocalPort      = $Connection.LocalPort\n            RemoteAddress  = $Connection.RemoteAddress\n            RemotePort     = $Connection.RemotePort\n            State          = $Connection.State\n            AppliedSetting = $Connection.AppliedSetting   #: Datacenter\n            #OwningProcess  = $Connection.OwningProcess    #: 712\n            CreationTime   = $Connection.CreationTime     #: 2024 - 10 - 17 08:10:02\n            #OffloadState   = $Connection.OffloadState     #: InHost\n            ProcessName    = $Process.Name\n            ProcessId      = $Process.Id\n            StartTime      = $Process.StartTime\n        }\n    }\n}"
  },
  {
    "path": "Public/Computers/Get-ComputerRAM.ps1",
    "content": "﻿function Get-ComputerRAM {\n    <#\n    .SYNOPSIS\n    Retrieves information about the RAM of a specified computer.\n\n    .DESCRIPTION\n    This function retrieves detailed information about the RAM of a specified computer. It provides various properties such as Manufacturer, Model, Capacity, Speed, and more.\n\n    .PARAMETER ComputerName\n    Specifies the name of the computer to retrieve RAM information from. Defaults to the local computer.\n\n    .PARAMETER Protocol\n    Specifies the protocol to use for retrieving RAM information. Valid values are 'Default', 'Dcom', and 'Wsman'. Defaults to 'Default'.\n\n    .PARAMETER Credential\n    Alternate credentials for CIM queries. Default is current user.\n\n    .PARAMETER All\n    Indicates whether to retrieve all available properties of the RAM. If specified, all properties will be retrieved.\n\n    .PARAMETER Extended\n    Indicates whether to retrieve extended properties of the RAM. If specified, additional properties will be retrieved.\n\n    .EXAMPLE\n    Get-ComputerRAM -ComputerName \"Server01\" -Protocol Wsman\n    Retrieves RAM information from a remote computer named Server01 using the Wsman protocol.\n\n    .EXAMPLE\n    Get-ComputerRAM -ComputerName \"WorkstationA\" -All\n    Retrieves all available RAM properties from a computer named WorkstationA.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string] $ComputerName = $Env:COMPUTERNAME,\n        [ValidateSet('Default', 'Dcom', 'Wsman')][string] $Protocol = 'Default',\n        [pscredential] $Credential,\n        [switch] $All,\n        [switch] $Extended\n    )\n    [string] $Class = 'Win32_physicalmemory '\n    if ($All) {\n        [string] $Properties = '*'\n    } else {\n        [string[]] $Properties = @(\n            'InstallDate'\n            #'Name'\n            # 'Status'\n            'Manufacturer'\n            'Model'\n            'OtherIdentifyingInfo'\n            'PartNumber'\n            'PoweredOn'\n            'SerialNumber'\n            'SKU'\n            'Tag'\n            'Version'\n            'HotSwappable'\n            'Removable'\n            'Replaceable'\n            'FormFactor'\n            'BankLabel'\n            'Capacity'\n            #'DataWidth'\n            'InterleavePosition'\n            'MemoryType'\n            #'PositionInRow'\n            'Speed'\n            #'TotalWidth'\n            #'Attributes'\n            'ConfiguredClockSpeed'\n            'ConfiguredVoltage'\n            'DeviceLocator'\n            #'InterleaveDataDepth'\n            'MaxVoltage'\n            'MinVoltage'\n            'SMBIOSMemoryType'\n            'TypeDetail'\n            'PSComputerName'\n        )\n    }\n    $FormFactor = @{\n        '0'  = 'Unknown'\n        '1'  = 'Other'\n        '2'  = 'SIP'\n        '3'  = 'DIP'\n        '4'  = 'ZIP'\n        '5'  = 'SOJ'\n        '6'  = 'Proprietary'\n        '7'  = 'SIMM'\n        '8'  = 'DIMM'\n        '9'  = 'TSOP'\n        '10' = 'PGA'\n        '11' = 'RIMM'\n        '12' = 'SODIMM'\n        '13' = 'SRIMM'\n        '14' = 'SMD'\n        '15' = 'SSMP'\n        '16' = 'QFP'\n        '17' = 'TQFP'\n        '18' = 'SOIC'\n        '19' = 'LCC'\n        '20' = 'PLCC'\n        '21' = 'BGA'\n        '22' = 'FPBGA'\n        '23' = 'LGA'\n    }\n    $TypeDetails = @{\n        '1'    = 'Reserved'\n        '2'    = 'Other'\n        '4'    = 'Unknown'\n        '8'    = 'Fast-paged'\n        '16'   = 'Static column'\n        '32'   = 'Pseudo-static'\n        '64'   = 'RAMBUS'\n        '128'  = 'Synchronous'\n        '256'  = 'CMOS'\n        '512'  = 'EDO'\n        '1024' = 'Window DRAM'\n        '2048' = 'Cache DRAM'\n        '4096' = 'Non-volatile'\n    }\n    $InterleavePosition = @{\n        '0' = \"Non-Interleaved\"\n        '1' = \"First Position\"\n        '2' = \"Second Position\"\n    }\n    $MemoryType = @{\n        '0'  = \"Unknown\"\n        '1'  = \"Other\"\n        '2'  = \"DRAM\"\n        '3'  = \"Synchronous DRAM\"\n        '4'  = \"Cache DRAM\"\n        '5'  = \"EDO\"\n        '6'  = \"EDRAM\"\n        '7'  = \"VRAM\"\n        '8'  = \"SRAM\"\n        '9'  = \"ROM\"\n        '10' = \"ROM\"\n        '11' = \"FLASH\"\n        '12' = \"EEPROM\"\n        '13' = \"FEPROM\"\n        '14' = \"EPROM\"\n        '15' = \"CDRAM\"\n        '16' = \"3DRAM\"\n        '17' = \"SDRAM\"\n        '18' = \"SGRAM\"\n        '19' = \"RDRAM\"\n        '20' = \"DDR\"\n    }\n    $MemoryTypeSMBIOS = @{\n        '0'  = 'Unknown'\n        '1'  = 'Other'\n        '2'  = 'DRAM'\n        '3'  = 'Synchronous DRAM'\n        '4'  = 'Cache DRAM'\n        '5'  = 'EDO'\n        '6'  = 'EDRAM'\n        '7'  = 'VRAM' #(7)\n        '8'  = 'SRAM' #(8)\n        '9'  = 'RAM' #(9)\n        '10' = 'ROM'    #(10)\n        '11' = 'Flash' #(11)\n        '12' = 'EEPROM' #(12)\n        '13' = 'FEPROM' #(13)\n        '14' = 'EPROM' #(14)\n        '15' = 'CDRAM' #(15)\n        '16' = '3DRAM' #(16)\n        '17' = 'SDRAM' #(17)\n        '18' = 'SGRAM' #(18)\n        '19' = 'RDRAM' #(19)\n        '20' = 'DDR' #(20)\n        '21' = 'DDR2' #(21) # DDR2—May not be available.\n        '22' = 'DDR2 FB-DIMM' #(22) # DDR2—FB-DIMM, May not be available.\n        '24' = 'DDR3' #—May not be available.\n        '25' = 'FBD2'\n        '26' = 'DDR4'\n    }\n\n    $Information = Get-CimData -ComputerName $ComputerName -Protocol $Protocol -Credential $Credential -Class $Class -Properties $Properties\n    if ($All) {\n        $Information\n    } else {\n        foreach ($Info in $Information) {\n            foreach ($Data in $Info) {\n                # # Remember to expand if changing properties above\n                $Ram = [ordered] @{\n                    ComputerName       = if ($Data.PSComputerName) { $Data.PSComputerName } else { $Env:COMPUTERNAME }\n                    Manufacturer       = $Data.Manufacturer          #: 04CD\n                    FormFactor         = $FormFactor[\"$($Data.FormFactor)\"]            #: 8\n                    SMBIOSMemoryType   = $MemoryTypeSMBIOS[\"$($Data.SMBIOSMemoryType)\"]      #: 26\n                    Size               = [math]::round($Data.Capacity / 1GB, 2)              #: 17179869184\n                    Speed              = $Data.Speed                 #: 3200\n                    InterleavePosition = $InterleavePosition[\"$($Data.InterleavePosition)\"]    #: 2\n                    MemoryType         = $MemoryType[\"$($Data.MemoryType)\"]            #: 0\n                    TypeDetail         = $TypeDetails[\"$($Data.TypeDetail)\"]            #: 128\n                    PartNumber         = $Data.PartNumber            #: F4 - 3200C16-16GVK\n                    DeviceLocator        = $Data.DeviceLocator         #: ChannelB-DIMM0\n                }\n                if ($Extended) {\n                    $RamExtended = [ordered] @{\n                        InstallDate          = $Data.InstallDate\n                        #Name                 = $Data.Name                  #: Physical Memory\n                        #Status               = $Data.Status                #:\n                        Model                = $Data.Model                 #:\n                        OtherIdentifyingInfo = $Data.OtherIdentifyingInfo  #:\n\n                        PoweredOn            = $Data.PoweredOn             #:\n                        SerialNumber         = $Data.SerialNumber          #: 00000000\n                        SKU                  = $Data.SKU                   #:\n                        Tag                  = $Data.Tag                   #: Physical Memory 1\n                        Version              = $Data.Version               #:\n                        HotSwappable         = $Data.HotSwappable          #:\n                        Removable            = $Data.Removable             #:\n                        Replaceable          = $Data.Replaceable           #:\n                        BankLabel            = $Data.BankLabel             #: BANK 2\n                        #DataWidth            = $Data.DataWidth             #: 64\n                        #PositionInRow        = $Data.PositionInRow         #: 1\n                        #TotalWidth           = $Data.TotalWidth            #: 64\n                        #Attributes           = $Data.Attributes            #: 2\n                        ConfiguredClockSpeed = $Data.ConfiguredClockSpeed  #: 3200\n                        ConfiguredVoltage    = $Data.ConfiguredVoltage     #: 1200\n                        #InterleaveDataDepth  = $Data.InterleaveDataDepth   #: 1\n                        MaxVoltage           = $Data.MaxVoltage            #: 1200\n                        MinVoltage           = $Data.MinVoltage            #: 1200\n                    }\n                    [PSCustomObject] ($Ram + $RamExtended)\n                } else {\n                    [PSCustomObject] $Ram\n                }\n            }\n\n        }\n    }\n}\n#Get-ComputerRAM | Format-Table *\n#Get-ComputerRAM -ComputerName AD1 | Format-Table *\n"
  },
  {
    "path": "Public/Computers/Get-ComputerRDP.ps1",
    "content": "﻿function Get-ComputerRDP {\n    <#\n    .SYNOPSIS\n    Retrieves Remote Desktop Protocol (RDP) settings for a specified computer.\n\n    .DESCRIPTION\n    This function retrieves RDP settings for a specified computer using the Win32_TSGeneralSetting class.\n\n    .PARAMETER ComputerName\n    Specifies the name of the computer to retrieve RDP settings for.\n\n    .PARAMETER Credential\n    Alternate credentials for CIM queries to the terminal services namespace.\n\n    .EXAMPLE\n    Get-ComputerRDP -ComputerName \"Computer01\"\n    Retrieves RDP settings for a computer named \"Computer01\".\n\n    .EXAMPLE\n    Get-ComputerRDP -ComputerName \"Computer02\", \"Computer03\"\n    Retrieves RDP settings for multiple computers named \"Computer02\" and \"Computer03\".\n    #>\n    [alias('Get-RDPSecurity')]\n    [cmdletbinding()]\n    param(\n        [string[]] $ComputerName,\n        [pscredential] $Credential\n    )\n    <#\n    Caption                                :\n    Description                            :\n    InstallDate                            :\n    Name                                   :\n    Status                                 :\n    TerminalName                           : RDP-Tcp\n    CertificateName                        :\n    Certificates                           : {0, 0, 0, 0...}\n    Comment                                :\n    MinEncryptionLevel                     : 2\n    PolicySourceMinEncryptionLevel         : 0\n    PolicySourceSecurityLayer              : 0\n    PolicySourceUserAuthenticationRequired : 0\n    SecurityLayer                          : 2\n    SSLCertificateSHA1Hash                 : 696F767CD537FA3A172D11EF949C44779030464C\n    SSLCertificateSHA1HashType             : 1\n    TerminalProtocol                       : Microsoft RDP 8.0\n    Transport                              : tcp\n    UserAuthenticationRequired             : 1\n    WindowsAuthentication                  : 0\n    PSComputerName                         : AD2\n    #>\n    # https://docs.microsoft.com/en-us/windows/win32/termserv/win32-tsgeneralsetting\n    $Output = Get-CimData -class 'Win32_TSGeneralSetting' -NameSpace 'root\\cimv2\\terminalservices' -ComputerName $ComputerName -Credential $Credential\n    foreach ($_ in $Output) {\n\n\n        #Low level of encryption. Only data sent from the client to the server is encrypted using 56-bit encryption. Be aware that data sent from the server to the client is not encrypted.\n        #Client compatible level of encryption. All data sent from client to server and from server to client is encrypted at the maximum key strength supported by the client.\n        #High level of encryption. All data sent from client to server and from server to client is encrypted using strong 128-bit encryption. Clients that do not support this level of encryption cannot connect.\n        #FIPS compliant encryption. All data sent from client to server and from server to client is encrypted and decrypted with the Federal Information Processing Standard (FIPS) encryption algorithms using the Microsoft cryptographic modules. FIPS is a standard entitled \"Security Requirements for Cryptographic Modules\". FIPS 140-1 (1994) and FIPS 140-2 (2001) describe government requirements for hardware and software cryptographic modules used within the U.S. government.\n\n        $EncryptionLevels = @{\n            '1' = 'Low'\n            '2' = 'Medium / Client Compatible'\n            '3' = 'High'\n            '4' = 'FIPS Compliant'\n        }\n\n        $PolicyConfiguredBy = @{\n            '0' = 'Server'\n            '1' = 'Group policy'\n            '2' = 'Default'\n        }\n\n        #Qualifiers: RDPSecurityLayer (\"RDP Security Layer: Communication between the serverand the client will use native RDP encryption.\"),\n        #Negotiate (\"The most secure layer that is supported by the client will be used.If supported, TLS 1.0 will be used.\"),\n        #SSL (\"SSL (TLS 1.0) will be used for server authentication as well as forencrypting all data transferred between the server and the client.This setting requires the server to have an SSL compatible certificate.\"),\n        #NEWTBD (\"A NEW SECURITY LAYER in LONGHORN.\")\n        #Specifies the security layer used between the client and server.\n\n        $SecurityLayers = @{\n            '1' = 'RDP Security Layer' # Communication between the server and the client uses native RDP encryption.\n            '2' = 'Negotiate' # The most secure layer that is supported by the client is used. If supported, SSL (TLS 1.0) is used.\n            '3' = 'SSL' # SSL (TLS 1.0) is used for server authentication and for encrypting all data transferred between the server and the client. This setting requires the server to have an SSL-compatible certificate. This setting is not compatible with a MinEncryptionLevel value of 1.\n            '4' = 'NEWTBD' # A new security layer.\n        }\n\n        $HashType = @{\n            '0' = 'Not valid'\n            '1' = 'Self-signed'\n            '2' = 'Custom'\n        }\n\n        $Connectivity = Test-ComputerPort -ComputerName $_.PSComputerName -PortTCP 3389 -WarningAction SilentlyContinue\n\n        [PSCustomObject] @{\n            ComputerName                           = $_.PSComputerName\n            Name                                   = $_.TerminalName\n            Connectivity                           = $Connectivity.Status\n            ConnectivitySummary                    = $Connectivity.Summary\n            SecurityLayer                          = $SecurityLayers[\"$($_.SecurityLayer)\"]\n            MinimalEncryptionLevel                 = $EncryptionLevels[\"$($_.MinEncryptionLevel)\"]\n            MinimalEncryptionLevelValue            = $_.MinEncryptionLevel\n            PolicySourceUserAuthenticationRequired = $PolicyConfiguredBy[\"$($_.PolicySourceUserAuthenticationRequired)\"]\n            PolicySourceMinimalEncryptionLevel     = $PolicyConfiguredBy[\"$($_.PolicySourceMinEncryptionLevel)\"]\n            PolicySourceSecurityLayer              = $PolicyConfiguredBy[\"$($_.PolicySourceSecurityLayer)\"]\n            CertificateName                        = $_.CertificateName\n            CertificateThumbprint                  = $_.SSLCertificateSHA1Hash\n            CertificateType                        = $HashType[\"$($_.SSLCertificateSHA1HashType)\"]\n            Transport                              = $_.Transport\n            Protocol                               = $_.TerminalProtocol\n            # Specifies the type of user authentication used for remote connections\n            UserAuthenticationRequired             = [bool] $_.UserAuthenticationRequired\n            # Specifies whether the connection defaults to the standard Windows authentication process or to another authentication package that has been installed on the system.\n            WindowsAuthentication                  = [bool] $_.WindowsAuthentication\n        }\n    }\n}\n\n#\n#Get-RDPSecurity -ComputerName AD1 #, AD2\n"
  },
  {
    "path": "Public/Computers/Get-ComputerRoles.ps1",
    "content": "function Get-ComputerRoles {\n    <#\n    .SYNOPSIS\n    Get Computer/Server Roles\n\n    .DESCRIPTION\n    Get Computer/Server Roles\n\n    .PARAMETER ComputerName\n    Parameter description\n\n    .PARAMETER FeatureType\n    Display all or limited types. Choices are Role, Role Service and Feature.\n\n    .PARAMETER EnabledOnly\n    Display only enabled/installed features or roles\n\n    .PARAMETER Credential\n    Alternate credentials when querying roles/features remotely.\n\n    .EXAMPLE\n    Get-ComputerRoles -ComputerName AD1 -EnabledOnly -FeatureType Role | Format-Table\n\n    .NOTES\n    General notes\n    #>\n    [alias('Get-ServerRoles')]\n    [CmdletBinding()]\n    param (\n        [string[]] $ComputerName = $env:COMPUTERNAME,\n        [ValidateSet('Role', 'Role Service', 'Feature')] $FeatureType,\n        [switch] $EnabledOnly,\n        [pscredential] $Credential\n    )\n    if ($Global:ProgressPreference -ne 'SilentlyContinue') {\n        $TemporaryProgress = $Global:ProgressPreference\n        $Global:ProgressPreference = 'SilentlyContinue'\n    }\n    foreach ($Computer in $ComputerName) {\n        try {\n            if ($Credential) {\n                $invokeSplat = @{ ComputerName = $Computer; Credential = $Credential; ErrorAction = 'Stop' }\n                $Output = Invoke-Command @invokeSplat {\n                    Import-Module ServerManager\n                    Get-WindowsFeature\n                }\n            } else {\n                $Output = Get-WindowsFeature -ComputerName $Computer -ErrorAction Stop\n            }\n        }\n        #The request could not be processed against a server below Windows Server 2012. Use Invoke-Command and Import-Module\n        catch [System.Exception] {\n            if ($_.FullyQualifiedErrorId -like 'UnSupportedTargetDevice,*') {\n                $output = Invoke-Command -ComputerName $computer -Credential $Credential {\n                    Import-Module ServerManager\n                    Get-WindowsFeature\n                }\n            }\n        }\n        #$ | Where-Object { $_.installed -eq $true -and $_.featuretype -eq 'Role' } | Select-Object name, installed -ExcludeProperty subfeatures\n        #$Output | Select-Object Name, Installed , @{name = 'Server Name'; expression = { $Computer } }\n        foreach ($Data in $Output) {\n            if ($EnabledOnly -and $Data.Installed -eq $false) {\n                continue\n            }\n            if ($FeatureType) {\n                if ($Data.FeatureType -notin $FeatureType) {\n                    continue\n                }\n            }\n            [PSCustomObject] @{\n                ComputerName = $Computer\n                Name         = $Data.Name\n                DisplayName  = $Data.DisplayName\n                FeatureType  = $Data.FeatureType\n                Installed    = $Data.Installed\n                #MajorVersion = $Data.AdditionalInfo.MajorVersion\n                #MinorVersion = $Data.AdditionalInfo.MinorVersion\n                #InstallName  = $Data.AdditionalInfo.InstallName\n                #SubFeatures  = $Data.SubFeatures\n                Description  = $Data.Description\n            }\n        }\n    }\n    # Bring back setting as per default\n    if ($TemporaryProgress) {\n        $Global:ProgressPreference = $TemporaryProgress\n    }\n}\n"
  },
  {
    "path": "Public/Computers/Get-ComputerSMB.ps1",
    "content": "﻿function Get-ComputerSMB {\n    <#\n    .SYNOPSIS\n    Retrieves SMB server configuration details for a specified computer.\n\n    .DESCRIPTION\n    This function retrieves the SMB server configuration details for a specified computer.\n\n    .PARAMETER ComputerName\n    Specifies the name of the computer for which to retrieve SMB server configuration details.\n\n    .EXAMPLE\n    Get-ComputerSMB -ComputerName \"Server01\"\n    Retrieves the SMB server configuration details for the computer named \"Server01\".\n\n    .NOTES\n    This function requires administrative privileges to retrieve SMB server configuration details.\n    #>\n    [CmdletBinding()]\n    param(\n        [string[]] $ComputerName\n    )\n\n    [Array] $CollectionComputers = $ComputerName.Where( { $_ -eq $Env:COMPUTERNAME }, 'Split')\n    $SMB = @(\n        if ($CollectionComputers[0].Count -gt 0) {\n            $Output = Get-SmbServerConfiguration\n            foreach ($_ in $Output) {\n                [PSCustomObject] @{\n                    ComputerName                    = $Env:COMPUTERNAME\n                    AnnounceComment                 = $_.AnnounceComment\n                    AnnounceServer                  = $_.AnnounceServer\n                    AsynchronousCredits             = $_.AsynchronousCredits\n                    AuditSmb1Access                 = $_.AuditSmb1Access\n                    AutoDisconnectTimeout           = $_.AutoDisconnectTimeout\n                    AutoShareServer                 = $_.AutoShareServer\n                    AutoShareWorkstation            = $_.AutoShareWorkstation\n                    CachedOpenLimit                 = $_.CachedOpenLimit\n                    DurableHandleV2TimeoutInSeconds = $_.DurableHandleV2TimeoutInSeconds\n                    EnableAuthenticateUserSharing   = $_.EnableAuthenticateUserSharing\n                    EnableDownlevelTimewarp         = $_.EnableDownlevelTimewarp\n                    EnableForcedLogoff              = $_.EnableForcedLogoff\n                    EnableLeasing                   = $_.EnableLeasing\n                    EnableMultiChannel              = $_.EnableMultiChannel\n                    EnableOplocks                   = $_.EnableOplocks\n                    EnableSecuritySignature         = $_.EnableSecuritySignature\n                    EnableSMB1Protocol              = $_.EnableSMB1Protocol\n                    EnableSMB2Protocol              = $_.EnableSMB2Protocol\n                    EnableStrictNameChecking        = $_.EnableStrictNameChecking\n                    EncryptData                     = $_.EncryptData\n                    IrpStackSize                    = $_.IrpStackSize\n                    KeepAliveTime                   = $_.KeepAliveTime\n                    MaxChannelPerSession            = $_.MaxChannelPerSession\n                    MaxMpxCount                     = $_.MaxMpxCount\n                    MaxSessionPerConnection         = $_.MaxSessionPerConnection\n                    MaxThreadsPerQueue              = $_.MaxThreadsPerQueue\n                    MaxWorkItems                    = $_.MaxWorkItems\n                    NullSessionPipes                = $_.NullSessionPipes\n                    NullSessionShares               = $_.NullSessionShares\n                    OplockBreakWait                 = $_.OplockBreakWait\n                    PendingClientTimeoutInSeconds   = $_.PendingClientTimeoutInSeconds\n                    RejectUnencryptedAccess         = $_.RejectUnencryptedAccess\n                    RequireSecuritySignature        = $_.RequireSecuritySignature\n                    ServerHidden                    = $_.ServerHidden\n                    Smb2CreditsMax                  = $_.Smb2CreditsMax\n                    Smb2CreditsMin                  = $_.Smb2CreditsMin\n                    SmbServerNameHardeningLevel     = $_.SmbServerNameHardeningLevel\n                    TreatHostAsStableStorage        = $_.TreatHostAsStableStorage\n                    ValidateAliasNotCircular        = $_.ValidateAliasNotCircular\n                    ValidateShareScope              = $_.ValidateShareScope\n                    ValidateShareScopeNotAliased    = $_.ValidateShareScopeNotAliased\n                    ValidateTargetName              = $_.ValidateTargetName\n                }\n            }\n        }\n        if ($CollectionComputers[1].Count -gt 0) {\n            $Output = Get-SmbServerConfiguration -CimSession $CollectionComputers[1]\n            foreach ($_ in $Output) {\n                [PSCustomObject] @{\n                    ComputerName                    = $_.PSComputerName\n                    AnnounceComment                 = $_.AnnounceComment\n                    AnnounceServer                  = $_.AnnounceServer\n                    AsynchronousCredits             = $_.AsynchronousCredits\n                    AuditSmb1Access                 = $_.AuditSmb1Access\n                    AutoDisconnectTimeout           = $_.AutoDisconnectTimeout\n                    AutoShareServer                 = $_.AutoShareServer\n                    AutoShareWorkstation            = $_.AutoShareWorkstation\n                    CachedOpenLimit                 = $_.CachedOpenLimit\n                    DurableHandleV2TimeoutInSeconds = $_.DurableHandleV2TimeoutInSeconds\n                    EnableAuthenticateUserSharing   = $_.EnableAuthenticateUserSharing\n                    EnableDownlevelTimewarp         = $_.EnableDownlevelTimewarp\n                    EnableForcedLogoff              = $_.EnableForcedLogoff\n                    EnableLeasing                   = $_.EnableLeasing\n                    EnableMultiChannel              = $_.EnableMultiChannel\n                    EnableOplocks                   = $_.EnableOplocks\n                    EnableSecuritySignature         = $_.EnableSecuritySignature\n                    EnableSMB1Protocol              = $_.EnableSMB1Protocol\n                    EnableSMB2Protocol              = $_.EnableSMB2Protocol\n                    EnableStrictNameChecking        = $_.EnableStrictNameChecking\n                    EncryptData                     = $_.EncryptData\n                    IrpStackSize                    = $_.IrpStackSize\n                    KeepAliveTime                   = $_.KeepAliveTime\n                    MaxChannelPerSession            = $_.MaxChannelPerSession\n                    MaxMpxCount                     = $_.MaxMpxCount\n                    MaxSessionPerConnection         = $_.MaxSessionPerConnection\n                    MaxThreadsPerQueue              = $_.MaxThreadsPerQueue\n                    MaxWorkItems                    = $_.MaxWorkItems\n                    NullSessionPipes                = $_.NullSessionPipes\n                    NullSessionShares               = $_.NullSessionShares\n                    OplockBreakWait                 = $_.OplockBreakWait\n                    PendingClientTimeoutInSeconds   = $_.PendingClientTimeoutInSeconds\n                    RejectUnencryptedAccess         = $_.RejectUnencryptedAccess\n                    RequireSecuritySignature        = $_.RequireSecuritySignature\n                    ServerHidden                    = $_.ServerHidden\n                    Smb2CreditsMax                  = $_.Smb2CreditsMax\n                    Smb2CreditsMin                  = $_.Smb2CreditsMin\n                    SmbServerNameHardeningLevel     = $_.SmbServerNameHardeningLevel\n                    TreatHostAsStableStorage        = $_.TreatHostAsStableStorage\n                    ValidateAliasNotCircular        = $_.ValidateAliasNotCircular\n                    ValidateShareScope              = $_.ValidateShareScope\n                    ValidateShareScopeNotAliased    = $_.ValidateShareScopeNotAliased\n                    ValidateTargetName              = $_.ValidateTargetName\n                }\n            }\n        }\n    )\n    $SMB\n}"
  },
  {
    "path": "Public/Computers/Get-ComputerSMBShare.ps1",
    "content": "﻿function Get-ComputerSMBShare {\n    <#\n    .SYNOPSIS\n    Retrieves SMB shares information from specified computers.\n\n    .DESCRIPTION\n    The Get-ComputerSMBShare function retrieves SMB share information from the specified computers. It can return basic share details or detailed information based on the 'Translated' switch.\n\n    .PARAMETER ComputerName\n    Specifies the names of the computers from which to retrieve SMB share information.\n\n    .PARAMETER Translated\n    Indicates whether to return detailed translated information about the SMB shares.\n\n    .EXAMPLE\n    Get-ComputerSMBShare -ComputerName \"Server01\" -Translated\n    Retrieves detailed translated information about SMB shares from Server01.\n\n    .EXAMPLE\n    Get-ComputerSMBShare -ComputerName \"Server01\", \"Server02\"\n    Retrieves basic SMB share information from Server01 and Server02.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string[]] $ComputerName,\n        [switch] $Translated\n    )\n    [Array] $CollectionComputers = Get-ComputerSplit -ComputerName $ComputerName\n\n    if ($CollectionComputers[0].Count -gt 0) {\n        $Output = Get-SmbShare\n        foreach ($O in $Output) {\n            if (-not $Translated) {\n                Add-Member -InputObject $_ -Name 'PSComputerName' -Value $Env:COMPUTERNAME -MemberType NoteProperty -Force\n                $O\n            } else {\n                [PSCustomObject] @{\n                    Name                  = $O.Name                   #: ADMIN$\n                    ScopeName             = $O.ScopeName              #: *\n                    Path                  = $O.Path                   #: C:\\Windows\n                    Description           = $O.Description            #: Remote Admin\n                    ComputerName          = $O.PSComputerName         #: AD1\n                    PresetPathAcl         = $O.PresetPathAcl          #:\n                    ShareState            = $O.ShareState.ToString()             #: Online\n                    AvailabilityType      = $O.AvailabilityType.ToString()       #: NonClustered\n                    ShareType             = $O.ShareType.ToString()              #: FileSystemDirectory\n                    FolderEnumerationMode = $O.FolderEnumerationMode.ToString()  #: Unrestricted\n                    CachingMode           = $O.CachingMode.ToString()            #: Manual\n                    LeasingMode           = $O.LeasingMode.ToString()            #:\n                    QoSFlowScope          = $O.QoSFlowScope           #:\n                    SmbInstance           = $O.SmbInstance.ToString()            #: Default\n                    CATimeout             = $O.CATimeout              #: 0\n                    ConcurrentUserLimit   = $O.ConcurrentUserLimit    #: 0\n                    ContinuouslyAvailable = $O.ContinuouslyAvailable  #: False\n                    CurrentUsers          = $O.CurrentUsers           #: 0\n                    EncryptData           = $O.EncryptData            #: False\n                    Scoped                = $O.Scoped                 #: False\n                    SecurityDescriptor    = $O.SecurityDescriptor     #: O:SYG:SYD:(A;;GA;;;BA)(A;;GA;;;BO)(A;;GA;;;IU)\n                    ShadowCopy            = $O.ShadowCopy             #: False\n                    Special               = $O.Special                #: True\n                    Temporary             = $O.Temporary              #: False\n                    Volume                = $O.Volume                 #: \\\\?\\Volume{2014dd39-5b27-44a6-be88-1d650346016d}\\\n                }\n            }\n        }\n    }\n    if ($CollectionComputers[1].Count -gt 0) {\n        $Output = Get-SmbShare -CimSession $CollectionComputers[1]\n        foreach ($O in $Output) {\n            if (-not $Translated) {\n                $O\n            } else {\n                [PSCustomObject] @{\n                    Name                  = $O.Name                   #: ADMIN$\n                    ScopeName             = $O.ScopeName              #: *\n                    Path                  = $O.Path                   #: C:\\Windows\n                    Description           = $O.Description            #: Remote Admin\n                    ComputerName          = $O.PSComputerName         #: AD1\n                    PresetPathAcl         = $O.PresetPathAcl          #:\n                    ShareState            = $O.ShareState.ToString()             #: Online\n                    AvailabilityType      = $O.AvailabilityType.ToString()       #: NonClustered\n                    ShareType             = $O.ShareType.ToString()              #: FileSystemDirectory\n                    FolderEnumerationMode = $O.FolderEnumerationMode.ToString()  #: Unrestricted\n                    CachingMode           = $O.CachingMode.ToString()            #: Manual\n                    LeasingMode           = $O.LeasingMode #.ToString()            #:\n                    QoSFlowScope          = $O.QoSFlowScope           #:\n                    SmbInstance           = $O.SmbInstance.ToString()            #: Default\n                    CATimeout             = $O.CATimeout              #: 0\n                    ConcurrentUserLimit   = $O.ConcurrentUserLimit    #: 0\n                    ContinuouslyAvailable = $O.ContinuouslyAvailable  #: False\n                    CurrentUsers          = $O.CurrentUsers           #: 0\n                    EncryptData           = $O.EncryptData            #: False\n                    Scoped                = $O.Scoped                 #: False\n                    SecurityDescriptor    = $O.SecurityDescriptor     #: O:SYG:SYD:(A;;GA;;;BA)(A;;GA;;;BO)(A;;GA;;;IU)\n                    ShadowCopy            = $O.ShadowCopy             #: False\n                    Special               = $O.Special                #: True\n                    Temporary             = $O.Temporary              #: False\n                    Volume                = $O.Volume                 #: \\\\?\\Volume{2014dd39-5b27-44a6-be88-1d650346016d}\\\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "Public/Computers/Get-ComputerSMBShareList.ps1",
    "content": "﻿\nfunction Get-ComputerSMBShareList {\n    <#\n    .SYNOPSIS\n    Enumerate shares on a remote or local host and returns the name, type, and special remark for those shares.\n\n    .DESCRIPTION\n    Enumerate shares on a remote or local host and returns the name, type, and special remark for those shares.\n    Doesnt return the permissions on the share, or logging to given computer\n    Similar to 'net view /All \\\\ComputerName'\n\n    .PARAMETER ComputerName\n    The host to enumerate the shares for. Can be accepted as pipeline input by value.\n\n    .PARAMETER Name\n    The name of the share to filter on. Can be accepted as pipeline input by value.\n\n    .OUTPUTS\n    [PSCustomObject]@{\n        ComputerName = [String]'The computer the share relates to'\n        Name = [String]'The name of the share'\n        Path = [string]'\\\\ComputerName\\Name\\'\n        Type = [Win32Share.ShareType] An flag enum of the share properties, can be\n            Disk = Disk drive share\n            PrintQueue = Print queue share\n            CommunicationDevice = Communication device share\n            Ipc = Interprocess communication share\n            Temporary = A temporary share\n            Special = Typically a special/admin share like IPC$, C$, ADMIN$\n        Remark = [String]'More info on the share'\n        TotalBytes = [System.Nullable[int]]\n        TotalFreeBytes = [System.Nullable[int]]\n        FreeBytesAvailableToUser = [System.Nullable[int]]\n    }\n    .LINK\n    https://gist.github.com/jborean93/017d3d890ae8d33276a08d3f5cc7eb45\n\n    .EXAMPLE\n    Get-ComputerSMBShareList -ComputerName some-host\n\n    .EXAMPLE\n    Get-ComputerSMBShareList -ComputerName \"DC1\" | ft -AutoSize\n\n    .NOTES\n    Original author: Jordan Borean (@jborean93)\n\n    Modified by: Matt Cargile (@mattcargile)\n    Modified by: Przemyslaw Klys\n\n    #>\n    [CmdletBinding(DefaultParameterSetName = 'ComputerName')]\n    param (\n        [Parameter(Mandatory, ParameterSetName = 'ComputerName', Position = 0)]\n        [string[]] $ComputerName,\n\n        [Parameter(ValueFromPipeline, ParameterSetName = 'Pipeline')]\n\n        [string] $InputObject,\n        [Parameter(ParameterSetName = 'ComputerName', Position = 1)]\n        [Parameter(ParameterSetName = 'Pipeline')]\n        [SupportsWildcards()][Alias('ShareName')][string[]] $Name,\n\n        [switch] $SkipDiskSpace\n    )\n\n    begin {\n        <#Check if loaded to make dot-source testing easier#>\n        if (-not ('Win32Share.NativeMethods' -as [type])) {\n            Add-Type -ErrorAction 'Stop' -TypeDefinition @'\nusing System;\nusing System.Runtime.InteropServices;\nnamespace Win32Share\n{\n    public class NativeHelpers\n    {\n        [StructLayout(LayoutKind.Sequential)]\n        public struct SHARE_INFO_1\n        {\n            [MarshalAs(UnmanagedType.LPWStr)] public string shi1_netname;\n            public ShareType shi1_type;\n            [MarshalAs(UnmanagedType.LPWStr)] public string shi1_remark;\n        }\n    }\n    public class NativeMethods\n    {\n        [DllImport(\"Netapi32.dll\")]\n        public static extern UInt32 NetApiBufferFree(\n            IntPtr Buffer);\n        [DllImport(\"Netapi32.dll\", CharSet = CharSet.Unicode, SetLastError = true)]\n        public static extern Int32 NetShareEnum(\n            string servername,\n            UInt32 level,\n            ref IntPtr bufptr,\n            UInt32 prefmaxlen,\n            ref UInt32 entriesread,\n            ref UInt32 totalentries,\n            ref UInt32 resume_handle);\n        [DllImport(\"Kernel32.dll\", CharSet = CharSet.Unicode, SetLastError = true)]\n        public static extern bool GetDiskFreeSpaceEx(\n            string lpDirectoryName,\n            ref UInt64 lpFreeBytesAvailableToCaller,\n            ref UInt64 lptotalNumberOfBytes,\n            ref UInt64 lpTotalNumberOfFreeBytes\n        );\n    }\n    [Flags]\n    public enum ShareType : uint\n    {\n        Disk = 0,\n        PrintQueue = 1,\n        CommunicationDevice = 2,\n        Ipc = 3,\n        Temporary = 0x40000000,\n        Special = 0x80000000,\n    }\n}\n'@\n        }\n        # $PSBoundParameters['PSC'] = $PSCmdlet\n\n\n    }\n\n    process {\n        # if ($InputObject) {\n        #     $PSBoundParameters['ComputerName'] = $InputObject\n        #     $null = $PSBoundParameters.Remove( 'InputObject')\n        #     Get-ComputerSMBInfo @PSBoundParameters\n        # }\n        foreach ($compNm in $ComputerName) {\n            Write-Verbose -Message \"Get-ComputerSMBShareList - Enumerating shares on '$compNm'\"\n            $PSBoundParameters['ComputerName'] = $compNm\n            Get-ComputerSMBInfo @PSBoundParameters\n        }\n    }\n}"
  },
  {
    "path": "Public/Computers/Get-ComputerSMBSharePermissions.ps1",
    "content": "﻿function Get-ComputerSMBSharePermissions {\n    <#\n    .SYNOPSIS\n    Retrieves SMB share permissions for specified computers and shares.\n\n    .DESCRIPTION\n    This function retrieves SMB share permissions for the specified computers and shares. It provides the option to translate the permissions into a more readable format.\n\n    .PARAMETER ComputerName\n    Specifies the names of the computers to retrieve SMB share permissions from.\n\n    .PARAMETER ShareName\n    Specifies the names of the shares to retrieve permissions for.\n\n    .PARAMETER Translated\n    Indicates whether to translate the permissions into a more readable format.\n\n    .EXAMPLE\n    Get-ComputerSMBSharePermissions -ComputerName \"Server1\" -ShareName \"Share1\" -Translated\n    Retrieves SMB share permissions for Server1 and Share1 in a translated format.\n\n    .EXAMPLE\n    Get-ComputerSMBSharePermissions -ComputerName \"Server1\", \"Server2\" -ShareName \"Share1\", \"Share2\"\n    Retrieves SMB share permissions for multiple servers and shares.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string[]] $ComputerName,\n        [Parameter(Mandatory = $true)][alias('Name')][string[]] $ShareName,\n        [switch] $Translated\n    )\n    [Array] $Computers = Get-ComputerSplit -ComputerName $ComputerName\n    if ($Computers[0].Count -gt 0) {\n        foreach ($Share in $ShareName) {\n            try {\n                $Output = Get-SmbShareAccess -Name $Share -ErrorAction Stop\n            } catch {\n                $ErrorMessage = $_.Exception.Message\n                Write-Warning -Message \"Get-ComputerSMBSharePermissions - Computer $Env:COMPUTERNAME, Share $Share, Error: $ErrorMessage\"\n            }\n            foreach ($O in $Output) {\n                if (-not $Translated) {\n                    $O | Add-Member -Name 'PSComputerName' -Value $Env:COMPUTERNAME -MemberType NoteProperty -Force\n                    $O\n                } else {\n                    $Identity = Convert-Identity -Identity $O.AccountName\n                    [PSCustomObject] @{\n                        Name              = $O.Name              #: NETLOGON\n                        ScopeName         = $O.ScopeName         #: *\n                        AccountName       = $Identity.Name\n                        AccountDomain     = $Identity.Domain\n                        AccountSID        = $Identity.SID\n                        AccountType       = $Identity.Type\n                        AccountError      = $Identity.Error\n                        AccessControlType = $O.AccessControlType.ToString() #: Allow\n                        AccessRight       = $O.AccessRight.ToString()       #: Read\n                        ComputerName      = $Env:COMPUTERNAME    #: AD2.AD.EVOTEC.XYZ\n                    }\n                }\n            }\n        }\n    }\n    if ($Computers[1].Count -gt 0) {\n        foreach ($Share in $ShareName) {\n            try {\n                $Output = Get-SmbShareAccess -CimSession $Computers[1] -Name $Share -ErrorAction Stop\n            } catch {\n                $ErrorMessage = $_.Exception.Message\n                Write-Warning -Message \"Get-ComputerSMBSharePermissions - Computer $($Computers[1]), Share $Share, Error: $ErrorMessage\"\n            }\n            foreach ($O in $Output) {\n                if (-not $Translated) {\n                    $O\n                } else {\n                    $Identity = Convert-Identity -Identity $O.AccountName\n                    [PSCustomObject] @{\n                        Name              = $O.Name              #: NETLOGON\n                        ScopeName         = $O.ScopeName         #: *\n                        AccountName       = $Identity.Name\n                        AccountDomain     = $Identity.Domain\n                        AccountSID        = $Identity.SID\n                        AccountType       = $Identity.Type\n                        AccountError      = $Identity.Error\n                        AccessControlType = $O.AccessControlType.ToString() #: Allow\n                        AccessRight       = $O.AccessRight.ToString()       #: Read\n                        ComputerName      = $O.PSComputerName    #: AD2.AD.EVOTEC.XYZ\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "Public/Computers/Get-ComputerServices.ps1",
    "content": "function Get-ComputerService {\n    <#\n    .SYNOPSIS\n    Retrieves information about services running on specified computers.\n\n    .DESCRIPTION\n    This function retrieves information about services running on one or more specified computers. It returns details such as ComputerName, Name, Displayname, Status, and StartType of the services.\n\n    .PARAMETER ComputerName\n    Computer(s) to query for services. Defaults to local computer.\n\n    .PARAMETER Credential\n    Alternate credentials for remote service queries. Default is current user.\n\n    .EXAMPLE\n    Get-ComputerServices -ComputerName \"Computer01\"\n    Retrieves information about services running on a single computer named \"Computer01\".\n\n    .EXAMPLE\n    Get-ComputerServices -ComputerName \"Computer01\", \"Computer02\"\n    Retrieves information about services running on multiple computers named \"Computer01\" and \"Computer02\".\n\n    #>\n    [alias('Get-ComputerServices')]\n    [CmdletBinding()]\n    param(\n        [string[]] $ComputerName = $Env:COMPUTERNAME,\n        [pscredential] $Credential\n    )\n    Process {\n        foreach ($Computer in $ComputerName) {\n            $Services = Get-PSService -ComputerName $Computer -Credential $Credential | Select-Object ComputerName, Name, Displayname, Status, StartType\n            $Services\n        }\n    }\n}\n"
  },
  {
    "path": "Public/Computers/Get-ComputerStartup.ps1",
    "content": "function Get-ComputerStartup {\n    <#\n    .SYNOPSIS\n    Retrieves information about startup programs on a remote computer.\n\n    .DESCRIPTION\n    The Get-ComputerStartup function retrieves information about startup programs on a specified computer using CIM/WMI.\n\n    .PARAMETER ComputerName\n    Specifies the name of the computer to retrieve startup information from. Defaults to the local computer.\n\n    .PARAMETER Protocol\n    Specifies the protocol to use for the connection. Valid values are 'Default', 'Dcom', or 'Wsman'. Default is 'Default'.\n\n    .PARAMETER Credential\n    Alternate credentials for CIM queries. Default is current user.\n\n    .PARAMETER All\n    Indicates whether to retrieve all properties of the startup programs.\n\n    .EXAMPLE\n    Get-ComputerStartup -ComputerName \"RemoteComputer\" -Protocol Wsman\n    Retrieves startup program information from a remote computer using the Wsman protocol.\n\n    .EXAMPLE\n    Get-ComputerStartup -All\n    Retrieves all startup program information from the local computer.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string[]] $ComputerName = $Env:COMPUTERNAME,\n        [ValidateSet('Default', 'Dcom', 'Wsman')][string] $Protocol = 'Default',\n        [pscredential] $Credential,\n        [switch] $All\n    )\n    [string] $Class = 'win32_startupCommand'\n    if ($All) {\n        [string] $Properties = '*'\n    } else {\n        [string[]] $Properties = 'Caption', 'Description', 'Command', 'Location', 'Name', 'User', 'UserSID', 'PSComputerName' #, 'SettingID'\n    }\n    $Information = Get-CimData -ComputerName $ComputerName -Protocol $Protocol -Credential $Credential -Class $Class -Properties $Properties\n    if ($All) {\n        $Information\n    } else {\n        foreach ($Info in $Information) {\n            foreach ($Data in $Info) {\n                # # Remember to expand if changing properties above\n                [PSCustomObject] @{\n                    ComputerName = if ($Data.PSComputerName) { $Data.PSComputerName } else { $Env:COMPUTERNAME }\n                    Caption      = $Data.Caption\n                    Description  = $Data.Description\n                    #SettingID    = $Data.SettingID\n                    Command      = $Data.Command\n                    Location     = $Data.Location\n                    Name         = $Data.Name\n                    User         = $Data.User\n                    UserSID      = $Data.UserSID\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Public/Computers/Get-ComputerSystem.ps1",
    "content": "function Get-ComputerSystem {\n    <#\n    .SYNOPSIS\n    Retrieves computer system information from remote computers.\n\n    .DESCRIPTION\n    This function retrieves computer system information from remote computers using CIM/WMI queries.\n\n    .PARAMETER ComputerName\n    Specifies the names of the remote computers to retrieve system information from.\n\n    .PARAMETER Protocol\n    Specifies the protocol to use for the remote connection. Valid values are 'Default', 'Dcom', or 'Wsman'.\n\n    .PARAMETER Credential\n    Alternate credentials for CIM queries. Default is current user.\n\n    .PARAMETER All\n    Indicates whether to retrieve all available properties of the computer system.\n\n    .EXAMPLE\n    Get-ComputerSystem -ComputerName AD1, AD2, EVO1, ADFFS | ft -a *\n\n    Retrieves computer system information for the specified computers and displays it in a table format.\n\n    .NOTES\n    This function uses CIM/WMI queries to gather system information from remote computers.\n    #>\n    [CmdletBinding()]\n    param(\n        [string[]] $ComputerName = $Env:COMPUTERNAME,\n        [ValidateSet('Default', 'Dcom', 'Wsman')][string] $Protocol = 'Default',\n        [pscredential] $Credential,\n        [switch] $All\n    )\n    [string] $Class = 'Win32_ComputerSystem'\n    if ($All) {\n        $Properties = '*'\n    } else {\n        $Properties = 'PSComputerName', 'Name', 'Manufacturer' , 'Domain', 'Model' , 'Systemtype', 'PrimaryOwnerName', 'PCSystemType', 'PartOfDomain', 'CurrentTimeZone', 'BootupState', 'Roles', 'SystemFamily'\n    }\n    $Information = Get-CimData -ComputerName $ComputerName -Protocol $Protocol -Credential $Credential -Class $Class -Properties $Properties\n    if ($All) {\n        $Information\n    } else {\n        foreach ($Info in $Information) {\n            foreach ($Data in $Info) {\n                # # Remember to expand if changing properties above\n                [PSCustomObject] @{\n                    ComputerName     = if ($Data.PSComputerName) { $Data.PSComputerName } else { $Env:COMPUTERNAME }\n                    Name             = $Data.Name\n                    Manufacturer     = $Data.Manufacturer\n                    Domain           = $Data.Domain\n                    Model            = $Data.Model\n                    Systemtype       = $Data.Systemtype\n                    PrimaryOwnerName = $Data.PrimaryOwnerName\n                    PCSystemType     = [Microsoft.PowerShell.Commands.PCSystemType] $Data.PCSystemType\n                    PartOfDomain     = $Data.PartOfDomain\n                    CurrentTimeZone  = $Data.CurrentTimeZone\n                    BootupState      = $Data.BootupState\n                    SystemFamily     = $Data.SystemFamily\n                    Roles            = $Data.Roles -join ', '\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Public/Computers/Get-ComputerTask.ps1",
    "content": "﻿function Get-ComputerTask {\n    <#\n    .SYNOPSIS\n    Get Task Schedule information\n\n    .DESCRIPTION\n    Get Task Schedule information\n\n    .PARAMETER ComputerName\n    Specifies computer on which you want to run the operation.\n\n    .PARAMETER Credential\n    Alternate credentials for creating a CIM session when querying scheduled tasks remotely.\n\n    .EXAMPLE\n    Get-ComputerTask | Format-Table\n\n    .NOTES\n    General notes\n    #>\n    [alias('Get-ComputerTasks')]\n    [cmdletbinding()]\n    param(\n        [string[]] $ComputerName = $Env:COMPUTERNAME,\n        [pscredential] $Credential\n    )\n    foreach ($Computer in $ComputerName) {\n        # Querying CIM locally usually doesn't work. This means if you're querying same computer you neeed to skip CimSession/ComputerName if it's local query\n        try {\n            $LocalComputerDNSName = [System.Net.Dns]::GetHostByName($Env:COMPUTERNAME).HostName\n        } catch {\n            $LocalComputerDNSName = $Computer\n        }\n\n        if ($Computer -eq $Env:COMPUTERNAME -or $Computer -eq $LocalComputerDNSName) {\n            $TaskParameters = @{}\n            $cimSession = $null\n        } else {\n            $sessionParams = @{ ComputerName = $Computer }\n            if ($Credential) { $sessionParams['Credential'] = $Credential }\n            try {\n                $cimSession = New-CimSession @sessionParams\n            } catch {\n                Write-Warning \"Get-ComputerTask - Unable to create CimSession for $Computer. $_\"\n                continue\n            }\n            $TaskParameters = @{ CimSession = $cimSession }\n        }\n        # Full code\n\n        $Tasks = Get-ScheduledTask @TaskParameters\n        foreach ($Task in $Tasks) {\n            $Info = $Task | Get-ScheduledTaskInfo @TaskParameters\n\n            $Actions = foreach ($_ in $Task.Actions) {\n                -join ($_.Execute, $_.Arguments)\n            }\n\n            [PSCustomObject] @{\n                ComputerName                            = $Computer\n                TaskName                                = $Task.TaskName\n                TaskPath                                = $Task.TaskPath\n                State                                   = $Task.State\n                Actions                                 = $Actions\n                Author                                  = $Task.Author\n                Date                                    = $Task.Date\n                Description                             = $Task.Description\n                Documentation                           = $Task.Documentation\n                PrincipalDisplayName                    = $Task.Principal.DisplayName\n\t\t\t\tPrincipalUserID                        \t= $Task.Principal.UserID\n                PrincipalGroupID                        = $Task.Principal.GroupID\n                PrincipalLogonType                      = $Task.Principal.LogonType\n                PrincipalRunLevel                       = $Task.Principal.RunLevel\n                PrincipalProcessTokenSidType            = $Task.Principal.ProcessTokenSidType\n                PrincipalRequiredPrivilege              = $Task.Principal.RequiredPrivilege\n\n                #SecurityDescriptor                      = $Task.SecurityDescriptor #  | ConvertFrom-SddlString\n                #Settings                                = $Task.Settings\n                SettingsAllowDemandStart                = $Task.Settings.AllowDemandStart\n                SettingsAllowHardTerminate              = $Task.Settings.AllowHardTerminate\n                SettingsCompatibility                   = $Task.Settings.Compatibility\n                SettingsDeleteExpiredTaskAfter          = $Task.Settings.DeleteExpiredTaskAfter\n                SettingsDisallowStartIfOnBatteries      = $Task.Settings.DisallowStartIfOnBatteries\n                SettingsEnabled                         = $Task.Settings.Enabled\n                SettingsExecutionTimeLimit              = $Task.Settings.ExecutionTimeLimit\n                SettingsHidden                          = $Task.Settings.Hidden\n                SettingsIdleSettings                    = $Task.Settings.IdleSettings\n                SettingsMultipleInstances               = $Task.Settings.MultipleInstances\n                SettingsNetworkSettings                 = $Task.Settings.NetworkSettings\n                SettingsPriority                        = $Task.Settings.Priority\n                SettingsRestartCount                    = $Task.Settings.RestartCount\n                SettingsRestartInterval                 = $Task.Settings.RestartInterval\n                SettingsRunOnlyIfIdle                   = $Task.Settings.RunOnlyIfIdle\n                SettingsRunOnlyIfNetworkAvailable       = $Task.Settings.RunOnlyIfNetworkAvailable\n                SettingsStartWhenAvailable              = $Task.Settings.StartWhenAvailable\n                SettingsStopIfGoingOnBatteries          = $Task.Settings.StopIfGoingOnBatteries\n                SettingsWakeToRun                       = $Task.Settings.WakeToRun\n                SettingsDisallowStartOnRemoteAppSession = $Task.Settings.DisallowStartOnRemoteAppSession\n                SettingsUseUnifiedSchedulingEngine      = $Task.Settings.UseUnifiedSchedulingEngine\n                SettingsMaintenanceSettings             = $Task.Settings.MaintenanceSettings\n                SettingsVolatile                        = $Task.Settings.volatile\n                Source                                  = $Task.Source\n                #Triggers                = $Task.Triggers\n                URI                                     = $Task.URI\n                Version                                 = $Task.Version\n                LastRunTime                             = $Info.LastRunTime\n                LastTaskResult                          = $Info.LastTaskResult\n                NextRunTime                             = $Info.NextRunTime\n                NumberOfMissedRuns                      = $Info.NumberOfMissedRuns\n            }\n        }\n        if ($cimSession) { $cimSession | Remove-CimSession }\n    }\n}\n\n#$Tasks = Get-ComputerTasks -ComputerName $Env:COMPUTERNAME #| Format-Table -AutoSize\n#$Tasks.SecurityDescriptor | ConvertFrom-SddlString\n"
  },
  {
    "path": "Public/Computers/Get-ComputerTime.ps1",
    "content": "﻿function Get-ComputerTime {\n    <#\n    .SYNOPSIS\n    Gets time difference between computers and time source including boot time\n\n    .DESCRIPTION\n    Gets time difference between computers and time source including boot time\n\n    .PARAMETER TimeSource\n    Parameter description\n\n    .PARAMETER Domain\n    Parameter description\n\n    .PARAMETER TimeTarget\n    Specifies computer on which you want to run the CIM operation. You can specify a fully qualified domain name (FQDN), a NetBIOS name, or an IP address. If you do not specify this parameter, the cmdlet performs the operation on the local computer using Component Object Model (COM).\n\n    .PARAMETER Credential\n    Alternate credentials for both AD discovery and CIM queries. Default is current user.\n\n    .PARAMETER ForceCIM\n\n    .PARAMETER ToLocal\n\n    .EXAMPLE\n    Get-ComputerTime -TimeTarget AD2, AD3, EVOWin | Format-Table -AutoSize\n\n\n    Output\n\n    Name   LocalDateTime       RemoteDateTime      InstallTime         LastBootUpTime      TimeDifferenceMinutes TimeDifferenceSeconds TimeDifferenceMilliseconds TimeSourceName\n    ----   -------------       --------------      -----------         --------------      --------------------- --------------------- -------------------------- --------------\n    AD2    13.08.2019 23:40:26 13.08.2019 23:40:26 30.05.2018 18:30:48 09.08.2019 18:40:31  8,33333333333333E-05                 0,005                          5 AD1.ad.evotec.xyz\n    AD3    13.08.2019 23:40:26 13.08.2019 17:40:26 26.05.2019 17:30:17 09.08.2019 18:40:30  0,000266666666666667                 0,016                         16 AD1.ad.evotec.xyz\n    EVOWin 13.08.2019 23:40:26 13.08.2019 23:40:26 24.05.2019 22:46:45 09.08.2019 18:40:06  6,66666666666667E-05                 0,004                          4 AD1.ad.evotec.xyz\n\n    .EXAMPLE\n    Get-ComputerTime -TimeSource AD1 -TimeTarget AD2, AD3, EVOWin | Format-Table -AutoSize\n\n    .EXAMPLE\n    Get-ComputerTime -TimeSource 'pool.ntp.org' -TimeTarget AD2, AD3, EVOWin | Format-Table -AutoSize\n\n    .NOTES\n    General notes\n    #>\n\n    [CmdletBinding()]\n    param(\n        [string] $TimeSource,\n        [string] $Domain = $Env:USERDNSDOMAIN,\n        [alias('ComputerName')][string[]] $TimeTarget = $ENV:COMPUTERNAME,\n        [pscredential] $Credential,\n        [switch] $ForceCIM\n    )\n    if (-not $TimeSource) {\n        $discoverParams = @{ DomainName = $Domain; Service = 'PrimaryDC'; Discover = $true }\n        if ($Credential) { $discoverParams['Credential'] = $Credential }\n        $TimeSource = (Get-ADDomainController @discoverParams).HostName\n    }\n\n    if ($ForceCIM) {\n        $TimeSourceInformation = Get-CimData -ComputerName $TimeSource -Class 'win32_operatingsystem' -Credential $Credential\n        if ($TimeSourceInformation.LocalDateTime) {\n            $TimeSourceInformation = $TimeSourceInformation.LocalDateTime\n        } else {\n            $TimeSourceInformation = $null\n        }\n    } else {\n        $TimeSourceInformation = Get-ComputerTimeNtp -Server $TimeSource -ToLocal\n    }\n\n    $TimeTargetInformationCache = @{ }\n    $TimeTargetInformation = Get-CimData -ComputerName $TimeTarget -Class 'win32_operatingsystem' -Credential $Credential\n    foreach ($_ in $TimeTargetInformation) {\n        $TimeTargetInformationCache[$_.PSComputerName] = $_\n    }\n    $TimeLocalCache = @{ }\n    $TimeLocal = Get-CimData -ComputerName $TimeTarget -Class 'Win32_LocalTime' -Credential $Credential\n    foreach ($_ in $TimeLocal) {\n        $TimeLocalCache[$_.PSComputerName] = $_\n    }\n\n    $AllResults = foreach ($Computer in $TimeTarget) {\n        $WMIComputerTime = $TimeLocalCache[$Computer]\n        $WMIComputerTarget = $TimeTargetInformationCache[$Computer]\n\n        if ($WMIComputerTime -and $WMIComputerTime.Year -and $WMIComputerTime.Month) {\n            $RemoteDateTime = Get-Date -Year $WMIComputerTime.Year -Month $WMIComputerTime.Month -Day $WMIComputerTime.Day -Hour $WMIComputerTime.Hour -Minute $WMIComputerTime.Minute -Second $WMIComputerTime.Second\n        } else {\n            $RemoteDateTIme = ''\n        }\n\n        if ($WMIComputerTarget.LocalDateTime -and $TimeSourceInformation) {\n            $Result = New-TimeSpan -Start $TimeSourceInformation -End $WMIComputerTarget.LocalDateTime\n            $ResultFromBoot = New-TimeSpan -Start $WMIComputerTarget.LastBootUpTime -End $WMIComputerTarget.LocalDateTime\n\n            [PSCustomObject] @{\n                Name                       = $Computer\n                LocalDateTime              = $WMIComputerTarget.LocalDateTime\n                RemoteDateTime             = $RemoteDateTime\n                InstallTime                = $WMIComputerTarget.InstallDate\n                LastBootUpTime             = $WMIComputerTarget.LastBootUpTime\n                LastBootUpTimeInDays       = if ($null -ne $ResultFromBoot.TotalDays) { [math]::Round($ResultFromBoot.TotalDays, 2) } else { $null }\n                TimeDifferenceMinutes      = if ($Result.TotalMinutes -lt 0) { ($Result.TotalMinutes * -1) } else { $Result.TotalMinutes }\n                TimeDifferenceSeconds      = if ($Result.TotalSeconds -lt 0) { ($Result.TotalSeconds * -1) } else { $Result.TotalSeconds }\n                TimeDifferenceMilliseconds = if ($Result.TotalMilliseconds -lt 0) { ($Result.TotalMilliseconds * -1) } else { $Result.TotalMilliseconds }\n                TimeSourceName             = $TimeSource\n                Status                     = ''\n            }\n        } else {\n            if ($WMIComputerTarget.LastBootUpTime) {\n                $ResultFromBoot = New-TimeSpan -Start $WMIComputerTarget.LastBootUpTime -End $WMIComputerTarget.LocalDateTime\n            } else {\n                $ResultFromBoot = $null\n            }\n            [PSCustomObject] @{\n                Name                       = $Computer\n                LocalDateTime              = $WMIComputerTarget.LocalDateTime\n                RemoteDateTime             = $RemoteDateTime\n                InstallTime                = $WMIComputerTarget.InstallDate\n                LastBootUpTime             = $WMIComputerTarget.LastBootUpTime\n                LastBootUpTimeInDays       = if ($ResultFromBoot) { [math]::Round($ResultFromBoot.TotalDays, 2) } else { $null }\n                TimeDifferenceMinutes      = $null\n                TimeDifferenceSeconds      = $null\n                TimeDifferenceMilliseconds = $null\n                TimeSourceName             = $TimeSource\n                Status                     = 'Unable to get time difference.'\n            }\n        }\n    }\n    $AllResults\n}\n"
  },
  {
    "path": "Public/Computers/Get-ComputerTimeNtp.ps1",
    "content": "﻿function Get-ComputerTimeNtp {\n    <#\n    .Synopsis\n    Gets (Simple) Network Time Protocol time (SNTP/NTP, rfc-1305, rfc-2030) from a specified server\n\n    .DESCRIPTION\n    This function connects to an NTP server on UDP port 123 and retrieves the current NTP time.\n    Selected components of the returned time information are decoded and returned in a PSObject.\n\n    .PARAMETER Server\n    The NTP Server to contact.  Uses pool.ntp.org by default.\n\n    .EXAMPLE\n    Get-NtpTime uk.pool.ntp.org\n    Gets time from the specified server.\n\n    .EXAMPLE\n    Get-NtpTime | fl *\n    Get time from default server (pool.ntp.org) and displays all output object attributes.\n\n    .FUNCTIONALITY\n    Gets NTP time from a specified server.\n\n    .NOTES\n    Author https://github.com/ChrisWarwick/PowerShell-NTP-Time\n    Slightly simplified for different usage scenarios\n    #>\n    [CmdletBinding()]\n    Param (\n        [String]$Server = 'pool.ntp.org',\n        [switch]$ToLocal\n    )\n    # NTP Times are all UTC and are relative to midnight on 1/1/1900\n    $StartOfEpoch = New-Object DateTime(1900, 1, 1, 0, 0, 0, [DateTimeKind]::Utc)\n\n    # Construct a 48-byte client NTP time packet to send to the specified server\n    # (Request Header: [00=No Leap Warning; 011=Version 3; 011=Client Mode]; 00011011 = 0x1B)\n\n    [Byte[]]$NtpData = , 0 * 48\n    $NtpData[0] = 0x1B    # NTP Request header in first byte\n\n    $Socket = [Net.Sockets.Socket]::new([Net.Sockets.AddressFamily]::InterNetwork, [Net.Sockets.SocketType]::Dgram, [Net.Sockets.ProtocolType]::Udp)\n    $Socket.SendTimeOut = 2000  # ms\n    $Socket.ReceiveTimeOut = 2000   # ms\n\n    Try {\n        $Socket.Connect($Server, 123)\n    } Catch {\n        $_.Error\n        Write-Warning \"Get-ComputerTimeNtp - Failed to connect to server $Server\"\n        return\n    }\n\n\n    # NTP Transaction -------------------------------------------------------\n\n    $t1 = Get-Date    # t1, Start time of transaction...\n\n    Try {\n        [Void]$Socket.Send($NtpData)\n        [Void]$Socket.Receive($NtpData)\n    } Catch {\n        Write-Warning \"Get-ComputerTimeNtp - Failed to communicate with server $Server\"\n        return\n    }\n\n    $t4 = Get-Date    # End of NTP transaction time\n\n    # End of NTP Transaction ------------------------------------------------\n\n    $Socket.Shutdown(\"Both\")\n    $Socket.Close()\n\n    $LI = ($NtpData[0] -band 0xC0) -shr 6    # Leap Second indicator\n    If ($LI -eq 3) {\n        Write-Warning 'Get-ComputerTimeNtp - Alarm condition from server (clock not synchronized)'\n        return\n    }\n\n\n    # Convert Integer and Fractional parts of the (64-bit) t3 NTP time from the byte array\n    $IntPart = [BitConverter]::ToUInt32($NtpData[43..40], 0)\n    $FracPart = [BitConverter]::ToUInt32($NtpData[47..44], 0)\n\n    # Convert to Millseconds (convert fractional part by dividing value by 2^32)\n    $t3ms = $IntPart * 1000 + ($FracPart * 1000 / 0x100000000)\n\n    # Perform the same calculations for t2 (in bytes [32..39])\n    $IntPart = [BitConverter]::ToUInt32($NtpData[35..32], 0)\n    $FracPart = [BitConverter]::ToUInt32($NtpData[39..36], 0)\n    $t2ms = $IntPart * 1000 + ($FracPart * 1000 / 0x100000000)\n\n    # Calculate values for t1 and t4 as milliseconds since 1/1/1900 (NTP format)\n    $t1ms = ([TimeZoneInfo]::ConvertTimeToUtc($t1) - $StartOfEpoch).TotalMilliseconds\n    $t4ms = ([TimeZoneInfo]::ConvertTimeToUtc($t4) - $StartOfEpoch).TotalMilliseconds\n\n    # Calculate the NTP Offset and Delay values\n    $Offset = (($t2ms - $t1ms) + ($t3ms - $t4ms)) / 2\n    #$Delay = ($t4ms - $t1ms) - ($t3ms - $t2ms)\n\n    [DateTime] $NTPDateTime = $StartOfEpoch.AddMilliseconds($t4ms + $Offset)\n\n    if ($ToLocal) {\n        $NTPDateTime.ToLocalTime()\n    } else {\n        $NTPDateTime\n    }\n}"
  },
  {
    "path": "Public/Computers/Get-ComputerWindowsFeatures.ps1",
    "content": "function Get-ComputerWindowsFeatures {\n    <#\n    .SYNOPSIS\n    Get Windows Features status on one or more computers/servers\n\n    .DESCRIPTION\n    Get Windows Features status on one or more computers/servers\n\n    .PARAMETER ComputerName\n    ComputerName to provide when executing query remotly. By default current computer name is used.\n\n    .PARAMETER Protocol\n    Protocol to use when gathering data. Choices are Default, Dcom, WSMan\n\n    .PARAMETER Credential\n    Alternate credentials for CIM queries. Default is current user.\n\n    .PARAMETER EnabledOnly\n    Returns only data if Windows Feature is enabled\n\n    .PARAMETER All\n    Gets all properties without any preprocessing\n\n    .EXAMPLE\n    Get-ComputerWindowsFeatures -EnabledOnly | Format-Table\n\n    .NOTES\n    General notes\n    #>\n    [CmdletBinding()]\n    param(\n        [string] $ComputerName = $Env:COMPUTERNAME,\n        [ValidateSet('Default', 'Dcom', 'Wsman')][string] $Protocol = 'Default',\n        [pscredential] $Credential,\n        [switch] $EnabledOnly,\n        [switch] $All\n    )\n    [string] $Class = 'Win32_OptionalFeature'\n    if ($All) {\n        [string] $Properties = '*'\n    } else {\n        [string[]] $Properties = 'Name', 'Caption' , 'Status', 'InstallState', 'InstallDate', 'PSComputerName'\n    }\n\n    $State = @{\n        '1' = 'Enabled'\n        '2' = 'Disabled'\n        '3' = 'Absent'\n        '4' = 'Unknown'\n    }\n    $Information = Get-CimData -ComputerName $ComputerName -Protocol $Protocol -Credential $Credential -Class $Class -Properties $Properties\n    if ($All) {\n        $Information\n    } else {\n        foreach ($Info in $Information) {\n            foreach ($Data in $Info) {\n                # # Remember to expand if changing properties above\n                $InstallState = $State[\"$($Data.InstallState)\"]\n                if ($EnabledOnly -and $InstallState -ne 'Enabled') {\n                    continue\n                }\n                [PSCustomObject] @{\n                    ComputerName = if ($Data.PSComputerName) { $Data.PSComputerName } else { $Env:COMPUTERNAME }\n                    Name         = $Data.Name\n                    Caption      = $Data.Caption\n                    InstallState = $InstallState\n                    #InstallDate  = $Data.InstallDate\n                    #Status       = $Data.Status\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Public/Computers/Get-ComputerWindowsUpdates.ps1",
    "content": "function Get-ComputerWindowsUpdates {\n    <#\n    .SYNOPSIS\n    Retrieves information about Windows updates installed on specified computers.\n\n    .DESCRIPTION\n    This function retrieves details about Windows updates installed on one or more computers specified by the ComputerName parameter.\n\n    .PARAMETER ComputerName\n    Specifies the name of the computer(s) to retrieve Windows update information for.\n\n    .PARAMETER Credential\n    Alternate credentials for invoking Get-HotFix on remote hosts.\n\n    .EXAMPLE\n    Get-ComputerWindowsUpdates -ComputerName \"EVOWIN\", \"AD1\"\n    Retrieves Windows update information for computers named \"EVOWIN\" and \"AD1\".\n\n    .NOTES\n    This function uses the Get-HotFix cmdlet to gather information about Windows updates.\n    #>\n    [CmdletBinding()]\n    param(\n        [string[]] $ComputerName = $Env:COMPUTERNAME,\n        [pscredential] $Credential\n    )\n    foreach ($Computer in $ComputerName) {\n        try {\n            $hotfixParams = @{ ComputerName = $Computer }\n            if ($Credential) { $hotfixParams['Credential'] = $Credential }\n            $Data = Get-HotFix @hotfixParams\n            $Output = foreach ($Update in $Data) {\n                [PSCustomObject] @{\n                    ComputerName = $Computer\n                    InstalledOn  = $Update.InstalledOn\n                    Description  = $Update.Description\n                    KB           = $Update.HotFixId\n                    InstalledBy  = $Update.InstalledBy\n                    Caption      = $Update.Caption\n                }\n            }\n            $Output | Sort-Object -Descending InstalledOn\n        } catch {\n            Write-Warning -Message \"Get-ComputerWindowsUpdates - No data for computer $($Computer). Failed with errror: $($_.Exception.Message)\"\n        }\n    }\n}\n"
  },
  {
    "path": "Public/Computers/Get-OperatingSystem.ps1",
    "content": "﻿function Get-OperatingSystem {\n    <#\n    .SYNOPSIS\n    Retrieves information about Windows operating systems.\n\n    .DESCRIPTION\n    This function returns details about various versions of Windows operating systems, including their names, version numbers, code names, marketing names, build numbers, release dates, and support end dates.\n\n    .PARAMETER Version\n    Specifies the version number of the Windows operating system to retrieve information for.\n\n    .EXAMPLE\n    Get-OperatingSystem -Version '10.0 (19042)'\n    Retrieves information about Windows 10 20H2.\n\n    .EXAMPLE\n    Get-OperatingSystem\n    Retrieves information about all available Windows operating systems.\n\n    #>\n    [cmdletbinding()]\n    param(\n        [string] $Version\n    )\n\n    $ListOperatingSystems = [ordered] @{\n        '10.0 (19043)' = [PSCustomObject] @{ Name = 'Windows 10 21H1'; Version = '10.0 (19043)'; CodeName = '21H1'; MarketingName = 'May 2021 Update'; BuildNumber = '19043';\n            ReleaseDate = (Get-Date -Year 2021 -Month 5 -Day 18 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndPro = (Get-Date -Year 2022 -Month 12 -Day 13 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndEnterprise = (Get-Date -Year 2022 -Month 12 -Day 13 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); LTSC = $null\n        }\n        '10.0 (19042)' = [PSCustomObject] @{ Name = 'Windows 10 20H2'; Version = '10.0 (19042)'; CodeName = '20H2'; MarketingName = 'October 2020 Update'; BuildNumber = '19042';\n            ReleaseDate = (Get-Date -Year 2020 -Month 9 -Day 20 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndPro = (Get-Date -Year 2022 -Month 5 -Day 10 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndEnterprise = (Get-Date -Year 2023 -Month 5 -Day 9 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); LTSC = $null\n        }\n        '10.0 (19041)' = [PSCustomObject] @{ Name = 'Windows 10 2004'; Version = '10.0 (19041)'; CodeName = '20H1'; MarketingName = 'May 2020 Update'; BuildNumber = '19041';\n            ReleaseDate = (Get-Date -Year 2020 -Month 5 -Day 27 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndPro = (Get-Date -Year 2021 -Month 12 -Day 14 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndEnterprise = (Get-Date -Year 2021 -Month 12 -Day 14 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); LTSC = $null\n        }\n        '10.0 (18363)' = [PSCustomObject] @{ Name = \"Windows 10 1909\"; Version = '10.0 (18363)'; CodeName = '19H2'; MarketingName = 'November 2019 Update'; BuildNumber = '18363';\n            ReleaseDate = (Get-Date -Year 2019 -Month 11 -Day 12 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndPro = (Get-Date -Year 2021 -Month 5 -Day 11 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndEnterprise = (Get-Date -Year 2022 -Month 5 -Day 10 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); LTSC = $null\n        }\n        '10.0 (18362)' = [PSCustomObject] @{ Name = \"Windows 10 1903\"; Version = '10.0 (18362)'; CodeName = '19H1'; MarketingName = 'May 2019 Update'; BuildNumber = '18362';\n            ReleaseDate = (Get-Date -Year 2019 -Month 5 -Day 21 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndPro = (Get-Date -Year 2020 -Month 12 -Day 8 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndEnterprise = (Get-Date -Year 2020 -Month 12 -Day 8 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); LTSC = $null\n        }\n        '10.0 (17763)' = [PSCustomObject] @{ Name = \"Windows 10 1809\"; Version = '10.0 (17763)'; CodeName = 'Redstone 5'; MarketingName = 'October 2018 Update'; BuildNumber = '17763';\n            ReleaseDate = (Get-Date -Year 2018 -Month 11 -Day 13 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndPro = (Get-Date -Year 2020 -Month 11 -Day 10 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndEnterprise = (Get-Date -Year 2021 -Month 5 -Day 11 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); LTSC = (Get-Date -Year 2029 -Month 1 -Day 9 -Second 1 -Minute 1 -Hour 1 -Millisecond 1)\n        }\n        '10.0 (17134)' = [PSCustomObject] @{ Name = \"Windows 10 1803\"; Version = '10.0 (17134)'; CodeName = 'Redstone 4'; MarketingName = 'April 2018 Update'; BuildNumber = '17134';\n            ReleaseDate = (Get-Date -Year 2018 -Month 4 -Day 30 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndPro = (Get-Date -Year 2020 -Month 11 -Day 12 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndEnterprise = (Get-Date -Year 2021 -Month 5 -Day 11 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); LTSC = $null\n        }\n        '10.0 (16299)' = [PSCustomObject] @{ Name = \"Windows 10 1709\"; Version = '10.0 (16299)'; CodeName = 'Redstone 3'; MarketingName = 'Fall Creators Update'; BuildNumber = '16299';\n            ReleaseDate = (Get-Date -Year 2017 -Month 9 -Day 17 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndPro = (Get-Date -Year 2019 -Month 4 -Day 9 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndEnterprise = (Get-Date -Year 2020 -Month 10 -Day 13 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); ; LTSC = $null\n        }\n        '10.0 (15063)' = [PSCustomObject] @{ Name = \"Windows 10 1703\"; Version = '10.0 (15063)'; CodeName = 'Redstone 2'; MarketingName = 'Creators Update'; BuildNumber = '15063';\n            ReleaseDate = (Get-Date -Year 2017 -Month 4 -Day 5 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndPro = (Get-Date -Year 2018 -Month 10 -Day 9 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndEnterprise = (Get-Date -Year 2019 -Month 10 -Day 8 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); ; LTSC = $null\n        }\n        '10.0 (14393)' = [PSCustomObject] @{ Name = \"Windows 10 1607\"; Version = '10.0 (14393)'; CodeName = 'Redstone 1'; MarketingName = 'Anniversary Update'; BuildNumber = '14393';\n            ReleaseDate = (Get-Date -Year 2016 -Month 8 -Day 2 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndPro = (Get-Date -Year 2018 -Month 4 -Day 10 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndEnterprise = (Get-Date -Year 2019 -Month 4 -Day 9 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); LTSC = (Get-Date -Year 2026 -Month 10 -Day 13 -Second 1 -Minute 1 -Hour 1 -Millisecond 1)\n        }\n        '10.0 (10586)' = [PSCustomObject] @{ Name = \"Windows 10 1511\"; Version = '10.0 (10586)'; CodeName = 'Threshold 2'; MarketingName = 'November Update'; BuildNumber = '10586';\n            ReleaseDate = (Get-Date -Year 2015 -Month 11 -Day 10 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndPro = (Get-Date -Year 2017 -Month 10 -Day 10 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndEnterprise = (Get-Date -Year 2018 -Month 4 -Day 10 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); LTSC = $null\n        }\n        '10.0 (10240)' = [PSCustomObject] @{ Name = \"Windows 10 1507\"; Version = '10.0 (10240)' ; CodeName = 'Threshold 1'; MarketingName = 'N/A'; BuildNumber = '10240';\n            ReleaseDate = (Get-Date -Year 2015 -Month 7 -Day 29 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndPro = (Get-Date -Year 2017 -Month 5 -Day 9 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); SupportEndEnterprise = (Get-Date -Year 2017 -Month 5 -Day 9 -Second 1 -Minute 1 -Hour 1 -Millisecond 1); LTSC = (Get-Date -Year 2025 -Month 10 -Day 14 -Second 1 -Minute 1 -Hour 1 -Millisecond 1)\n        }\n    }\n    if ($Version) {\n        $ListOperatingSystems[$Version]\n    } else {\n        $ListOperatingSystems.Values\n    }\n}"
  },
  {
    "path": "Public/Connectivity/Get-IPAddressInformation.ps1",
    "content": "function Get-IPAddressInformation {\n    <#\n    .SYNOPSIS\n    Retrieves detailed information about an IP address using the ip-api.com service.\n    \n    .DESCRIPTION\n    This function retrieves detailed information about the specified IP address using the ip-api.com service. It provides details such as country, region, city, ISP, and more.\n    \n    .PARAMETER IP\n    Specifies the IP address for which information needs to be retrieved.\n    \n    .EXAMPLE\n    Get-IpAddressInformation -IP \"8.8.8.8\"\n    Retrieves information about the IP address \"8.8.8.8\" using the ip-api.com service.\n    \n    .NOTES\n    This function requires an active internet connection to retrieve IP address information from the ip-api.com service.\n    #>\n    [cmdletbinding()]\n    param(\n        [string] $IP\n    )\n    try {\n        $Information = Invoke-RestMethod -Method get -Uri \"http://ip-api.com/json/$ip\"\n    } catch {\n        $ErrorMessage = $_.Exception.Message -replace \"`n\", \" \" -replace \"`r\", \" \"\n        Write-Warning \"Get-IPAddressInformation - Error occured on IP $IP`: $ErrorMessage\"\n    }\n    return $Information\n}"
  },
  {
    "path": "Public/Connectivity/Get-MyIpAddress.ps1",
    "content": "function Get-MyIpAddress {\n    <#\n    .SYNOPSIS\n    Retrieves the public IP address of the current machine using OpenDNS.\n\n    .DESCRIPTION\n    This function retrieves the public IP address of the current machine by querying OpenDNS servers. It returns the IP address as a string.\n\n    .EXAMPLE\n    Get-MyIpAddress\n    Retrieves the public IP address of the current machine.\n\n    .NOTES\n    Author: Your Name\n    Date: Current Date\n    #>\n    [alias('Get-MyIP')]\n    [CmdletBinding()]\n    param()\n    $DNSParam = @{\n        Name    = 'myip.opendns.com'\n        Server  = 'resolver1.opendns.com'\n        DnsOnly = $true\n    }\n    return Resolve-DnsName @DNSParam | ForEach-Object IPAddress\n}"
  },
  {
    "path": "Public/Connectivity/Set-PasswordRemotely.ps1",
    "content": "function Set-PasswordRemotely {\n    <#\n    .SYNOPSIS\n    Set-PasswordRemotely function changes a user's password on a remote domain controller.\n\n    .DESCRIPTION\n    The Set-PasswordRemotely function allows changing a user's password securely on a remote domain controller. It requires the username, old password, new password, and optionally the domain controller's DNS name or IP address.\n\n    .PARAMETER UserName\n    Specifies the username of the account for which the password will be changed.\n\n    .PARAMETER OldPassword\n    Specifies the old password of the user account.\n\n    .PARAMETER NewPassword\n    Specifies the new password to set for the user account.\n\n    .PARAMETER DomainController\n    Specifies the domain controller's DNS name or IP address. If not provided, the function will prompt for it or automatically determine it if the machine is joined to a domain.\n\n    .EXAMPLE\n    Set-PasswordRemotely -UserName \"JohnDoe\" -OldPassword $SecureOldPassword -NewPassword $SecureNewPassword -DomainController \"DC01\"\n\n    Description:\n    Changes the password for the user account \"JohnDoe\" on the domain controller \"DC01\" using the provided old and new passwords.\n\n    .EXAMPLE\n    Set-PasswordRemotely -UserName \"JaneSmith\" -OldPassword $SecureOldPassword -NewPassword $SecureNewPassword\n\n    Description:\n    Changes the password for the user account \"JaneSmith\" on the domain controller determined automatically, using the provided old and new passwords.\n    #>\n    [CmdletBinding(DefaultParameterSetName = 'Secure')]\n    param(\n        [Parameter(ParameterSetName = 'Secure', Mandatory)][string] $UserName,\n        [Parameter(ParameterSetName = 'Secure', Mandatory)][securestring] $OldPassword,\n        [Parameter(ParameterSetName = 'Secure', Mandatory)][securestring] $NewPassword,\n        [Parameter(ParameterSetName = 'Secure')][alias('DC', 'Server', 'ComputerName')][string] $DomainController\n    )\n    Begin {\n        $DllImport = @'\n[DllImport(\"netapi32.dll\", CharSet = CharSet.Unicode)]\npublic static extern bool NetUserChangePassword(string domain, string username, string oldpassword, string newpassword);\n'@\n        $NetApi32 = Add-Type -MemberDefinition $DllImport -Name 'NetApi32' -Namespace 'Win32' -PassThru\n\n        if (-not $DomainController) {\n            if ($env:computername -eq $env:userdomain) {\n                # not joined to domain, lets prompt for DC\n                $DomainController = Read-Host -Prompt 'Domain Controller DNS name or IP Address'\n            } else {\n                $Domain = $Env:USERDNSDOMAIN\n                $Context = [System.DirectoryServices.ActiveDirectory.DirectoryContext]::new([System.DirectoryServices.ActiveDirectory.DirectoryContextType]::Domain, $Domain)\n                $DomainController = ([System.DirectoryServices.ActiveDirectory.DomainController]::FindOne($Context)).Name\n            }\n        }\n    }\n    Process {\n        if ($DomainController -and $OldPassword -and $NewPassword -and $UserName) {\n            $OldPasswordPlain = [System.Net.NetworkCredential]::new([string]::Empty, $OldPassword).Password\n            $NewPasswordPlain = [System.Net.NetworkCredential]::new([string]::Empty, $NewPassword).Password\n\n            $result = $NetApi32::NetUserChangePassword($DomainController, $UserName, $OldPasswordPlain, $NewPasswordPlain)\n            if ($result) {\n                Write-Host -Object \"Set-PasswordRemotely - Password change for account $UserName failed on $DomainController. Please try again.\" -ForegroundColor Red\n            } else {\n                Write-Host -Object \"Set-PasswordRemotely - Password change for account $UserName succeeded on $DomainController.\" -ForegroundColor Cyan\n            }\n        } else {\n            Write-Warning \"Set-PasswordRemotely - Password change for account failed. All parameters are required. \"\n        }\n    }\n    End {\n        $OldPassword = $null\n        $NewPassword = $null\n        $OldPasswordPlain = $null\n        $NewPasswordPlain = $null\n        [System.GC]::Collect()\n    }\n}"
  },
  {
    "path": "Public/Converts/Convert-BinaryToHex.ps1",
    "content": "function Convert-BinaryToHex {\n    <#\n    .SYNOPSIS\n    Converts an array of binary numbers to hexadecimal format.\n\n    .DESCRIPTION\n    This function takes an array of binary numbers and converts them to hexadecimal format.\n\n    .PARAMETER Binary\n    Specifies the array of binary numbers to be converted to hexadecimal.\n\n    .EXAMPLE\n    Convert-BinaryToHex -Binary 1101 1010\n    Converts the binary numbers 1101 and 1010 to hexadecimal format.\n\n    .EXAMPLE\n    1101 1010 | Convert-BinaryToHex\n    Converts the binary numbers 1101 and 1010 piped into the function to hexadecimal format.\n    #>\n    param(\n        [alias('Bin')]\n        [Parameter(Position = 0, Mandatory = $false, ValueFromPipeline = $true)]\n        [Byte[]]$Binary\n    )\n    if ($null -eq $Binary) {\n        return\n    }\n    # assume pipeline input if we don't have an array (surely there must be a better way)\n    if ($Binary.Length -eq 1) {\n        $Binary = @($input)\n    }\n    $Return = -join ($Binary |  ForEach-Object { \"{0:X2}\" -f $_ })\n    $Return\n}"
  },
  {
    "path": "Public/Converts/Convert-BinaryToString.ps1",
    "content": "function Convert-BinaryToString {\n    <#\n    .SYNOPSIS\n    Converts an array of binary numbers to a string.\n\n    .DESCRIPTION\n    This function takes an array of binary numbers and converts them to a string using Unicode encoding.\n\n    .PARAMETER Binary\n    Specifies the array of binary numbers to be converted to a string.\n\n    .EXAMPLE\n    Convert-BinaryToString -Binary 01001000 01100101 01101100 01101100 01101111\n    Converts the binary numbers to the string \"Hello\".\n\n    .EXAMPLE\n    01001000 01100101 01101100 01101100 01101111 | Convert-BinaryToString\n    Converts the binary numbers piped into the function to the string \"Hello\".\n    #>\n    param(\n        [alias('Bin')]\n        [Parameter(Position = 0, Mandatory = $false, ValueFromPipeline = $true)]\n        [Byte[]]$Binary\n    )\n    if ($null -ne $Binary) {\n        [System.Text.Encoding]::Unicode.GetString($Binary)\n    }\n}"
  },
  {
    "path": "Public/Converts/Convert-Color.ps1",
    "content": "function Convert-Color {\n    <#\n    .Synopsis\n    This color converter gives you the hexadecimal values of your RGB colors and vice versa (RGB to HEX)\n    .Description\n    This color converter gives you the hexadecimal values of your RGB colors and vice versa (RGB to HEX). Use it to convert your colors and prepare your graphics and HTML web pages.\n    .Parameter RBG\n    Enter the Red Green Blue value comma separated. Red: 51 Green: 51 Blue: 204 for example needs to be entered as 51,51,204\n    .Parameter HEX\n    Enter the Hex value to be converted. Do not use the '#' symbol. (Ex: 3333CC converts to Red: 51 Green: 51 Blue: 204)\n    .Example\n    .\\convert-color -hex FFFFFF\n    Converts hex value FFFFFF to RGB\n\n    .Example\n    .\\convert-color -RGB 123,200,255\n    Converts Red = 123 Green = 200 Blue = 255 to Hex value\n\n    #>\n    param(\n        [Parameter(ParameterSetName = \"RGB\", Position = 0)]\n        [ValidateScript( {$_ -match '^([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$'})]\n        $RGB,\n        [Parameter(ParameterSetName = \"HEX\", Position = 0)]\n        [ValidateScript( {$_ -match '[A-Fa-f0-9]{6}'})]\n        [string]\n        $HEX\n    )\n    switch ($PsCmdlet.ParameterSetName) {\n        \"RGB\" {\n            if ($null -eq $RGB[2]) {\n                Write-error \"Value missing. Please enter all three values seperated by comma.\"\n            }\n            $red = [convert]::Tostring($RGB[0], 16)\n            $green = [convert]::Tostring($RGB[1], 16)\n            $blue = [convert]::Tostring($RGB[2], 16)\n            if ($red.Length -eq 1) {\n                $red = '0' + $red\n            }\n            if ($green.Length -eq 1) {\n                $green = '0' + $green\n            }\n            if ($blue.Length -eq 1) {\n                $blue = '0' + $blue\n            }\n            Write-Output $red$green$blue\n        }\n        \"HEX\" {\n            $red = $HEX.Remove(2, 4)\n            $Green = $HEX.Remove(4, 2)\n            $Green = $Green.remove(0, 2)\n            $Blue = $hex.Remove(0, 4)\n            $Red = [convert]::ToInt32($red, 16)\n            $Green = [convert]::ToInt32($green, 16)\n            $Blue = [convert]::ToInt32($blue, 16)\n            Write-Output $red, $Green, $blue\n        }\n    }\n}"
  },
  {
    "path": "Public/Converts/Convert-CountryCodeToCountry.ps1",
    "content": "﻿function Convert-CountryCodeToCountry {\n    <#\n    .SYNOPSIS\n    Converts a country code to a country name, or when used with a switch to full culture information\n\n    .DESCRIPTION\n    Converts a country code to a country name, or when used with a switch to full culture information\n\n    .PARAMETER CountryCode\n    Country code\n\n    .PARAMETER All\n    Provide full culture information rather than just the country name\n\n    .EXAMPLE\n    Convert-CountryCodeToCountry -CountryCode 'PL'\n\n    .EXAMPLE\n    Convert-CountryCodeToCountry -CountryCode 'PL' -All\n\n    .EXAMPLE\n    $Test = Convert-CountryCodeToCountry\n    $Test['PL']['Culture'] | fl\n    $Test['PL']['RegionInformation']\n\n    .EXAMPLE\n    Convert-CountryCodeToCountry -CountryCode 'PL'\n    Convert-CountryCodeToCountry -CountryCode 'POL'\n\n    .NOTES\n    General notes\n    #>\n    [cmdletBinding()]\n    param(\n        [string] $CountryCode,\n        [switch] $All\n    )\n    if ($Script:QuickSearch) {\n        if ($PSBoundParameters.ContainsKey('CountryCode')) {\n            if ($All) {\n                $Script:QuickSearch[$CountryCode]\n            } else {\n                $Script:QuickSearch[$CountryCode].RegionInformation.EnglishName\n            }\n        } else {\n            $Script:QuickSearch\n        }\n    } else {\n        $Script:QuickSearch = [ordered] @{}\n        $AllCultures = [cultureinfo]::GetCultures([System.Globalization.CultureTypes]::SpecificCultures)\n        foreach ($Culture in $AllCultures) {\n\n            $RegionInformation = [System.Globalization.RegionInfo]::new($Culture)\n            $Script:QuickSearch[$RegionInformation.TwoLetterISORegionName] = @{\n                'Culture'           = $Culture\n                'RegionInformation' = $RegionInformation\n            }\n            $Script:QuickSearch[$RegionInformation.ThreeLetterISORegionName] = @{\n                'Culture'           = $Culture\n                'RegionInformation' = $RegionInformation\n            }\n        }\n        if ($PSBoundParameters.ContainsKey('CountryCode')) {\n            if ($All) {\n                $Script:QuickSearch[$CountryCode]\n            } else {\n                $Script:QuickSearch[$CountryCode].RegionInformation.EnglishName\n            }\n        } else {\n            $Script:QuickSearch\n        }\n    }\n}"
  },
  {
    "path": "Public/Converts/Convert-CountryToContinent.ps1",
    "content": "﻿function Convert-CountryToContinent {\n    <#\n    .SYNOPSIS\n    Convert country to continent\n\n    .DESCRIPTION\n    Convert country to continent or return a hashtable of countries and their corresponding continent.\n    If the country is not found (for example empty), it will return \"Unknown\"\n\n    .PARAMETER Country\n    Country to convert. If country is not given it will return a hashtable of countries and their corresponding continent.\n\n    .EXAMPLE\n    Convert-CountryToContinent -Country \"Poland\"\n\n    .EXAMPLE\n    Convert-CountryToContinent\n\n    .NOTES\n    General notes\n    #>\n    [CmdletBinding()]\n    param(\n        [string] $Country,\n        [switch] $ReturnHashTable\n    )\n    $CountryToContinent = [ordered] @{\n        \"Afghanistan\"                       = \"Asia\"\n        \"Albania\"                           = \"Europe\"\n        \"Algeria\"                           = \"Africa\"\n        \"Andorra\"                           = \"Europe\"\n        \"Angola\"                            = \"Africa\"\n        \"Antigua and Barbuda\"               = \"North America\"\n        \"Argentina\"                         = \"South America\"\n        \"Armenia\"                           = \"Asia\"\n        \"Australia\"                         = \"Australia/Oceania\"\n        \"Austria\"                           = \"Europe\"\n        \"Azerbaijan\"                        = \"Asia\"\n        \"Bahamas\"                           = \"North America\"\n        \"Bahrain\"                           = \"Asia\"\n        \"Bangladesh\"                        = \"Asia\"\n        \"Barbados\"                          = \"North America\"\n        \"Belarus\"                           = \"Europe\"\n        \"Belgium\"                           = \"Europe\"\n        \"Belize\"                            = \"North America\"\n        \"Benin\"                             = \"Africa\"\n        \"Bhutan\"                            = \"Asia\"\n        \"Bolivia\"                           = \"South America\"\n        \"Bosnia and Herzegovina\"            = \"Europe\"\n        \"Botswana\"                          = \"Africa\"\n        \"Brazil\"                            = \"South America\"\n        \"Brunei\"                            = \"Asia\"\n        \"Bulgaria\"                          = \"Europe\"\n        \"Burkina Faso\"                      = \"Africa\"\n        \"Burundi\"                           = \"Africa\"\n        \"Cabo Verde\"                        = \"Africa\"\n        \"Cambodia\"                          = \"Asia\"\n        \"Cameroon\"                          = \"Africa\"\n        \"Canada\"                            = \"North America\"\n        \"Central African Republic\"          = \"Africa\"\n        \"Chad\"                              = \"Africa\"\n        \"Chile\"                             = \"South America\"\n        \"China\"                             = \"Asia\"\n        \"Colombia\"                          = \"South America\"\n        \"Comoros\"                           = \"Africa\"\n        \"Congo, Democratic Republic of the\" = \"Africa\"\n        \"Congo, Republic of the\"            = \"Africa\"\n        \"Costa Rica\"                        = \"North America\"\n        \"Cote d'Ivoire\"                     = \"Africa\"\n        \"Croatia\"                           = \"Europe\"\n        \"Cuba\"                              = \"North America\"\n        \"Cyprus\"                            = \"Asia\"\n        \"Czechia\"                           = \"Europe\"\n        \"Denmark\"                           = \"Europe\"\n        \"Djibouti\"                          = \"Africa\"\n        \"Dominica\"                          = \"North America\"\n        \"Dominican Republic\"                = \"North America\"\n        \"Ecuador\"                           = \"South America\"\n        \"Egypt\"                             = \"Africa\"\n        \"El Salvador\"                       = \"North America\"\n        \"Equatorial Guinea\"                 = \"Africa\"\n        \"Eritrea\"                           = \"Africa\"\n        \"Estonia\"                           = \"Europe\"\n        \"Eswatini\"                          = \"Africa\"\n        \"Ethiopia\"                          = \"Africa\"\n        \"Fiji\"                              = \"Australia/Oceania\"\n        \"Finland\"                           = \"Europe\"\n        \"France\"                            = \"Europe\"\n        \"Gabon\"                             = \"Africa\"\n        \"Gambia\"                            = \"Africa\"\n        \"Georgia\"                           = \"Asia\"\n        \"Germany\"                           = \"Europe\"\n        \"Ghana\"                             = \"Africa\"\n        \"Greece\"                            = \"Europe\"\n        \"Grenada\"                           = \"North America\"\n        \"Guatemala\"                         = \"North America\"\n        \"Guinea\"                            = \"Africa\"\n        \"Guinea-Bissau\"                     = \"Africa\"\n        \"Guyana\"                            = \"South America\"\n        \"Haiti\"                             = \"North America\"\n        \"Honduras\"                          = \"North America\"\n        \"Hungary\"                           = \"Europe\"\n        \"Iceland\"                           = \"Europe\"\n        \"India\"                             = \"Asia\"\n        \"Indonesia\"                         = \"Asia\"\n        \"Iran\"                              = \"Asia\"\n        \"Iraq\"                              = \"Asia\"\n        \"Ireland\"                           = \"Europe\"\n        \"Israel\"                            = \"Asia\"\n        \"Italy\"                             = \"Europe\"\n        \"Jamaica\"                           = \"North America\"\n        \"Japan\"                             = \"Asia\"\n        \"Jordan\"                            = \"Asia\"\n        \"Kazakhstan\"                        = \"Asia\"\n        \"Kenya\"                             = \"Africa\"\n        \"Kiribati\"                          = \"Australia/Oceania\"\n        \"Kosovo\"                            = \"Europe\"\n        \"Kuwait\"                            = \"Asia\"\n        \"Kyrgyzstan\"                        = \"Asia\"\n        \"Laos\"                              = \"Asia\"\n        \"Latvia\"                            = \"Europe\"\n        \"Lebanon\"                           = \"Asia\"\n        \"Lesotho\"                           = \"Africa\"\n        \"Liberia\"                           = \"Africa\"\n        \"Libya\"                             = \"Africa\"\n        \"Liechtenstein\"                     = \"Europe\"\n        \"Lithuania\"                         = \"Europe\"\n        \"Luxembourg\"                        = \"Europe\"\n        \"Madagascar\"                        = \"Africa\"\n        \"Malawi\"                            = \"Africa\"\n        \"Malaysia\"                          = \"Asia\"\n        \"Maldives\"                          = \"Asia\"\n        \"Mali\"                              = \"Africa\"\n        \"Malta\"                             = \"Europe\"\n        \"Marshall Islands\"                  = \"Australia/Oceania\"\n        \"Mauritania\"                        = \"Africa\"\n        \"Mauritius\"                         = \"Africa\"\n        \"Mexico\"                            = \"North America\"\n        \"Micronesia\"                        = \"Australia/Oceania\"\n        \"Moldova\"                           = \"Europe\"\n        \"Monaco\"                            = \"Europe\"\n        \"Mongolia\"                          = \"Asia\"\n        \"Montenegro\"                        = \"Europe\"\n        \"Morocco\"                           = \"Africa\"\n        \"Mozambique\"                        = \"Africa\"\n        \"Myanmar\"                           = \"Asia\"\n        \"Namibia\"                           = \"Africa\"\n        \"Nauru\"                             = \"Australia/Oceania\"\n        \"Nepal\"                             = \"Asia\"\n        \"Netherlands\"                       = \"Europe\"\n        \"New Zealand\"                       = \"Australia/Oceania\"\n        \"Nicaragua\"                         = \"North America\"\n        \"Niger\"                             = \"Africa\"\n        \"Nigeria\"                           = \"Africa\"\n        \"North Korea\"                       = \"Asia\"\n        \"North Macedonia\"                   = \"Europe\"\n        \"Norway\"                            = \"Europe\"\n        \"Oman\"                              = \"Asia\"\n        \"Pakistan\"                          = \"Asia\"\n        \"Palau\"                             = \"Australia/Oceania\"\n        \"Panama\"                            = \"North America\"\n        \"Papua New Guinea\"                  = \"Australia/Oceania\"\n        \"Paraguay\"                          = \"South America\"\n        \"Peru\"                              = \"South America\"\n        \"Philippines\"                       = \"Asia\"\n        \"Poland\"                            = \"Europe\"\n        \"Portugal\"                          = \"Europe\"\n        \"Qatar\"                             = \"Asia\"\n        \"Romania\"                           = \"Europe\"\n        \"Russia\"                            = \"Asia\"\n        \"Rwanda\"                            = \"Africa\"\n        \"Saint Kitts and Nevis\"             = \"North America\"\n        \"Saint Lucia\"                       = \"North America\"\n        \"Saint Vincent and the Grenadines\"  = \"North America\"\n        \"Samoa\"                             = \"Australia/Oceania\"\n        \"San Marino\"                        = \"Europe\"\n        \"Sao Tome and Principe\"             = \"Africa\"\n        \"Saudi Arabia\"                      = \"Asia\"\n        \"Senegal\"                           = \"Africa\"\n        \"Serbia\"                            = \"Europe\"\n        \"Seychelles\"                        = \"Africa\"\n        \"Sierra Leone\"                      = \"Africa\"\n        \"Singapore\"                         = \"Asia\"\n        \"Slovakia\"                          = \"Europe\"\n        \"Slovenia\"                          = \"Europe\"\n        \"Solomon Islands\"                   = \"Australia/Oceania\"\n        \"Somalia\"                           = \"Africa\"\n        \"South Africa\"                      = \"Africa\"\n        \"South Korea\"                       = \"Asia\"\n        \"South Sudan\"                       = \"Africa\"\n        \"Spain\"                             = \"Europe\"\n        \"Sri Lanka\"                         = \"Asia\"\n        \"Sudan\"                             = \"Africa\"\n        \"Suriname\"                          = \"South America\"\n        \"Sweden\"                            = \"Europe\"\n        \"Switzerland\"                       = \"Europe\"\n        \"Syria\"                             = \"Asia\"\n        \"Taiwan\"                            = \"Asia\"\n        \"Tajikistan\"                        = \"Asia\"\n        \"Tanzania\"                          = \"Africa\"\n        \"Thailand\"                          = \"Asia\"\n        \"Timor-Leste\"                       = \"Asia\"\n        \"Togo\"                              = \"Africa\"\n        \"Tonga\"                             = \"Australia/Oceania\"\n        \"Trinidad and Tobago\"               = \"North America\"\n        \"Tunisia\"                           = \"Africa\"\n        \"Turkey\"                            = \"Asia\"\n        \"Turkmenistan\"                      = \"Asia\"\n        \"Tuvalu\"                            = \"Australia/Oceania\"\n        \"Uganda\"                            = \"Africa\"\n        \"Ukraine\"                           = \"Europe\"\n        \"United Arab Emirates\"              = \"Asia\"\n        \"United Kingdom\"                    = \"Europe\"\n        \"United States of America\"          = \"North America\"\n        \"Uruguay\"                           = \"South America\"\n        \"Uzbekistan\"                        = \"Asia\"\n        \"Vanuatu\"                           = \"Australia/Oceania\"\n        \"Vatican City (Holy See)\"           = \"Europe\"\n        \"Venezuela\"                         = \"South America\"\n        \"Vietnam\"                           = \"Asia\"\n        \"Yemen\"                             = \"Asia\"\n        \"Zambia\"                            = \"Africa\"\n        \"Zimbabwe\"                          = \"Africa\"\n    }\n    if ($PSBoundParameters.ContainsKey('Country')) {\n        if ($CountryToContinent[$Country]) {\n            $CountryToContinent[$Country]\n        } else {\n            \"Unknown\"\n        }\n    } else {\n        $CountryToContinent\n    }\n}"
  },
  {
    "path": "Public/Converts/Convert-CountryToCountryCode.ps1",
    "content": "﻿function Convert-CountryToCountryCode {\n    <#\n    .SYNOPSIS\n    Converts a country name to a country code, or when used with a switch to full culture information\n\n    .DESCRIPTION\n    Converts a country name to a country code, or when used with a switch to full culture information\n\n    .PARAMETER CountryName\n    Country name in it's english name\n\n    .PARAMETER All\n    Provide full culture information rather than just the country code\n\n    .EXAMPLE\n    Convert-CountryToCountryCode -CountryName 'Poland'\n\n    .EXAMPLE\n    Convert-CountryToCountryCode -CountryName 'Poland' -All\n\n    .EXAMPLE\n    $Test = Convert-CountryToCountryCode\n    $Test['India']['Culture']\n    $Test['India']['RegionInformation']\n\n    .EXAMPLE\n    $Test = Convert-CountryToCountryCode\n    $Test['Poland']['Culture']\n    $Test['Poland']['RegionInformation']\n\n    .EXAMPLE\n    Convert-CountryToCountryCode -CountryName 'Polska'\n    Convert-CountryToCountryCode -CountryName 'Poland'\n    Convert-CountryToCountryCode -CountryName 'CZECH REPUBLIC'\n    Convert-CountryToCountryCode -CountryName 'USA'\n\n    .NOTES\n    General notes\n    #>\n    [cmdletBinding()]\n    param(\n        [string] $CountryName,\n        [switch] $All\n    )\n    if ($Script:QuickSearchCountries) {\n        if ($CountryName) {\n            if ($All) {\n                $Script:QuickSearchCountries[$CountryName]\n            } else {\n                if ($Script:QuickSearchCountries[$CountryName]) {\n                    $Script:QuickSearchCountries[$CountryName].RegionInformation.TwoLetterISORegionName.ToUpper()\n                } else {\n                    if ($PSBoundParameters.ErrorAction -eq 'Stop') {\n                        throw \"Country $CountryName not found\"\n                    } else {\n                        Write-Warning -Message \"Convert-CountryToCountryCode - Country $CountryName name not found\"\n                    }\n                }\n            }\n        } else {\n            $Script:QuickSearchCountries\n        }\n    } else {\n        $AllCultures = [cultureinfo]::GetCultures([System.Globalization.CultureTypes]::SpecificCultures)\n        $Script:QuickSearchCountries = [ordered] @{\n            # This is for custom countries that are not in the list by their english name.\n            # there also seems to be a difference between PS7 and PS5.1\n            # Net framework vs NET Core\n            'Czech Republic'  = @{\n                'Culture'           = [cultureinfo] 'CZ'\n                'RegionInformation' = [System.Globalization.RegionInfo] 'CZ'\n            }\n            'Korea, REPUBLIC OF' = @{\n                'Culture'           = [cultureinfo] 'KR'\n                'RegionInformation' = [System.Globalization.RegionInfo] 'KR'\n            }\n            'VIET NAM'        = @{\n                'Culture'           = [cultureinfo] 'VN'\n                'RegionInformation' = [System.Globalization.RegionInfo] 'VN'\n            }\n        }\n        foreach ($Culture in $AllCultures) {\n            $RegionInformation = [System.Globalization.RegionInfo]::new($Culture)\n            $Script:QuickSearchCountries[$RegionInformation.EnglishName] = @{\n                'Culture'           = $Culture\n                'RegionInformation' = $RegionInformation\n            }\n            $Script:QuickSearchCountries[$RegionInformation.DisplayName] = @{\n                'Culture'           = $Culture\n                'RegionInformation' = $RegionInformation\n            }\n            $Script:QuickSearchCountries[$RegionInformation.NativeName] = @{\n                'Culture'           = $Culture\n                'RegionInformation' = $RegionInformation\n            }\n            $Script:QuickSearchCountries[$RegionInformation.ThreeLetterISORegionName] = @{\n                'Culture'           = $Culture\n                'RegionInformation' = $RegionInformation\n            }\n        }\n        if ($CountryName) {\n            if ($All) {\n                $Script:QuickSearchCountries[$CountryName]\n            } else {\n                if ($Script:QuickSearchCountries[$CountryName]) {\n                    $Script:QuickSearchCountries[$CountryName].RegionInformation.TwoLetterISORegionName.ToUpper()\n                } else {\n                    if ($PSBoundParameters.ErrorAction -eq 'Stop') {\n                        throw \"Country $CountryName not found\"\n                    } else {\n                        Write-Warning -Message \"Convert-CountryToCountryCode - Country $CountryName name not found\"\n                    }\n                }\n            }\n        } else {\n            $Script:QuickSearchCountries\n        }\n    }\n}"
  },
  {
    "path": "Public/Converts/Convert-DomainFqdnToNetBIOS.ps1",
    "content": "﻿Function Convert-DomainFqdnToNetBIOS {\n    <#\n    .SYNOPSIS\n    Converts FQDN to NetBIOS name for Active Directory Domain\n\n    .DESCRIPTION\n    Converts FQDN to NetBIOS name for Active Directory Domain\n\n    .PARAMETER DomainName\n    DomainName for current forest or trusted forest\n\n    .EXAMPLE\n    Convert-DomainFqdnToNetBIOS -Domain 'ad.evotec.xyz'\n\n    .EXAMPLE\n    Convert-DomainFqdnToNetBIOS -Domain 'ad.evotec.pl'\n\n    .NOTES\n    General notes\n    #>\n    [cmdletBinding()]\n    param (\n        [string] $DomainName\n    )\n    if (-not $Script:CacheFQDN) {\n        $Script:CacheFQDN = @{}\n    }\n    if ($Script:CacheFQDN[$DomainName]) {\n        $Script:CacheFQDN[$DomainName]\n    } else {\n        $objRootDSE = [System.DirectoryServices.DirectoryEntry] \"LDAP://$DomainName/RootDSE\"\n        $ConfigurationNC = $objRootDSE.configurationNamingContext\n        $Searcher = [System.DirectoryServices.DirectorySearcher] @{\n            SearchScope = \"subtree\"\n            SearchRoot  = \"LDAP://cn=Partitions,$ConfigurationNC\"\n            Filter      = \"(&(objectcategory=Crossref)(dnsRoot=$DomainName)(netbiosname=*))\"\n        }\n        $null = $Searcher.PropertiesToLoad.Add(\"netbiosname\")\n        $Script:CacheFQDN[$DomainName] = ($Searcher.FindOne()).Properties.Item(\"netbiosname\")\n        $Script:CacheFQDN[$DomainName]\n    }\n}"
  },
  {
    "path": "Public/Converts/Convert-DomainToSid.ps1",
    "content": "﻿function Convert-DomainToSid {\n    <#\n    .SYNOPSIS\n    Converts Domain Name to SID\n\n    .DESCRIPTION\n    Converts Domain Name to SID\n\n    .PARAMETER DomainName\n    DomainName for current forest or trusted forest\n\n    .EXAMPLE\n    Convert-DomainToSid -DomainName 'test.evotec.pl'\n\n    .NOTES\n    General notes\n    #>\n    [cmdletBinding()]\n    param(\n        [parameter(Mandatory)][string] $DomainName\n    )\n    try {\n        $BinarySID = ([ADSI]\"LDAP://$DomainName\").objectsid\n        $DomainSidValue = [System.Security.Principal.SecurityIdentifier]::new($BinarySID.Value, 0).Value\n        $DomainSidValue\n    } catch {\n        Write-Warning -Message \"Convert-DomainToSid - Failed conversion with error $($_.Exception.Message)\"\n    }\n}"
  },
  {
    "path": "Public/Converts/Convert-ExchangeEmail.ps1",
    "content": "function Convert-ExchangeEmail {\n    <#\n    .SYNOPSIS\n    Converts a list of Exchange email addresses into a readable and exportable format.\n    \n    .DESCRIPTION\n    This function takes a list of Exchange email addresses and processes them to make them more readable and suitable for export.\n    \n    .PARAMETER Emails\n    List of email addresses in Exchange or Exchange Online format, also known as proxy addresses.\n    \n    .PARAMETER Separator\n    The separator to use between each processed email address. Default is ', '.\n    \n    .PARAMETER RemoveDuplicates\n    Switch to remove duplicate email addresses from the list.\n    \n    .PARAMETER RemovePrefix\n    Switch to remove any prefixes like 'SMTP:', 'SIP:', 'spo:', etc. from the email addresses.\n    \n    .PARAMETER AddSeparator\n    Switch to join the processed email addresses using the specified separator.\n    \n    .EXAMPLE\n    $Emails = @()\n    $Emails += 'SIP:test@email.com'\n    $Emails += 'SMTP:elo@maiu.com'\n    $Emails += 'sip:elo@maiu.com'\n    $Emails += 'Spo:dfte@sdsd.com'\n    $Emails += 'SPO:myothertest@sco.com'\n\n    Convert-ExchangeEmail -Emails $Emails -RemovePrefix -RemoveDuplicates -AddSeparator\n    #>\n    #>\n    \n    [CmdletBinding()]\n    param(\n        [string[]] $Emails,\n        [string] $Separator = ', ',\n        [switch] $RemoveDuplicates,\n        [switch] $RemovePrefix,\n        [switch] $AddSeparator\n    )\n\n    if ($RemovePrefix) {\n        #$Emails = $Emails.Replace('SMTP:', '').Replace('SIP:', '').Replace('smtp:', '').Replace('sip:', '').Replace('spo:','')\n        $Emails = $Emails -replace 'smtp:', '' -replace 'sip:', '' -replace 'spo:', ''\n    }\n    if ($RemoveDuplicates) {\n        $Emails = $Emails | Sort-Object -Unique\n    }\n    if ($AddSeparator) {\n        $Emails = $Emails -join $Separator\n    }\n    return $Emails\n}"
  },
  {
    "path": "Public/Converts/Convert-ExchangeItems.ps1",
    "content": "function Convert-ExchangeItems {\n    <#\n    .SYNOPSIS\n    Converts the count of Exchange items to a specified default value if the count is null.\n\n    .DESCRIPTION\n    This function takes the count of Exchange items and returns the count if it is not null. If the count is null, it returns the specified default value.\n\n    .PARAMETER Count\n    The count of Exchange items to be processed.\n\n    .PARAMETER Default\n    The default value to return if the count is null. Default is 'N/A'.\n\n    .EXAMPLE\n    Convert-ExchangeItems -Count 10 -Default 'No items'\n    # Returns 10\n\n    .EXAMPLE\n    Convert-ExchangeItems -Count $null -Default 'No items'\n    # Returns 'No items'\n\n    .NOTES\n    General notes\n    #>\n    [cmdletbinding()]\n    param(\n        [int] $Count,\n        [string] $Default = 'N/A'\n    )\n    if ($null -eq $Count) {\n        return $Default\n    } else {\n        return $Count\n    }\n}"
  },
  {
    "path": "Public/Converts/Convert-ExchangeRecipient.ps1",
    "content": "﻿\nfunction Convert-ExchangeRecipient {\n    <#\n    .SYNOPSIS\n    Convert msExchRemoteRecipientType, msExchRecipientDisplayType, msExchRecipientTypeDetails to their respective name\n\n    .DESCRIPTION\n    Convert msExchRemoteRecipientType, msExchRecipientDisplayType, msExchRecipientTypeDetails to their respective name\n\n    .PARAMETER RecipientTypeDetails\n    RecipientTypeDetails to convert\n\n    .PARAMETER RecipientType\n    RecipientType to convert\n\n    .PARAMETER RemoteRecipientType\n    Parameter description\n\n    .EXAMPLE\n    $Users = Get-ADUser -Filter * -Properties Mail, ProxyAddresses, msExchRemoteRecipientType, msExchRecipientDisplayType, msExchRecipientTypeDetails, MailNickName\n    $UsersModified = foreach ($User in $Users) {\n        [PSCUstomObject] @{\n            Name                       = $User.Name\n            Mail                       = $User.Mail\n            MailNickName               = $User.MailNickName\n            msExchRemoteRecipientType  = Convert-ExchangeRecipient -msExchRemoteRecipientType $User.msExchRemoteRecipientType\n            msExchRecipientDisplayType = Convert-ExchangeRecipient -msExchRecipientDisplayType $User.msExchRecipientDisplayType\n            msExchRecipientTypeDetails = Convert-ExchangeRecipient -msExchRecipientTypeDetails $User.msExchRecipientTypeDetails\n            ProxyAddresses             = Convert-ExchangeEmail -AddSeparator -RemovePrefix -RemoveDuplicates -Separator ',' -Emails $User.ProxyAddresses\n        }\n    }\n    $UsersModified | Out-HtmlView -Filtering -ScrollX\n\n    .EXAMPLE\n    Convert-ExchangeRecipient -msExchRemoteRecipientType 17\n    Convert-ExchangeRecipient -msExchRecipientDisplayType 17\n    Convert-ExchangeRecipient -msExchRecipientTypeDetails 17\n\n    .NOTES\n    Based on:\n    - https://granikos.eu/exchange-recipient-type-values/\n    - https://answers.microsoft.com/en-us/msoffice/forum/all/recipient-type-values/7c2620e5-9870-48ba-b5c2-7772c739c651\n    - https://www.undocumented-features.com/2020/05/06/every-last-msexchrecipientdisplaytype-and-msexchrecipienttypedetails-value/\n    #>\n    [alias('Convert-ExchangeRecipientDetails')]\n    [cmdletbinding(DefaultParameterSetName = 'msExchRecipientTypeDetails')]\n    param(\n        [parameter(ParameterSetName = 'msExchRecipientTypeDetails')][alias('RecipientTypeDetails')][string] $msExchRecipientTypeDetails,\n        [parameter(ParameterSetName = 'msExchRecipientDisplayType')][alias('RecipientType')][string] $msExchRecipientDisplayType,\n        [parameter(ParameterSetName = 'msExchRemoteRecipientType')][alias('RemoteRecipientType')][string] $msExchRemoteRecipientType,\n\n        [parameter(ParameterSetName = 'msExchRecipientTypeDetails')]\n        [parameter(ParameterSetName = 'msExchRecipientDisplayType')]\n        [parameter(ParameterSetName = 'msExchRemoteRecipientType')]\n        [switch] $All\n    )\n\n    if ($PSBoundParameters.ContainsKey('msExchRecipientTypeDetails')) {\n        $ListMsExchRecipientTypeDetails = [ordered] @{\n            '0'               = 'None'\n            '1'               = 'UserMailbox'\n            '2'               = 'LinkedMailbox'\n            '4'               = 'SharedMailbox'\n            '8'               = 'LegacyMailbox'\n            '16'              = 'RoomMailbox'\n            '32'              = 'EquipmentMailbox'\n            '64'              = 'MailContact'\n            '128'             = 'MailUser'\n            '256'             = 'MailUniversalDistributionGroup'\n            '512'             = 'MailNonUniversalGroup'\n            '1024'            = 'MailUniversalSecurityGroup'\n            '2048'            = 'DynamicDistributionGroup'\n            '4096'            = 'PublicFolder'\n            '8192'            = 'SystemAttendantMailbox'\n            '16384'           = 'SystemMailbox'\n            '32768'           = 'MailForestContact'\n            '65536'           = 'User'\n            '131072'          = 'Contact'\n            '262144'          = 'UniversalDistributionGroup'\n            '524288'          = 'UniversalSecurityGroup'\n            '1048576'         = 'NonUniversalGroup'\n            '2097152'         = 'Disable User'\n            '4194304'         = 'MicrosoftExchange'\n            '8388608'         = 'ArbitrationMailbox'\n            '16777216'        = 'MailboxPlan'\n            '33554432'        = 'LinkedUser'\n            '268435456'       = 'RoomList'\n            '536870912'       = 'DiscoveryMailbox'\n            '1073741824'      = 'RoleGroup'\n            '2147483648'      = 'RemoteUserMailbox'\n            '4294967296'      = 'Computer'\n            '8589934592'      = 'RemoteRoomMailbox'\n            '17179869184'     = 'RemoteEquipmentMailbox'\n            '34359738368'     = 'RemoteSharedMailbox'\n            '68719476736'     = 'PublicFolderMailbox'\n            '137438953472'    = 'Team Mailbox'\n            '274877906944'    = 'RemoteTeamMailbox'\n            '549755813888'    = 'MonitoringMailbox'\n            '1099511627776'   = 'GroupMailbox'\n            '2199023255552'   = 'LinkedRoomMailbox'\n            '4398046511104'   = 'AuditLogMailbox'\n            '8796093022208'   = 'RemoteGroupMailbox'\n            '17592186044416'  = 'SchedulingMailbox'\n            '35184372088832'  = 'GuestMailUser'\n            '70368744177664'  = 'AuxAuditLogMailbox'\n            '140737488355328' = 'SupervisoryReviewPolicyMailbox'\n        }\n        if ($All) {\n            $ListMsExchRecipientTypeDetails\n        } else {\n            if ($null -ne $ListMsExchRecipientTypeDetails[$msExchRecipientTypeDetails]) {\n                $ListMsExchRecipientTypeDetails[$msExchRecipientTypeDetails]\n            } else {\n                $msExchRecipientTypeDetails\n            }\n        }\n    } elseif ($PSBoundParameters.ContainsKey('msExchRecipientDisplayType')) {\n        $ListMsExchRecipientDisplayType = [ordered] @{\n            '0'           = 'MailboxUser'\n            '1'           = 'DistributionGroup'\n            '2'           = 'PublicFolder'\n            '3'           = 'DynamicDistributionGroup'\n            '4'           = 'Organization'\n            '5'           = 'PrivateDistributionList'\n            '6'           = 'RemoteMailUser'\n            '7'           = 'ConferenceRoomMailbox'\n            '8'           = 'EquipmentMailbox'\n            '10'          = 'ArbitrationMailbox'\n            '11'          = 'MailboxPlan'\n            '12'          = 'LinkedUser'\n            '15'          = 'RoomList'\n            '17'          = 'Microsoft365Group' # AT LEAST IT SEEMS SO\n            '-2147483642' = 'SyncedMailboxUser'\n            '-2147483391' = 'SyncedUDGasUDG'\n            '-2147483386' = 'SyncedUDGasContact'\n            '-2147483130' = 'SyncedPublicFolder'\n            '-2147482874' = 'SyncedDynamicDistributionGroup'\n            '-2147482106' = 'SyncedRemoteMailUser'\n            '-2147481850' = 'SyncedConferenceRoomMailbox'\n            '-2147481594' = 'SyncedEquipmentMailbox'\n            '-2147481343' = 'SyncedUSGasUDG'\n            '-2147481338' = 'SyncedUSGasContact'\n            '-1073741818' = 'ACLableSyncedMailboxUser'\n            '-1073740282' = 'ACLableSyncedRemoteMailUser'\n            '-1073739514' = 'ACLableSyncedUSGasContact'\n            '-1073739511' = 'SyncedUSGasUSG'\n            '1043741833'  = 'SecurityDistributionGroup'\n            '1073739511'  = 'SyncedUSGasUSG'\n            '1073739514'  = 'ACLableSyncedUSGasContact'\n            '1073741824'  = 'ACLableMailboxUser' # 'RBAC Role Group'\n            '1073741830'  = 'ACLableRemoteMailUser'\n        }\n        if ($All) {\n            $ListMsExchRecipientDisplayType\n        } else {\n            if ($null -ne $ListMsExchRecipientDisplayType[$msExchRecipientDisplayType]) {\n                $ListMsExchRecipientDisplayType[$msExchRecipientDisplayType]\n            } else {\n                $msExchRecipientDisplayType\n            }\n        }\n    } elseif ($PSBoundParameters.ContainsKey('msExchRemoteRecipientType')) {\n        $ListMsExchRemoteRecipientType = [ordered] @{\n            # RemoteRecipientType\n            '1'   = 'ProvisionMailbox'\n            '2'   = 'ProvisionArchive (On-Prem Mailbox)'\n            '3'   = 'ProvisionMailbox, ProvisionArchive'\n            '4'   = 'Migrated (UserMailbox)'\n            '6'   = 'ProvisionArchive, Migrated'\n            '8'   = 'DeprovisionMailbox'\n            '10'  = 'ProvisionArchive, DeprovisionMailbox'\n            '16'  = 'DeprovisionArchive (On-Prem Mailbox)'\n            '17'  = 'ProvisionMailbox, DeprovisionArchive'\n            '20'  = 'Migrated, DeprovisionArchive'\n            '24'  = 'DeprovisionMailbox, DeprovisionArchive'\n            '33'  = 'ProvisionMailbox, RoomMailbox'\n            '35'  = 'ProvisionMailbox, ProvisionArchive, RoomMailbox'\n            '36'  = 'Migrated, RoomMailbox'\n            '38'  = 'ProvisionArchive, Migrated, RoomMailbox'\n            '49'  = 'ProvisionMailbox, DeprovisionArchive, RoomMailbox'\n            '52'  = 'Migrated, DeprovisionArchive, RoomMailbox'\n            '65'  = 'ProvisionMailbox, EquipmentMailbox'\n            '67'  = 'ProvisionMailbox, ProvisionArchive, EquipmentMailbox'\n            '68'  = 'Migrated, EquipmentMailbox'\n            '70'  = 'ProvisionArchive, Migrated, EquipmentMailbox'\n            '81'  = 'ProvisionMailbox, DeprovisionArchive, EquipmentMailbox'\n            '84'  = 'Migrated, DeprovisionArchive, EquipmentMailbox'\n            '100'\t= 'Migrated, SharedMailbox'\n            '102'\t= 'ProvisionArchive, Migrated, SharedMailbox'\n            '116'\t= 'Migrated, DeprovisionArchive, SharedMailbox'\n        }\n        if ($All) {\n            $ListMsExchRemoteRecipientType\n        } else {\n            if ($null -ne $ListMsExchRemoteRecipientType[$msExchRemoteRecipientType]) {\n                $ListMsExchRemoteRecipientType[$msExchRemoteRecipientType]\n            } else {\n                $msExchRemoteRecipientType\n            }\n        }\n    }\n}\n\n# Add-Type @'\n#     using System;\n#     [Flags]\n#     public enum RemoteRecipientType\n#     {\n#         Mailbox = 0x1,\n#         ProvisionArchive = 0x2,\n#         Migrated = 0x4,\n#         DeprovisionMailbox = 0x8,\n#         DeprovisionArchive = 0x10,\n#         RoomMailbox = 0x20,\n#         EquipmentMailbox = 0x40,\n#         //SharedMailbox = RoomMailbox | EquipmentMailbox\n#     }\n#     public enum RecipientType\n#     {\n#         SharedMailbox = 0x0,\n#         MailUniversalDistributionGroup = 0x1,\n#         MailContact = 0x6,\n#         RoomMailbox = 0x7,\n#         EquipmentMailbox = 0x8,\n#         ACLableMailboxUser = 1073741824,\n#         MailUniversalSecurityGroup = 1073741833,\n#         SyncedMailboxUser = -2147483642,\n#         SyncedUDGasUDG = -2147483391,\n#         SyncedUDGasContact = -2147483386,\n#         SyncedPublicFolder = -2147483130,\n#         SyncedDynamicDistributionGroup = -2147482874,\n#         SyncedRemoteMailUser = -2147482106,\n#         SyncedConferenceRoomMailbox = -2147481850,\n#         SyncedEquipmentMailbox = -2147481594,\n#         SyncedUSGasUDG = -2147481343,\n#         SyncedUSGasContact = -2147481338,\n#         ACLableSyncedMailboxUser = -1073741818,\n#         ACLableSyncedRemoteMailUser = -1073740282,\n#         ACLableSyncedUSGasContact = -1073739514,\n#         SyncedUSGasUSG = -1073739511\n#     }\n#     public enum RecipientTypeDetails: long\n#     {\n#         UserMailbox = 0x1,\n#         LinkedMailbox = 0x2,\n#         SharedMailbox = 0x4,\n#         RoomMailbox = 0x10,\n#         EquipmentMailbox = 0x20,\n#         MailUser = 0x80,\n#         RemoteUserMailbox = 2147483648, //hex does not work here\n#         RemoteRoomMailbox = 8589934592,\n#         RemoteEquipmentMailbox = 17179869184,\n#         RemoteSharedMailbox = 34359738368\n#     }\n# '@"
  },
  {
    "path": "Public/Converts/Convert-ExchangeSize.ps1",
    "content": "\n<#\nConvert-ExchangeSize -To MB -Size '49 GB (52,613,349,376 bytes)'\nConvert-ExchangeSize -To GB -Size '49 GB (52,613,349,376 bytes)'\n#>\nfunction Convert-ExchangeSize {\n    <#\n    .SYNOPSIS\n    Converts the size of Exchange data to a specified unit of measurement.\n\n    .DESCRIPTION\n    This function takes the size of Exchange data and converts it to the specified unit of measurement (Bytes, KB, MB, GB, TB).\n\n    .PARAMETER To\n    The unit of measurement to convert the size to. Default is 'MB'.\n\n    .PARAMETER Size\n    The size of Exchange data to be converted.\n\n    .PARAMETER Precision\n    The number of decimal places to round the converted size to. Default is 4.\n\n    .PARAMETER Display\n    Switch to display the converted size with the unit of measurement.\n\n    .PARAMETER Default\n    The default value to return if the size is null or empty. Default is 'N/A'.\n\n    .EXAMPLE\n    Convert-ExchangeSize -To MB -Size '49 GB (52,613,349,376 bytes)'\n    # Returns the size converted to MB.\n\n    .EXAMPLE\n    Convert-ExchangeSize -To GB -Size '49 GB (52,613,349,376 bytes)' -Precision 2 -Display\n    # Returns the size converted to GB with 2 decimal places and displays the result.\n\n    #>\n    [cmdletbinding()]\n    param(\n        [validateset(\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\")][string]$To = 'MB',\n        [string]$Size,\n        [int]$Precision = 4,\n        [switch]$Display,\n        [string]$Default = 'N/A'\n    )\n    if ([string]::IsNullOrWhiteSpace($Size)) {\n        return $Default\n    }\n    $Pattern = [Regex]::new('(?<=\\()([0-9]*[,.].*[0-9])')  # (?<=\\()([0-9]*.*[0-9]) works too\n    $Value = ($Size | Select-String $Pattern -AllMatches).Matches.Value\n    #Write-Verbose \"Convert-ExchangeSize - Value Before: $Value\"\n\n    if ($null -ne $Value) {\n        $Value = $Value.Replace(',', '').Replace('.', '')\n    }\n\n    switch ($To) {\n        \"Bytes\" {return $value}\n        \"KB\" {$Value = $Value / 1KB}\n        \"MB\" {$Value = $Value / 1MB}\n        \"GB\" {$Value = $Value / 1GB}\n        \"TB\" {$Value = $Value / 1TB}\n\n    }\n    #Write-Verbose \"Convert-ExchangeSize - Value After: $Value\"\n    if ($Display) {\n        return \"$([Math]::Round($value,$Precision,[MidPointRounding]::AwayFromZero)) $To\"\n    } else {\n        return [Math]::Round($value, $Precision, [MidPointRounding]::AwayFromZero)\n    }\n}"
  },
  {
    "path": "Public/Converts/Convert-FromColor.ps1",
    "content": "function ConvertFrom-Color {\n    <#\n    .SYNOPSIS\n    Converts color names or hex codes to different formats.\n\n    .DESCRIPTION\n    ConvertFrom-Color function converts color names or hex codes to different formats such as decimal values or System.Drawing.Color objects.\n    Enhanced to support 3-character hex codes and rgba() format in addition to 6-character hex and named colors.\n\n    .PARAMETER Color\n    Specifies the color names or hex codes to convert.\n\n    .PARAMETER AsDecimal\n    Indicates whether to convert the color to a decimal value.\n\n    .PARAMETER AsDrawingColor\n    Indicates whether to convert the color to a System.Drawing.Color object.\n\n    .EXAMPLE\n    ConvertFrom-Color -Color Red, Blue -AsDecimal\n    Converts the colors Red and Blue to decimal values.\n\n    .EXAMPLE\n    ConvertFrom-Color -Color \"#FFA500\" -AsDrawingColor\n    Converts the color with hex code #FFA500 to a System.Drawing.Color object.\n\n    .EXAMPLE\n    ConvertFrom-Color -Color \"#f00\"\n    Converts the 3-character hex code #f00 to #ff0000.\n\n    .EXAMPLE\n    ConvertFrom-Color -Color \"rgba(255, 0, 0, 0.5)\"\n    Passes through rgba format as-is.\n\n    #>\n    [alias('Convert-FromColor')]\n    [CmdletBinding()]\n    param (\n        [ValidateScript( {\n                # Enhanced validation to support 3-char hex, 6-char hex, rgba, and named colors\n                if ($($_ -in $Script:RGBColors.Keys -or\n                        $_ -match \"^#([A-Fa-f0-9]{6})$\" -or\n                        $_ -match \"^#([A-Fa-f0-9]{3})$\" -or\n                        $_ -match \"^rgba\\s*\\(\" -or\n                        $_ -eq \"\") -eq $false) {\n                    throw \"The Input value is not a valid colorname, hex code (3 or 6 chars), or rgba format.\"\n                } else { $true }\n            })]\n        [Parameter(Position = 0)][alias('Colors')][string[]] $Color,\n        [switch] $AsDecimal,\n        [switch] $AsDrawingColor\n    )\n    $Colors = foreach ($C in $Color) {\n        # Handle rgba() format - pass through as-is\n        if ($C -match \"^rgba\\s*\\(\") {\n            $C\n            continue\n        }\n\n        # Handle 3-character hex codes - expand to 6 characters\n        if ($C -match \"^#([A-Fa-f0-9]{3})$\") {\n            $hex = $C.Substring(1)\n            $expandedHex = \"#$($hex[0])$($hex[0])$($hex[1])$($hex[1])$($hex[2])$($hex[2])\"\n            if ($AsDecimal) {\n                [Convert]::ToInt64($expandedHex.Substring(1), 16)\n            } elseif ($AsDrawingColor) {\n                [System.Drawing.Color]::FromArgb($expandedHex)\n            } else {\n                $expandedHex\n            }\n            continue\n        }\n\n        # Handle 6-character hex codes\n        if ($C -match \"^#([A-Fa-f0-9]{6})$\") {\n            if ($AsDecimal) {\n                [Convert]::ToInt64($C.Substring(1), 16)\n            } elseif ($AsDrawingColor) {\n                [System.Drawing.Color]::FromArgb($C)\n            } else {\n                $C\n            }\n            continue\n        }\n\n        # Handle named colors\n        $Value = $Script:RGBColors.\"$C\"\n        if ($null -eq $Value) {\n            continue\n        }\n        $HexValue = Convert-Color -RGB $Value\n        Write-Verbose \"Convert-FromColor - Color Name: $C Value: $Value HexValue: $HexValue\"\n        if ($AsDecimal) {\n            [Convert]::ToInt64($HexValue, 16)\n        } elseif ($AsDrawingColor) {\n            [System.Drawing.Color]::FromArgb(\"#$($HexValue)\")\n        } else {\n            \"#$($HexValue)\"\n        }\n    }\n    $Colors\n}\n\n$ScriptBlockColors = {\n    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)\n    $Script:RGBColors.Keys | Where-Object { $_ -like \"$wordToComplete*\" }\n}\n\nRegister-ArgumentCompleter -CommandName ConvertFrom-Color -ParameterName Color -ScriptBlock $ScriptBlockColors"
  },
  {
    "path": "Public/Converts/Convert-HexToBinary.ps1",
    "content": "function Convert-HexToBinary {\n    <#\n    .SYNOPSIS\n    Converts a hexadecimal string to a binary representation.\n\n    .DESCRIPTION\n    This function takes a hexadecimal string as input and converts it to a binary representation.\n\n    .PARAMETER Hex\n    Specifies the hexadecimal string to convert to binary.\n\n    .EXAMPLE\n    Convert-HexToBinary -Hex \"1A\"\n    # Outputs: 00011010\n\n    .EXAMPLE\n    \"1A\" | Convert-HexToBinary\n    # Outputs: 00011010\n    #>\n    [CmdletBinding()]\n    param(\n        [Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)] [string] $Hex\n    )\n    $return = for ($i = 0; $i -lt $Hex.Length ; $i += 2) {\n        [Byte]::Parse($Hex.Substring($i, 2), [System.Globalization.NumberStyles]::HexNumber)\n    }\n    Write-Output $return -NoEnumerate\n}"
  },
  {
    "path": "Public/Converts/Convert-IPAddressToPTR.ps1",
    "content": "﻿function Convert-IpAddressToPtr {\n    <#\n    .SYNOPSIS\n    Converts an IP address to a PTR record\n\n    .DESCRIPTION\n    This function takes an IP address as input and converts it to a PTR record.\n\n    .PARAMETER IPAddress\n    The IP address to convert\n\n    .PARAMETER AsObject\n    Should the function return an object instead of a string?\n\n    .EXAMPLE\n    Convert-IpAddressToPtr -IPAddress \"10.1.2.3\"\n\n    .EXAMPLE\n    Convert-IpAddressToPtr -IPAddress \"10.1.2.3\", \"8.8.8.8\" -AsObject\n\n    .NOTES\n    General notes\n    #>\n    [CmdletBinding()]\n    param (\n        [Parameter(Mandatory = $true)]\n        [string[]]$IPAddress,\n        [switch] $AsObject\n    )\n    foreach ($IP in $IPAddress) {\n\n        # Split the IP address into its octets\n        $octets = $IP -split \"\\.\"\n\n        # Reverse the octets\n        [array]::Reverse($octets)\n\n        # Join the reversed octets with dots and append the standard PTR suffix\n        $ptrString = ($octets -join \".\") + \".in-addr.arpa\"\n\n        if ($AsObject) {\n            [pscustomobject] @{\n                IPAddress = $IP\n                PTR       = $ptrString\n            }\n        } else {\n            $ptrString\n        }\n    }\n}"
  },
  {
    "path": "Public/Converts/Convert-Identity.ps1",
    "content": "﻿function Convert-Identity {\n    <#\n    .SYNOPSIS\n    Small command that tries to resolve any given object\n\n    .DESCRIPTION\n    Small command that tries to resolve any given object - be it SID, DN, FSP or Netbiosname\n\n    .PARAMETER Identity\n    Type to resolve in form of Identity, DN, SID\n\n    .PARAMETER SID\n    Allows to pass SID directly, rather then going thru verification process\n\n    .PARAMETER Name\n    Allows to pass Name directly, rather then going thru verification process\n\n    .PARAMETER Force\n    Allows to clear cache, useful when you want to force refresh\n\n    .EXAMPLE\n    $Identity = @(\n        'S-1-5-4'\n        'S-1-5-4'\n        'S-1-5-11'\n        'S-1-5-32-549'\n        'S-1-5-32-550'\n        'S-1-5-32-548'\n        'S-1-5-64-10'\n        'S-1-5-64-14'\n        'S-1-5-64-21'\n        'S-1-5-18'\n        'S-1-5-19'\n        'S-1-5-32-544'\n        'S-1-5-20-20-10-51' # Wrong SID\n        'S-1-5-21-853615985-2870445339-3163598659-512'\n        'S-1-5-21-3661168273-3802070955-2987026695-512'\n        'S-1-5-21-1928204107-2710010574-1926425344-512'\n        'CN=Test Test 2,OU=Users,OU=Production,DC=ad,DC=evotec,DC=pl'\n        'Test Local Group'\n        'przemyslaw.klys@evotec.pl'\n        'test2'\n        'NT AUTHORITY\\NETWORK'\n        'NT AUTHORITY\\SYSTEM'\n        'S-1-5-21-853615985-2870445339-3163598659-519'\n        'TEST\\some'\n        'EVOTECPL\\Domain Admins'\n        'NT AUTHORITY\\INTERACTIVE'\n        'INTERACTIVE'\n        'EVOTEC\\Domain Admins'\n        'EVOTECPL\\Domain Admins'\n        'Test\\Domain Admins'\n        'CN=S-1-5-21-1928204107-2710010574-1926425344-512,CN=ForeignSecurityPrincipals,DC=ad,DC=evotec,DC=xyz' # Valid\n        'CN=S-1-5-21-1928204107-2710010574-512,CN=ForeignSecurityPrincipals,DC=ad,DC=evotec,DC=xyz' # not valid\n        'CN=S-1-5-21-1928204107-2710010574-1926425344-512,CN=ForeignSecurityPrincipals,DC=ad,DC=evotec,DC=xyz' # cached\n    )\n\n    $TestOutput = Convert-Identity -Identity $Identity -Verbose\n\n    Output:\n\n    Name                                 SID                                            DomainName     Type                    Error\n    ----                                 ---                                            ----------     ----                    -----\n    NT AUTHORITY\\INTERACTIVE             S-1-5-4                                                       WellKnownGroup\n    NT AUTHORITY\\INTERACTIVE             S-1-5-4                                                       WellKnownGroup\n    NT AUTHORITY\\Authenticated Users     S-1-5-11                                                      WellKnownGroup\n    BUILTIN\\Server Operators             S-1-5-32-549                                                  WellKnownGroup\n    BUILTIN\\Print Operators              S-1-5-32-550                                                  WellKnownGroup\n    BUILTIN\\Account Operators            S-1-5-32-548                                                  WellKnownGroup\n    NT AUTHORITY\\NTLM Authentication     S-1-5-64-10                                                   WellKnownGroup\n    NT AUTHORITY\\SChannel Authentication S-1-5-64-14                                                   WellKnownGroup\n    NT AUTHORITY\\Digest Authentication   S-1-5-64-21                                                   WellKnownGroup\n    NT AUTHORITY\\SYSTEM                  S-1-5-18                                                      WellKnownAdministrative\n    NT AUTHORITY\\NETWORK SERVICE         S-1-5-19                                                      WellKnownGroup\n    BUILTIN\\Administrators               S-1-5-32-544                                                  WellKnownAdministrative\n    S-1-5-20-20-10-51                    S-1-5-20-20-10-51                                             Unknown                 Exception calling \"Translate\" with \"1\" argument(s): \"Some or all identity references could not be translated.\"\n    EVOTEC\\Domain Admins                 S-1-5-21-853615985-2870445339-3163598659-512   ad.evotec.xyz  Administrative\n    EVOTECPL\\Domain Admins               S-1-5-21-3661168273-3802070955-2987026695-512  ad.evotec.pl   Administrative\n    TEST\\Domain Admins                   S-1-5-21-1928204107-2710010574-1926425344-512  test.evotec.pl Administrative\n    EVOTECPL\\TestingAD                   S-1-5-21-3661168273-3802070955-2987026695-1111 ad.evotec.pl   NotAdministrative\n    EVOTEC\\Test Local Group              S-1-5-21-853615985-2870445339-3163598659-3610  ad.evotec.xyz  NotAdministrative\n    EVOTEC\\przemyslaw.klys               S-1-5-21-853615985-2870445339-3163598659-1105  ad.evotec.xyz  NotAdministrative\n    test2                                                                                              Unknown                 Exception calling \"Translate\" with \"1\" argument(s): \"Some or all identity references could not be translated.\"\n    NT AUTHORITY\\NETWORK                 S-1-5-2                                                       WellKnownGroup\n    NT AUTHORITY\\SYSTEM                  S-1-5-18                                                      WellKnownAdministrative\n    EVOTEC\\Enterprise Admins             S-1-5-21-853615985-2870445339-3163598659-519   ad.evotec.xyz  Administrative\n    TEST\\some                            S-1-5-21-1928204107-2710010574-1926425344-1106 test.evotec.pl NotAdministrative\n    EVOTECPL\\Domain Admins               S-1-5-21-3661168273-3802070955-2987026695-512  ad.evotec.pl   Administrative\n    NT AUTHORITY\\INTERACTIVE             S-1-5-4                                                       WellKnownGroup\n    NT AUTHORITY\\INTERACTIVE             S-1-5-4                                                       WellKnownGroup\n    EVOTEC\\Domain Admins                 S-1-5-21-853615985-2870445339-3163598659-512   ad.evotec.xyz  Administrative\n    EVOTECPL\\Domain Admins               S-1-5-21-3661168273-3802070955-2987026695-512  ad.evotec.pl   Administrative\n    TEST\\Domain Admins                   S-1-5-21-1928204107-2710010574-1926425344-512  test.evotec.pl Administrative\n    TEST\\Domain Admins                   S-1-5-21-1928204107-2710010574-1926425344-512  test.evotec.pl Administrative\n    S-1-5-21-1928204107-2710010574-512   S-1-5-21-1928204107-2710010574-512                            Unknown                 Exception calling \"Translate\" with \"1\" argument(s): \"Some or all identity references could not be translated.\"\n    TEST\\Domain Admins                   S-1-5-21-1928204107-2710010574-1926425344-512  test.evotec.pl Administrative\n\n    .NOTES\n    General notes\n    #>\n    [cmdletBinding(DefaultParameterSetName = 'Identity')]\n    param(\n        [parameter(ParameterSetName = 'Identity', Position = 0, ValueFromPipeline, ValueFromPipelineByPropertyName)][string[]] $Identity,\n        [parameter(ParameterSetName = 'SID', Mandatory)][System.Security.Principal.SecurityIdentifier[]] $SID,\n        [parameter(ParameterSetName = 'Name', Mandatory)][string[]] $Name,\n        [switch] $Force\n    )\n    Begin {\n        # [System.Security.Principal.WellKnownSidType]::BuiltinAccountOperatorsSid\n        if (-not $Script:GlobalCacheSidConvert -or $Force) {\n            $Script:GlobalCacheSidConvert = @{\n                # We probably don't need to build it up because4 we will be able to find it, but sometimes some of them are not available\n                'NT AUTHORITY\\SYSTEM'                         = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Administrators'\n                    SID        = 'S-1-5-18'\n                    DomainName = ''\n                    Type       = 'WellKnownAdministrative'\n                    Error      = ''\n                }\n                # 'NT AUTHORITY\\NETWORK SERVICE'                = [PSCustomObject] @{\n                #     Name       = 'NT AUTHORITY\\NETWORK SERVICE'\n                #     SID        = 'S-1-5-20' # or  'S-1-5-19'\n                #     DomainName = ''\n                #     Type       = 'WellKnownAdministrative'\n                #     Error      = ''\n                #}\n                'BUILTIN\\Administrators'                      = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Administrators'\n                    SID        = 'S-1-5-32-544'\n                    DomainName = ''\n                    Type       = 'WellKnownAdministrative'\n                    Error      = ''\n                }\n                'BUILTIN\\Users'                               = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Users'\n                    SID        = 'S-1-5-32-545'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Guests'                              = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Guests'\n                    SID        = 'S-1-5-32-546'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Power Users'                         = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Power Users'\n                    SID        = 'S-1-5-32-547'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Account Operators'                   = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Account Operators'\n                    SID        = 'S-1-5-32-548'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Server Operators'                    = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Server Operators'\n                    SID        = 'S-1-5-32-549'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Print Operators'                     = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Print Operators'\n                    SID        = 'S-1-5-32-550'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Backup Operators'                    = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Backup Operators'\n                    SID        = 'S-1-5-32-551'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Replicator'                          = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Replicators'\n                    SID        = 'S-1-5-32-552'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Pre-Windows 2000 Compatible Access'  = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Pre-Windows 2000 Compatible Access'\n                    SID        = 'S-1-5-32-554'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Remote Desktop Users'                = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Remote Desktop Users'\n                    SID        = 'S-1-5-32-555'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Network Configuration Operators'     = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Network Configuration Operators'\n                    SID        = 'S-1-5-32-556'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Incoming Forest Trust Builders'      = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Incoming Forest Trust Builders'\n                    SID        = 'S-1-5-32-557'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Performance Monitor Users'           = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Performance Monitor Users'\n                    SID        = 'S-1-5-32-558'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Performance Log Users'               = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Performance Log Users'\n                    SID        = 'S-1-5-32-559'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Windows Authorization Access Group'  = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Windows Authorization Access Group'\n                    SID        = 'S-1-5-32-560'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Terminal Server License Servers'     = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Terminal Server License Servers'\n                    SID        = 'S-1-5-32-561'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Distributed COM Users'               = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Distributed COM Users'\n                    SID        = 'S-1-5-32-562'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\IIS_IUSRS'                           = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\IIS_IUSRS'\n                    SID        = 'S-1-5-32-568'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Cryptographic Operators'             = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Cryptographic Operators'\n                    SID        = 'S-1-5-32-569'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Event Log Readers'                   = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Event Log Readers'\n                    SID        = 'S-1-5-32-573'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Certificate Service DCOM Access'     = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Certificate Service DCOM Access'\n                    SID        = 'S-1-5-32-574'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\RDS Remote Access Servers'           = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\RDS Remote Access Servers'\n                    SID        = 'S-1-5-32-575'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\RDS Endpoint Servers'                = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\RDS Endpoint Servers'\n                    SID        = 'S-1-5-32-576'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\RDS Management Servers'              = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\RDS Management Servers'\n                    SID        = 'S-1-5-32-577'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Hyper-V Administrators'              = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Hyper-V Administrators'\n                    SID        = 'S-1-5-32-578'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Access Control Assistance Operators' = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Access Control Assistance Operators'\n                    SID        = 'S-1-5-32-579'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'BUILTIN\\Remote Management Users'             = [PSCustomObject] @{\n                    Name       = 'BUILTIN\\Remote Management Users'\n                    SID        = 'S-1-5-32-580'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'Window Manager\\Window Manager Group'         = [PSCustomObject] @{\n                    Name       = 'Window Manager\\Window Manager Group'\n                    SID        = 'S-1-5-90-0'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'NT SERVICE\\WdiServiceHost'                   = [PSCustomObject] @{\n                    Name       = 'NT SERVICE\\WdiServiceHost'\n                    SID        = 'S-1-5-80-3139157870-2983391045-3678747466-658725712-1809340420'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'NT SERVICE\\MSSQLSERVER'                      = [PSCustomObject] @{\n                    Name       = 'NT SERVICE\\MSSQLSERVER'\n                    SID        = 'S-1-5-80-3880718306-3832830129-1677859214-2598158968-1052248003'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'NT SERVICE\\SQLSERVERAGENT'                   = [PSCustomObject] @{\n                    Name       = 'NT SERVICE\\SQLSERVERAGENT'\n                    SID        = 'S-1-5-80-344959196-2060754871-2302487193-2804545603-1466107430'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'NT SERVICE\\SQLTELEMETRY'                     = [PSCustomObject] @{\n                    Name       = 'NT SERVICE\\SQLTELEMETRY'\n                    SID        = 'S-1-5-80-2652535364-2169709536-2857650723-2622804123-1107741775'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                'NT SERVICE\\ADSync'                           = [PSCustomObject] @{\n                    Name       = 'NT SERVICE\\ADSync'\n                    SID        = 'S-1-5-80-3245704983-3664226991-764670653-2504430226-901976451'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n                # Azure Hybrid Instance Metadata Service\n                'NT Service\\himds'                            = [PSCustomObject] @{\n                    Name       = 'NT Service\\himds'\n                    SID        = 'S-1-5-80-4215458991-2034252225-2287069555-1155419622-2701885083'\n                    DomainName = ''\n                    Type       = 'WellKnownGroup'\n                    Error      = ''\n                }\n            }\n        }\n    }\n    Process {\n        if ($Identity) {\n            foreach ($Ident in $Identity) {\n                $MatchRegex = [Regex]::Matches($Ident, \"S-\\d-\\d+-(\\d+-|){1,14}\\d+\")\n                if ($Script:GlobalCacheSidConvert[$Ident]) {\n                    # If we cached it, lets return it right away\n                    Write-Verbose \"Convert-Identity - Processing $Ident (Cache)\"\n                    $Script:GlobalCacheSidConvert[$Ident]\n                } elseif ($MatchRegex.Success) {\n                    # regex check if SID .. do something\n                    #$MatchRegex = [Regex]::IsMatch($Ident, \"S-\\d-\\d+-(\\d+-){1,14}\\d+\")\n                    #$MatchRegex = [Regex]::Matches($Ident, \"S-\\d-\\d+-(\\d+-){1,4}\\d+\")\n                    Write-Verbose \"Convert-Identity - Processing $Ident (SID)\"\n                    if ($MatchRegex.Value -ne $Ident) {\n                        $Script:GlobalCacheSidConvert[$Ident] = ConvertFrom-SID -SID $MatchRegex.Value\n                    } else {\n                        $Script:GlobalCacheSidConvert[$Ident] = ConvertFrom-SID -SID $Ident\n                    }\n                    $Script:GlobalCacheSidConvert[$Ident]\n                } elseif ($Ident -like '*DC=*') {\n                    # check if DN\n                    Write-Verbose \"Convert-Identity - Processing $Ident (DistinguishedName)\"\n                    try {\n                        $Object = [adsi]\"LDAP://$($Ident)\"\n                        $SIDValue = [System.Security.Principal.SecurityIdentifier]::new($Object.objectSid.Value, 0).Value\n                        $Script:GlobalCacheSidConvert[$Ident] = ConvertFrom-SID -SID $SIDValue\n                    } catch {\n                        $Script:GlobalCacheSidConvert[$Ident] = [PSCustomObject] @{\n                            Name       = $Ident\n                            SID        = $null\n                            DomainName = ''\n                            Type       = 'Unknown'\n                            Error      = $_.Exception.Message -replace [environment]::NewLine, ' '\n                        }\n                    }\n                    $Script:GlobalCacheSidConvert[$Ident]\n                } else {\n                    # Other types\n                    Write-Verbose \"Convert-Identity - Processing $Ident (Other)\"\n                    try {\n                        $SIDValue = ([System.Security.Principal.NTAccount] $Ident).Translate([System.Security.Principal.SecurityIdentifier]).Value\n                        $Script:GlobalCacheSidConvert[$Ident] = ConvertFrom-SID -SID $SIDValue\n                    } catch {\n                        $Script:GlobalCacheSidConvert[$Ident] = [PSCustomObject] @{\n                            Name       = $Ident\n                            SID        = $null\n                            DomainName = ''\n                            Type       = 'Unknown'\n                            Error      = $_.Exception.Message -replace [environment]::NewLine, ' '\n                        }\n                    }\n                    $Script:GlobalCacheSidConvert[$Ident]\n                }\n            }\n        } else {\n            if ($SID) {\n                foreach ($S in $SID) {\n                    if ($Script:GlobalCacheSidConvert[$S]) {\n                        $Script:GlobalCacheSidConvert[$S]\n                    } else {\n                        $Script:GlobalCacheSidConvert[$S] = ConvertFrom-SID -SID $S\n                        $Script:GlobalCacheSidConvert[$S]\n                    }\n                }\n            } else {\n                foreach ($Ident in $Name) {\n                    if ($Script:GlobalCacheSidConvert[$Ident]) {\n                        $Script:GlobalCacheSidConvert[$Ident]\n                    } else {\n                        $Script:GlobalCacheSidConvert[$Ident] = ([System.Security.Principal.NTAccount] $Ident).Translate([System.Security.Principal.SecurityIdentifier]).Value\n                        $Script:GlobalCacheSidConvert[$Ident]\n                    }\n                }\n            }\n        }\n    }\n    End {}\n}"
  },
  {
    "path": "Public/Converts/Convert-KeyToValue.ps1",
    "content": "function Convert-KeyToKeyValue {\n    <#\n    .SYNOPSIS\n    Converts keys of an object to key-value pairs.\n\n    .DESCRIPTION\n    This function takes an object and converts its keys to key-value pairs, where the key is the original key concatenated with its corresponding value.\n\n    .PARAMETER Object\n    Specifies the object whose keys are to be converted to key-value pairs.\n\n    .EXAMPLE\n    $Object = @{\n        Key1 = 'Value1'\n        Key2 = 'Value2'\n    }\n    Convert-KeyToKeyValue -Object $Object\n    # Returns a new hash table with keys as 'Key1 (Value1)' and 'Key2 (Value2)'.\n\n    #>\n    [CmdletBinding()]\n    param (\n        [object] $Object\n    )\n    $NewHash = [ordered] @{}\n    foreach ($O in $Object.Keys) {\n        $KeyName = \"$O ($($Object.$O))\"\n        $KeyValue = $Object.$O\n        $NewHash.$KeyName = $KeyValue\n    }\n    return $NewHash\n}"
  },
  {
    "path": "Public/Converts/Convert-Office365License.ps1",
    "content": "﻿function Convert-Office365License {\n    <#\n    .SYNOPSIS\n    Converts Office 365 licenses between their names and SKUs.\n\n    .DESCRIPTION\n    This function allows for the conversion of Office 365 licenses between their names and SKUs. It provides flexibility to handle multiple values for licenses.\n\n    .PARAMETER License\n    Specifies the Office 365 license SKU or name to convert. Supports multiple values.\n\n    .PARAMETER ToSku\n    Indicates whether to convert the license name to SKU.\n\n    .PARAMETER Separator\n    Specifies the separator to use when returning multiple values.\n\n    .PARAMETER ReturnArray\n    Indicates whether to return the result as an array.\n\n    .EXAMPLE\n    Convert-Office365License -License 'VISIOCLIENT','PROJECTONLINE_PLAN_1','test','tenant:VISIOCLIENT'\n    Converts the specified licenses to their corresponding SKUs.\n\n    .EXAMPLE\n    Convert-Office365License -License \"Office 365 A3 for faculty\", \"Project Plan 3 (for Department)\", 'test' -ToSku\n    Converts the specified license names to their corresponding SKUs.\n\n    .NOTES\n    For more information on Office 365 licensing, refer to: https://learn.microsoft.com/en-us/azure/active-directory/enterprise-users/licensing-service-plan-reference\n    #>\n    [CmdletBinding()]\n    param(\n        [Parameter(Position = 0, ValueFromPipeline)][Array] $License,\n        [alias('SKU')][switch] $ToSku,\n        [string] $Separator = ', ',\n        [switch] $ReturnArray\n    )\n    Begin {\n        $O365SKU = [ordered] @{\n            'AAD_BASIC'                                                             = \"Azure Active Directory Basic\"\n            'AAD_BASIC_EDU'                                                         = \"Azure Active Directory Basic for Education\"\n            'AAD_EDU'                                                               = \"Azure Active Directory for Education\"\n            'AAD_PREMIUM'                                                           = \"Azure Active Directory Premium P1\"\n            'AAD_PREMIUM_FACULTY'                                                   = \"Azure Active Directory Premium P1 for Faculty\"\n            'AAD_PREMIUM_P2'                                                        = \"Azure Active Directory Premium P2\"\n            'AAD_SMB'                                                               = \"Azure Active Directory\"\n            'ADALLOM_FOR_AATP'                                                      = \"SecOps Investigation for MDI\"\n            'ADALLOM_O365'                                                          = \"Office 365 Cloud App Security\"\n            'ADALLOM_S_DISCOVERY'                                                   = \"CLOUD APP SECURITY DISCOVERY\"\n            'ADALLOM_S_O365'                                                        = \"Office 365 Cloud App Security\"\n            'ADALLOM_S_STANDALONE'                                                  = \"MICROSOFT CLOUD APP SECURITY\"\n            'ADALLOM_S_STANDALONE_DOD'                                              = \"Microsoft Defender for Cloud Apps for DOD\"\n            'ADALLOM_STANDALONE'                                                    = \"Microsoft Cloud App Security\"\n            'ADV_COMMS'                                                             = \"Advanced Communications\"\n            'ATA'                                                                   = \"Microsoft Defender for Identity\"\n            'ATP_ENTERPRISE'                                                        = \"Microsoft Defender for Office 365 (Plan 1)\"\n            'ATP_ENTERPRISE_FACULTY'                                                = \"Microsoft Defender for Office 365 (Plan 1) Faculty\"\n            'ATP_ENTERPRISE_GOV'                                                    = \"Microsoft Defender for Office 365 (Plan 1) GCC\"\n            'AX7_USER_TRIAL'                                                        = \"Microsoft Dynamics AX7 User Trial\"\n            'BI_AZURE_P_2_GOV'                                                      = \"Power BI Pro for Government\"\n            'BI_AZURE_P0'                                                           = \"Power BI (free)\"\n            'BI_AZURE_P1'                                                           = \"Microsoft Power BI Reporting and Analytics Plan 1\"\n            'BI_AZURE_P2'                                                           = \"Power BI Pro\"\n            'BI_AZURE_P3'                                                           = \"Power BI Premium Per User\"\n            'BPOS_S_DlpAddOn'                                                       = \"Data Loss Prevention\"\n            'BPOS_S_TODO_1'                                                         = \"To-Do (Plan 1)\"\n            'BPOS_S_TODO_2'                                                         = \"To-Do (Plan 2)\"\n            'BPOS_S_TODO_3'                                                         = \"To-Do (Plan 3)\"\n            'BPOS_S_TODO_FIRSTLINE'                                                 = \"To-Do (Firstline)\"\n            'CCIBOTS_PRIVPREV_VIRAL'                                                = \"Power Virtual Agents Viral Trial\"\n            'CDS_ATTENDED_RPA'                                                      = \"Common Data Service Attended RPA\"\n            'CDS_CUSTOMER_INSIGHTS'                                                 = \"Common Data Service for Customer Insights\"\n            'CDS_CUSTOMER_INSIGHTS_BASE'                                            = \"Dataverse for Customer Insights�BASE\"\n            'CDS_CUSTOMER_INSIGHTS_TRIAL'                                           = \"Common Data Service for Customer Insights Trial\"\n            'CDS_DB_CAPACITY'                                                       = \"Common Data Service Database Capacity\"\n            'CDS_DB_CAPACITY_GOV'                                                   = \"Common Data Service Database Capacity for Government\"\n            'CDS_FILE_CAPACITY'                                                     = \"Common Data Service for Apps File Capacity\"\n            'CDS_Flow_Business_Process'                                             = \"Common data service for Flow per business process plan\"\n            'CDS_FORM_PRO_USL'                                                      = \"Common Data Service\"\n            'CDS_LOG_CAPACITY'                                                      = \"Common Data Service Log Capacity\"\n            'CDS_O365_E5_KM'                                                        = \"Common Data Service for SharePoint Syntex\"\n            'CDS_O365_F1'                                                           = \"Common Data Service for Teams\"\n            'CDS_O365_F1_GCC'                                                       = \"Common Data Service for Teams_F1 GCC\"\n            'CDS_O365_P1'                                                           = \"COMMON DATA SERVICE FOR TEAMS_P1\"\n            'CDS_O365_P1_GCC'                                                       = \"Common Data Service for Teams_P1 GCC\"\n            'CDS_O365_P2'                                                           = \"Common Data Service for Teams\"\n            'CDS_O365_P2_GCC'                                                       = \"COMMON DATA SERVICE FOR TEAMS_P2 GCC\"\n            'CDS_O365_P3'                                                           = \"Common Data Service for Teams\"\n            'CDS_O365_P3_GCC'                                                       = \"Common Data Service for Teams\"\n            'CDS_PER_APP'                                                           = \"CDS PowerApps per app plan\"\n            'CDS_PER_APP_IWTRIAL'                                                   = \"CDS Per app baseline access\"\n            'CDS_POWERAPPS_PORTALS_LOGIN'                                           = \"Common Data Service Power Apps Portals Login Capacity\"\n            'CDS_POWERAPPS_PORTALS_LOGIN_GCC'                                       = \"Common Data Service Power Apps Portals Login Capacity for GCC\"\n            'CDS_POWERAPPS_PORTALS_PAGEVIEW'                                        = \"CDS PowerApps Portals page view capacity add-on\"\n            'CDS_POWERAPPS_PORTALS_PAGEVIEW_GCC'                                    = \"CDS PowerApps Portals page view capacity add-on for GCC\"\n            'CDS_REMOTE_ASSIST'                                                     = \"Common Data Service for Remote Assist\"\n            'CDS_UNATTENDED_RPA'                                                    = \"Common Data Service Unattended RPA\"\n            'CDS_VIRTUAL_AGENT_BASE'                                                = \"Common Data Service for Virtual Agent Base\"\n            'CDS_VIRTUAL_AGENT_USL'                                                 = \"Common Data Service\"\n            'CDSAICAPACITY'                                                         = \"AI Builder Capacity add-on\"\n            'CDSAICAPACITY_PERAPP'                                                  = \"AI Builder capacity Per App add-on\"\n            'CDSAICAPACITY_PERUSER'                                                 = \"AI Builder capacity Per User add-on\"\n            'CDSAICAPACITY_PERUSER_NEW'                                             = \"AI Builder capacity Per User add-on\"\n            'CMPA_addon'                                                            = \"Compliance Manager Premium Assessment Add-On\"\n            'CMPA_addon_GCC'                                                        = \"Compliance Manager Premium Assessment Add-On for GCC\"\n            'COMMUNICATIONS_COMPLIANCE'                                             = \"Microsoft Communications Compliance\"\n            'COMMUNICATIONS_DLP'                                                    = \"Microsoft Communications DLP\"\n            'COMPLIANCE_MANAGER_PREMIUM_ASSESSMENT_ADDON'                           = \"Compliance Manager Premium Assessment Add-On\"\n            'Content_Explorer'                                                      = \"Information Protection and Governance Analytics - Premium\"\n            'ContentExplorer_Standard'                                              = \"Information Protection and Governance Analytics � Standard\"\n            'CORTEX'                                                                = \"Microsoft Viva Topics\"\n            'CPC_1'                                                                 = \"Windows 365 Enterprise 2 vCPU 4 GB 128 GB\"\n            'CPC_2'                                                                 = \"Windows 365 Enterprise 2 vCPU 8 GB 128 GB\"\n            'CPC_B_1C_2RAM_64GB'                                                    = \"Windows 365 Business 1 vCPU 2 GB 64 GB\"\n            'CPC_B_2C_4RAM_128GB'                                                   = \"Windows 365 Business 2 vCPU 4 GB 128 GB\"\n            'CPC_B_2C_4RAM_256GB'                                                   = \"Windows 365 Business 2 vCPU 4 GB 256 GB\"\n            'CPC_B_2C_4RAM_64GB'                                                    = \"Windows 365 Business 2 vCPU 4 GB 64 GB\"\n            'CPC_B_2C_8RAM_128GB'                                                   = \"Windows 365 Business 2 vCPU 8 GB 128 GB\"\n            'CPC_B_2C_8RAM_256GB'                                                   = \"Windows 365 Business 2 vCPU 8 GB 256 GB\"\n            'CPC_B_4C_16RAM_128GB'                                                  = \"Windows 365 Business 4 vCPU 16 GB 128 GB\"\n            'CPC_B_4C_16RAM_128GB_WHB'                                              = \"Windows 365 Business 4 vCPU 16 GB 128 GB (with Windows Hybrid Benefit)\"\n            'CPC_B_4C_16RAM_256GB'                                                  = \"Windows 365 Business 4 vCPU 16 GB 256 GB\"\n            'CPC_B_4C_16RAM_512GB'                                                  = \"Windows 365 Business 4 vCPU 16 GB 512 GB\"\n            'CPC_B_8C_32RAM_128GB'                                                  = \"Windows 365 Business 8 vCPU 32 GB 128 GB\"\n            'CPC_B_8C_32RAM_256GB'                                                  = \"Windows 365 Business 8 vCPU 32 GB 256 GB\"\n            'CPC_B_8C_32RAM_512GB'                                                  = \"Windows 365 Business 8 vCPU 32 GB 512 GB\"\n            'CPC_E_1C_2GB_64GB'                                                     = \"Windows 365 Enterprise 1 vCPU 2 GB 64 GB\"\n            'CPC_E_2C_4GB_128GB'                                                    = \"Windows 365 Enterprise 2 vCPU 4 GB 128 GB\"\n            'CPC_E_2C_4GB_256GB'                                                    = \"Windows 365 Enterprise 2 vCPU 4 GB 256 GB\"\n            'CPC_E_2C_4GB_64GB'                                                     = \"Windows 365 Enterprise 2 vCPU 4 GB 64 GB\"\n            'CPC_E_2C_8GB_128GB'                                                    = \"Windows 365 Enterprise 2 vCPU 8 GB 128 GB\"\n            'CPC_E_2C_8GB_256GB'                                                    = \"Windows 365 Enterprise 2 vCPU 8 GB 256 GB\"\n            'CPC_E_4C_16GB_128GB'                                                   = \"Windows 365 Enterprise 4 vCPU 16 GB 128 GB\"\n            'CPC_E_4C_16GB_256GB'                                                   = \"Windows 365 Enterprise 4 vCPU 16 GB 256 GB\"\n            'CPC_E_4C_16GB_512GB'                                                   = \"Windows 365 Enterprise 4 vCPU 16 GB 512 GB\"\n            'CPC_E_8C_32GB_128GB'                                                   = \"Windows 365 Enterprise 8 vCPU 32 GB 128 GB\"\n            'CPC_E_8C_32GB_256GB'                                                   = \"Windows 365 Enterprise 8 vCPU 32 GB 256 GB\"\n            'CPC_E_8C_32GB_512GB'                                                   = \"Windows 365 Enterprise 8 vCPU 32 GB 512 GB\"\n            'CPC_LVL_1'                                                             = \"Windows 365 Enterprise 2 vCPU 4 GB 128 GB (Preview)\"\n            'CPC_LVL_2'                                                             = \"Windows 365 Enterprise 2 vCPU 8 GB 128 GB (Preview)\"\n            'CPC_LVL_3'                                                             = \"Windows 365 Enterprise 4 vCPU 16 GB 256 GB (Preview)\"\n            'CPC_S_2C_4GB_128GB'                                                    = \"Windows 365 Shared Use 2 vCPU 4 GB 128 GB\"\n            'CPC_S_2C_4GB_256GB'                                                    = \"Windows 365 Shared Use 2 vCPU 4 GB 256 GB\"\n            'CPC_S_2C_4GB_64GB'                                                     = \"Windows 365 Shared Use 2 vCPU 4 GB 64 GB\"\n            'CPC_S_2C_8GB_128GB'                                                    = \"Windows 365 Shared Use 2 vCPU 8 GB 128 GB\"\n            'CPC_S_2C_8GB_256GB'                                                    = \"Windows 365 Shared Use 2 vCPU 8 GB 256 GB\"\n            'CPC_S_4C_16GB_128GB'                                                   = \"Windows 365 Shared Use 4 vCPU 16 GB 128 GB\"\n            'CPC_S_4C_16GB_256GB'                                                   = \"Windows 365 Shared Use 4 vCPU 16 GB 256 GB\"\n            'CPC_S_4C_16GB_512GB'                                                   = \"Windows 365 Shared Use 4 vCPU 16 GB 512 GB\"\n            'CPC_S_8C_32GB_128GB'                                                   = \"Windows 365 Shared Use 8 vCPU 32 GB 128 GB\"\n            'CPC_S_8C_32GB_256GB'                                                   = \"Windows 365 Shared Use 8 vCPU 32 GB 256 GB\"\n            'CPC_S_8C_32GB_512GB'                                                   = \"Windows 365 Shared Use 8 vCPU 32 GB 512 GB\"\n            'CPC_SS_2'                                                              = \"Windows 365 Business 2 vCPU, 8 GB, 128 GB\"\n            'CRM_AUTO_ROUTING_ADDON'                                                = \"Dynamics 365 Field Service, Enterprise Edition - Resource Scheduling Optimization\"\n            'CRM_AUTO_ROUTING_ENGINE_ADDON'                                         = \"Field Service � Automated Routing Engine Add-On\"\n            'CRM_HYBRIDCONNECTOR'                                                   = \"Dynamics 365 Hybrid Connector\"\n            'CRM_ONLINE_PORTAL'                                                     = \"Dynamics 365 Enterprise Edition - Additional Portal (Qualified Offer)\"\n            'CRMINSTANCE'                                                           = \"Dynamics 365 - Additional Production Instance (Qualified Offer)\"\n            'CRMPLAN2'                                                              = \"Microsoft Dynamics CRM Online Basic\"\n            'CRMSTANDARD'                                                           = \"Microsoft Dynamics CRM Online\"\n            'CRMSTORAGE'                                                            = \"Dynamics 365 - Additional Database Storage (Qualified Offer)\"\n            'CRMTESTINSTANCE'                                                       = \"Dynamics 365 - Additional Non-Production Instance (Qualified Offer)\"\n            'CUSTOMER_KEY'                                                          = \"Microsoft Customer Key\"\n            'CUSTOMER_VOICE_ADDON'                                                  = \"Dynamics Customer Voice Add-On\"\n            'Customer_Voice_Base'                                                   = \"Dynamics 365 Customer Voice Base Plan\"\n            'Customer_Voice_Customer_Insights'                                      = \"Microsoft Dynamics 365 Customer Voice for Customer Insights App\"\n            'CUSTOMER_VOICE_DYN365_VIRAL_TRIAL'                                     = \"Customer Voice for Dynamics 365 vTrial\"\n            'D365_AssetforSCM'                                                      = \"Asset Maintenance Add-in\"\n            'D365_CSI_EMBED_CE'                                                     = \"Dynamics 365 Customer Service Insights for CE Plan\"\n            'D365_CSI_EMBED_CSEnterprise'                                           = \"Dynamics 365 Customer Service Insights for CS Enterprise\"\n            'D365_CUSTOMER_SERVICE_ENT_ATTACH'                                      = \"Dynamics 365 for Customer Service Enterprise Attach to Qualifying Dynamics 365 Base Offer A\"\n            'D365_FIELD_SERVICE_ATTACH'                                             = \"Dynamics 365 for Field Service Attach to Qualifying Dynamics 365 Base Offer\"\n            'D365_Finance'                                                          = \"Microsoft Dynamics 365 for Finance\"\n            'D365_IOTFORSCM'                                                        = \"Iot Intelligence Add-in for D365 Supply Chain Management\"\n            'D365_IOTFORSCM_ADDITIONAL'                                             = \"IoT Intelligence Add-in Additional Machines\"\n            'D365_MARKETING_USER'                                                   = \"Dynamics 365 for Marketing USL\"\n            'D365_ProjectOperations'                                                = \"Dynamics 365 Project Operations\"\n            'D365_ProjectOperationsCDS'                                             = \"Dynamics 365 Project Operations CDS\"\n            'D365_SALES_ENT_ATTACH'                                                 = \"Dynamics 365 Sales Enterprise Attach to Qualifying Dynamics 365 Base Offer\"\n            'D365_SALES_PRO'                                                        = \"Dynamics 365 For Sales Professional\"\n            'D365_SALES_PRO_ATTACH'                                                 = \"Dynamics 365 Sales Professional Attach to Qualifying Dynamics 365 Base Offer\"\n            'D365_SALES_PRO_IW'                                                     = \"Dynamics 365 For Sales Professional Trial\"\n            'D365_SALES_PRO_IW_Trial'                                               = \"Dynamics 365 for Sales Professional Trial\"\n            'D365_SCM'                                                              = \"DYNAMICS 365 FOR SUPPLY CHAIN MANAGEMENT\"\n            'DATA_INVESTIGATIONS'                                                   = \"Microsoft Data Investigations\"\n            'DATAVERSE_FOR_POWERAUTOMATE_DESKTOP'                                   = \"Dataverse for PAD\"\n            'DATAVERSE_POWERAPPS_PER_APP_NEW'                                       = \"Dataverse for Power Apps per app\"\n            'DDYN365_CDS_DYN_P2'                                                    = \"COMMON DATA SERVICE\"\n            'DEFENDER_ENDPOINT_P1'                                                  = \"Microsoft Defender for Endpoint P1\"\n            'DEFENDER_ENDPOINT_P1_EDU'                                              = \"Microsoft Defender for Endpoint P1 for EDU\"\n            'Defender_Threat_Intelligence'                                          = \"Defender Threat Intelligence\"\n            'Deskless'                                                              = \"Microsoft StaffHub\"\n            'DESKLESSPACK'                                                          = \"Office 365 F3\"\n            'DEVELOPERPACK'                                                         = \"Office 365 E3 Developer\"\n            'DEVELOPERPACK_E5'                                                      = \"Microsoft 365 E5 Developer (without Windows and Audio Conferencing)\"\n            'DYN365_ ENTERPRISE _RELATIONSHIP_SALES'                                = \"Microsoft Relationship Sales solution\"\n            'DYN365_AI_SERVICE_INSIGHTS'                                            = \"Dynamics 365 Customer Service Insights Trial\"\n            'DYN365_ASSETMANAGEMENT'                                                = \"Dynamics 365 Asset Management Addl Assets\"\n            'DYN365_BUSCENTRAL_ADD_ENV_ADDON'                                       = \"Dynamics 365 Business Central Additional Environment Addon\"\n            'DYN365_BUSCENTRAL_DB_CAPACITY'                                         = \"Dynamics 365 Business Central Database Capacity\"\n            'DYN365_BUSCENTRAL_ENVIRONMENT'                                         = \"Dynamics 365 Business Central Additional Environment Addon\"\n            'DYN365_BUSCENTRAL_ESSENTIAL'                                           = \"Dynamics 365 Business Central Essentials\"\n            'DYN365_BUSCENTRAL_PREMIUM'                                             = \"Dynamics 365 Business Central Premium\"\n            'DYN365_BUSCENTRAL_TEAM_MEMBER'                                         = \"Dynamics 365 Business Central Team Members\"\n            'DYN365_BUSINESS_MARKETING'                                             = \"Dynamics 365 for Marketing Business Edition\"\n            'DYN365_CDS_CCI_BOTS'                                                   = \"Common Data Service for CCI Bots\"\n            'DYN365_CDS_DEV_VIRAL'                                                  = \"Common Data Service - DEV VIRAL\"\n            'DYN365_CDS_DYN_APPS'                                                   = \"Common Data Service\"\n            'DYN365_CDS_FINANCE'                                                    = \"Common Data Service for Dynamics 365 Finance\"\n            'DYN365_CDS_FOR_PROJECT_P1'                                             = \"COMMON DATA SERVICE FOR PROJECT P1\"\n            'DYN365_CDS_FORMS_PRO'                                                  = \"Common Data Service\"\n            'DYN365_CDS_GUIDES'                                                     = \"Common Data Service\"\n            'DYN365_CDS_O365_F1'                                                    = \"Common Data Service\"\n            'DYN365_CDS_O365_F1_GCC'                                                = \"Common Data Service - O365 F1\"\n            'DYN365_CDS_O365_P1'                                                    = \"Common Data Service - O365 P1\"\n            'DYN365_CDS_O365_P1_GCC'                                                = \"Common Data Service - O365 P1 GCC\"\n            'DYN365_CDS_O365_P2'                                                    = \"Common Data Service\"\n            'DYN365_CDS_O365_P2_GCC'                                                = \"COMMON DATA SERVICE - O365 P2 GCC\"\n            'DYN365_CDS_O365_P3'                                                    = \"Common Data Service\"\n            'DYN365_CDS_O365_P3_GCC'                                                = \"Common Data Service\"\n            'DYN365_CDS_P1_GOV'                                                     = \"Common Data Service for Government\"\n            'DYN365_CDS_P2'                                                         = \"Common Data Service - P2\"\n            'DYN365_CDS_P2_GOV'                                                     = \"Common Data Service for Government\"\n            'DYN365_CDS_PROJECT'                                                    = \"Common Data Service for Project\"\n            'DYN365_CDS_SUPPLYCHAINMANAGEMENT'                                      = \"COMMON DATA SERVICE FOR DYNAMICS 365 SUPPLY CHAIN MANAGEMENT\"\n            'DYN365_CDS_VIRAL'                                                      = \"Common Data Service\"\n            'DYN365_CS_CHAT'                                                        = \"Dynamics 365 for Customer Service Chat\"\n            'DYN365_CS_CHAT_FPA'                                                    = \"Dynamics 365 Customer Service Chat Application Integration\"\n            'DYN365_CS_ENTERPRISE_VIRAL_TRIAL'                                      = \"Dynamics 365 Customer Service Enterprise vTrial\"\n            'DYN365_CS_MESSAGING_TPS'                                               = \"Dynamics 365 Customer Service Digital Messaging add-on\"\n            'DYN365_CS_MESSAGING_VIRAL_TRIAL'                                       = \"Dynamics 365 Customer Service Digital Messaging vTrial\"\n            'DYN365_CS_VOICE'                                                       = \"Dynamics 365 for Customer Service Voice Add-in\"\n            'DYN365_CS_VOICE_VIRAL_TRIAL'                                           = \"Dynamics 365 Customer Service Voice vTrial\"\n            'DYN365_CUSTOMER_INSIGHTS_ATTACH'                                       = \"Dynamics 365 Customer Insights Attach\"\n            'DYN365_CUSTOMER_INSIGHTS_BASE'                                         = \"Dynamics 365 Customer Insights Standalone\"\n            'DYN365_CUSTOMER_INSIGHTS_ENGAGEMENT_INSIGHTS_BASE'                     = \"Dynamics 365 Customer Insights Engagement Insights\"\n            'DYN365_CUSTOMER_INSIGHTS_ENGAGEMENT_INSIGHTS_BASE_TRIAL'               = \"Dynamics 365 Customer Insights Engagement Insights Viral\"\n            'DYN365_CUSTOMER_INSIGHTS_VIRAL'                                        = \"Dynamics 365 Customer Insights vTrial\"\n            'DYN365_CUSTOMER_SERVICE_PRO'                                           = \"Dynamics 365 Customer Service Professional\"\n            'DYN365_CUSTOMER_VOICE_ADDON'                                           = \"Dynamics 365 Customer Voice Additional Responses\"\n            'DYN365_CUSTOMER_VOICE_BASE'                                            = \"Dynamics 365 Customer Voice\"\n            'DYN365_ENTERPRISE_CASE_MANAGEMENT'                                     = \"Dynamics 365 for Case Management Enterprise Edition\"\n            'DYN365_ENTERPRISE_CUSTOMER_SERVICE'                                    = \"Dynamics 365 for Customer Service Enterprise Edition\"\n            'DYN365_ENTERPRISE_FIELD_SERVICE'                                       = \"Dynamics 365 for Field Service Enterprise Edition\"\n            'DYN365_ENTERPRISE_P1'                                                  = \"Dynamics 365 P1\"\n            'DYN365_ENTERPRISE_P1_IW'                                               = \"Dynamics 365 P1 Tria for Information Workers\"\n            'DYN365_ENTERPRISE_PLAN1'                                               = \"Dynamics 365 Customer Engagement Plan\"\n            'DYN365_ENTERPRISE_SALES'                                               = \"Dynamics 365 for Sales Enterprise Edition\"\n            'DYN365_ENTERPRISE_SALES_CUSTOMERSERVICE'                               = \"Dynamics 365 for Sales and Customer Service Enterprise Edition\"\n            'DYN365_Enterprise_Talent_Attract_TeamMember'                           = \"DYNAMICS 365 FOR TALENT - ATTRACT EXPERIENCE TEAM MEMBER\"\n            'DYN365_Enterprise_Talent_Onboard_TeamMember'                           = \"DYNAMICS 365 FOR TALENT - ONBOARD EXPERIENCE\"\n            'DYN365_ENTERPRISE_TEAM_MEMBERS'                                        = \"Dynamics 365 for Team Members Enterprise Edition\"\n            'DYN365_FINANCE'                                                        = \"Dynamics 365 Finance\"\n            'DYN365_FINANCIALS_ACCOUNTANT'                                          = \"Dynamics 365 Business Central External Accountant\"\n            'DYN365_FINANCIALS_ACCOUNTANT_SKU'                                      = \"Dynamics 365 Business Central External Accountant\"\n            'DYN365_FINANCIALS_BUSINESS'                                            = \"Dynamics 365 for Business Central Essentials\"\n            'DYN365_FINANCIALS_BUSINESS_SKU'                                        = \"Dynamics 365 for Financials Business Edition\"\n            'DYN365_FINANCIALS_TEAM_MEMBERS'                                        = \"Dynamics 365 for Team Members\"\n            'DYN365_FS_ENTERPRISE_VIRAL_TRIAL'                                      = \"Dynamics 365 Field Service Enterprise vTrial\"\n            'DYN365_IOT_INTELLIGENCE_ADDL_MACHINES'                                 = \"Sensor Data Intelligence Additional Machines Add-in for Dynamics 365 Supply Chain Management\"\n            'DYN365_IOT_INTELLIGENCE_SCENARIO'                                      = \"Sensor Data Intelligence Scenario Add-in for Dynamics 365 Supply Chain Management\"\n            'DYN365_MARKETING_50K_CONTACT_ADDON'                                    = \"Dynamics 365 for Marketing 50K Addnl Contacts\"\n            'DYN365_MARKETING_APP'                                                  = \"Dynamics 365 for Marketing\"\n            'DYN365_MARKETING_APP_ATTACH'                                           = \"Dynamics 365 for Marketing Attach\"\n            'DYN365_MARKETING_APPLICATION_ADDON'                                    = \"Dynamics 365 for Marketing Additional Application\"\n            'DYN365_MARKETING_CONTACT_ADDON_T3'                                     = \"Dynamics 365 for Marketing Addnl Contacts Tier 3\"\n            'DYN365_MARKETING_CONTACT_ADDON_T5'                                     = \"Dynamics 365 for Marketing Addnl Contacts Tier 5\"\n            'DYN365_MARKETING_MSE_USER'                                             = \"Dynamics 365 for Marketing MSE User\"\n            'DYN365_MARKETING_SANDBOX_APPLICATION_ADDON'                            = \"Dynamics 365 for Marketing Additional Non-Prod Application\"\n            'DYN365_MARKETING_USER'                                                 = \"Dynamics 365 for Marketing USL\"\n            'DYN365_REGULATORY_SERVICE'                                             = \"Dynamics 365 Regulatory Service - Enterprise Edition Trial\"\n            'DYN365_RETAIL_DEVICE'                                                  = \"Dynamics 365 for Retail Device\"\n            'DYN365_RETAIL_TRIAL'                                                   = \"Dynamics 365 Commerce Trial\"\n            'DYN365_SALES_ENTERPRISE_VIRAL_TRIAL'                                   = \"Dynamics 365 Sales Enterprise vTrial\"\n            'DYN365_SALES_INSIGHTS'                                                 = \"Dynamics 365 AI for Sales (Embedded)\"\n            'DYN365_SALES_INSIGHTS_VIRAL_TRIAL'                                     = \"Dynamics 365 Sales Insights vTrial\"\n            'DYN365_SALES_PREMIUM'                                                  = \"Dynamics 365 Sales Premium\"\n            'DYN365_SALES_PRO'                                                      = \"Dynamics 365 for Sales Professional\"\n            'DYN365_SCM'                                                            = \"Dynamics 365 for Supply Chain Management\"\n            'DYN365_TALENT_ENTERPRISE'                                              = \"DYNAMICS 365 FOR TALENT\"\n            'DYN365_TEAM_MEMBERS'                                                   = \"Dynamics 365 Team Members\"\n            'DYN365BC_MS_INVOICING'                                                 = \"Microsoft Invoicing\"\n            'Dynamics_365_Customer_Service_Enterprise_admin_trial'                  = \"Dynamics 365 Customer Service Enterprise Admin\"\n            'Dynamics_365_Customer_Service_Enterprise_viral_trial'                  = \"Dynamics 365 Customer Service Enterprise Viral Trial\"\n            'Dynamics_365_Field_Service_Enterprise_viral_trial'                     = \"Dynamics 365 Field Service Viral Trial\"\n            'Dynamics_365_for_HCM_Trial'                                            = \"Dynamics 365 for HCM Trial\"\n            'Dynamics_365_for_Operations'                                           = \"Dynamics 365 UNF OPS Plan ENT Edition\"\n            'Dynamics_365_for_Operations_Devices'                                   = \"Dynamics 365 Operations - Device\"\n            'Dynamics_365_for_Operations_Sandbox_Tier2'                             = \"Dynamics 365 for Operations non-production multi-box instance for standard acceptance testing (Tier 2)\"\n            'Dynamics_365_for_Operations_Sandbox_Tier2_SKU'                         = \"Dynamics 365 Operations - Sandbox Tier 2:Standard Acceptance Testing\"\n            'Dynamics_365_for_Operations_Sandbox_Tier4'                             = \"Dynamics 365 for Operations Enterprise Edition - Sandbox Tier 4:Standard Performance Testing\"\n            'Dynamics_365_for_Operations_Sandbox_Tier4_SKU'                         = \"Dynamics 365 Operations - Sandbox Tier 4:Standard Performance Testing\"\n            'DYNAMICS_365_FOR_OPERATIONS_TEAM_MEMBERS'                              = \"DYNAMICS 365 FOR OPERATIONS TEAM MEMBERS\"\n            'Dynamics_365_for_OperationsDevices'                                    = \"Dynamics 365 for Operations Devices\"\n            'Dynamics_365_for_Retail'                                               = \"DYNAMICS 365 FOR RETAIL\"\n            'Dynamics_365_for_Retail_Team_members'                                  = \"DYNAMICS 365 FOR RETAIL TEAM MEMBERS\"\n            'Dynamics_365_for_Talent_Team_members'                                  = \"DYNAMICS 365 FOR TALENT TEAM MEMBERS\"\n            'Dynamics_365_Hiring_Free_PLAN'                                         = \"Dynamics 365 for Talent: Attract\"\n            'Dynamics_365_Hiring_SKU'                                               = \"Dynamics 365 Talent: Attract\"\n            'Dynamics_365_Onboarding_Free_PLAN'                                     = \"Dynamics 365 for Talent: Onboard\"\n            'DYNAMICS_365_ONBOARDING_SKU'                                           = \"Dynamics 365 Talent: Onboard\"\n            'Dynamics_365_Sales_Field_Service_and_Customer_Service_Partner_Sandbox' = \"Dynamics 365 Sales, Field Service and Customer Service Partner Sandbox\"\n            'Dynamics_365_Sales_Premium_Viral_Trial'                                = \"Dynamics 365 Sales Premium Viral Trial\"\n            'Dynamics_365_Talent_Onboard'                                           = \"DYNAMICS 365 FOR TALENT: ONBOARD\"\n            'DYNB365_CSI_VIRAL_TRIAL'                                               = \"Dynamics 365 Customer Service Insights vTrial\"\n            'E3_VDA_only'                                                           = \"Windows 10/11 Enterprise E3 VDA\"\n            'EducationAnalyticsP1'                                                  = \"Education Analytics\"\n            'EMS'                                                                   = \"Enterprise Mobility + Security E3\"\n            'EMS_EDU_FACULTY'                                                       = \"Enterprise Mobility + Security A3 for Faculty\"\n            'EMS_GOV'                                                               = \"Enterprise Mobility + Security G3 GCC\"\n            'EMSPREMIUM'                                                            = \"Enterprise Mobility + Security E5\"\n            'EMSPREMIUM_GOV'                                                        = \"Enterprise Mobility + Security G5 GCC\"\n            'ENTERPRISEPACK'                                                        = \"Office 365 E3\"\n            'ENTERPRISEPACK_GOV'                                                    = \"Office 365 G3 GCC\"\n            'ENTERPRISEPACK_USGOV_DOD'                                              = \"Office 365 E3_USGOV_DOD\"\n            'ENTERPRISEPACK_USGOV_GCCHIGH'                                          = \"Office 365 E3_USGOV_GCCHIGH\"\n            'ENTERPRISEPACKPLUS_FACULTY'                                            = \"Office 365 A3 for faculty\"\n            'ENTERPRISEPACKPLUS_STUDENT'                                            = \"Office 365 A3 for students\"\n            'ENTERPRISEPREMIUM'                                                     = \"Office 365 E5\"\n            'ENTERPRISEPREMIUM_FACULTY'                                             = \"Office 365 A5 for faculty\"\n            'ENTERPRISEPREMIUM_GOV'                                                 = \"Office 365 G5 GCC\"\n            'ENTERPRISEPREMIUM_NOPSTNCONF'                                          = \"Office 365 E5 Without Audio Conferencing\"\n            'ENTERPRISEPREMIUM_STUDENT'                                             = \"Office 365 A5 for students\"\n            'ENTERPRISEWITHSCAL'                                                    = \"Office 365 E4\"\n            'EOP_ENTERPRISE'                                                        = \"Exchange Online Protection\"\n            'EOP_ENTERPRISE_PREMIUM'                                                = \"Exchange Enterprise CAL Services (EOP DLP)\"\n            'EQUIVIO_ANALYTICS'                                                     = \"Office 365 Advanced Compliance\"\n            'EQUIVIO_ANALYTICS_GOV'                                                 = \"Office 365 Advanced Compliance for GCC\"\n            'ERP_TRIAL_INSTANCE'                                                    = \"Dynamics 365 Operations Trial Environment\"\n            'EXCEL_PREMIUM'                                                         = \"Microsoft Excel Advanced Analytics\"\n            'EXCHANGE_ANALYTICS'                                                    = \"Microsoft MyAnalytics (Full)\"\n            'EXCHANGE_ANALYTICS_GOV'                                                = \"Microsoft MyAnalytics for Government (Full)\"\n            'EXCHANGE_B_STANDARD'                                                   = \"EXCHANGE ONLINE POP\"\n            'EXCHANGE_FOUNDATION_GOV'                                               = \"EXCHANGE FOUNDATION FOR GOVERNMENT\"\n            'EXCHANGE_L_STANDARD'                                                   = \"EXCHANGE ONLINE (P1)\"\n            'EXCHANGE_S_ARCHIVE'                                                    = \"EXCHANGE ONLINE ARCHIVING FOR EXCHANGE SERVER\"\n            'EXCHANGE_S_ARCHIVE_ADDON'                                              = \"EXCHANGE ONLINE ARCHIVING FOR EXCHANGE ONLINE\"\n            'EXCHANGE_S_DESKLESS'                                                   = \"EXCHANGE ONLINE KIOSK\"\n            'EXCHANGE_S_DESKLESS_GOV'                                               = \"Exchange Online (Kiosk) for Government\"\n            'EXCHANGE_S_ENTERPRISE'                                                 = \"EXCHANGE ONLINE (PLAN 2)\"\n            'EXCHANGE_S_ENTERPRISE_GOV'                                             = \"Exchange Online (Plan 2) for Government\"\n            'EXCHANGE_S_ESSENTIALS'                                                 = \"Exchange Online Essentials\"\n            'EXCHANGE_S_FOUNDATION'                                                 = \"Exchange Foundation\"\n            'EXCHANGE_S_FOUNDATION_GOV'                                             = \"Exchange Foundation for Government\"\n            'EXCHANGE_S_STANDARD'                                                   = \"Exchange Online (Plan 1)\"\n            'EXCHANGE_S_STANDARD_GOV'                                               = \"Exchange Online (Plan 1) for Government\"\n            'EXCHANGE_S_STANDARD_MIDMARKET'                                         = \"EXCHANGE ONLINE PLAN\"\n            'EXCHANGEARCHIVE'                                                       = \"Exchange Online Archiving for Exchange Server\"\n            'EXCHANGEARCHIVE_ADDON'                                                 = \"Exchange Online Archiving for Exchange Online\"\n            'EXCHANGEDESKLESS'                                                      = \"Exchange Online Kiosk\"\n            'EXCHANGEENTERPRISE'                                                    = \"Exchange Online (Plan 2)\"\n            'EXCHANGEENTERPRISE_FACULTY'                                            = \"Exchange Online (Plan 2) for Faculty\"\n            'EXCHANGEESSENTIALS'                                                    = \"Exchange Online Essentials (ExO P1 Based)\"\n            'EXCHANGEONLINE_MULTIGEO'                                               = \"Exchange Online Multi-Geo\"\n            'EXCHANGESTANDARD'                                                      = \"Exchange Online (Plan 1)\"\n            'EXCHANGESTANDARD_ALUMNI'                                               = \"Exchange Online (Plan 1) for Alumni with Yammer\"\n            'EXCHANGESTANDARD_GOV'                                                  = \"Exchange Online (Plan 1) for GCC\"\n            'EXCHANGESTANDARD_STUDENT'                                              = \"Exchange Online (Plan 1) for Students\"\n            'EXCHANGETELCO'                                                         = \"Exchange Online POP\"\n            'EXPERTS_ON_DEMAND'                                                     = \"Microsoft Threat Experts - Experts on Demand\"\n            'FLOW_BUSINESS_PROCESS'                                                 = \"Power Automate per flow plan\"\n            'FLOW_CCI_BOTS'                                                         = \"Flow for CCI Bots\"\n            'FLOW_CUSTOMER_SERVICE_PRO'                                             = \"Power Automate for Customer Service Pro\"\n            'FLOW_DEV_VIRAL'                                                        = \"Flow for Developer\"\n            'FLOW_DYN_APPS'                                                         = \"Flow for Dynamics 365\"\n            'FLOW_DYN_P2'                                                           = \"Flow for Dynamics 365\"\n            'FLOW_DYN_TEAM'                                                         = \"Power Automate for Dynamics 365\"\n            'FLOW_FOR_PROJECT'                                                      = \"Flow for Project\"\n            'FLOW_FORMS_PRO'                                                        = \"Power Automate for Dynamics 365 Customer Voice\"\n            'FLOW_FREE'                                                             = \"Microsoft Power Automate Free\"\n            'FLOW_O365_P1'                                                          = \"FLOW FOR OFFICE 365\"\n            'FLOW_O365_P1_GOV'                                                      = \"Power Automate for Office 365 for Government\"\n            'FLOW_O365_P2'                                                          = \"Power Automate for Office 365\"\n            'FLOW_O365_P2_GOV'                                                      = \"POWER AUTOMATE FOR OFFICE 365 FOR GOVERNMENT\"\n            'FLOW_O365_P3'                                                          = \"Power Automate for Office 365\"\n            'FLOW_O365_P3_GOV'                                                      = \"Power Automate for Office 365 for Government\"\n            'FLOW_O365_S1'                                                          = \"Power Automate for Office 365 F3\"\n            'FLOW_O365_S1_GOV'                                                      = \"Power Automate for Office 365 F3 for Government\"\n            'FLOW_P1_GOV'                                                           = \"Power Automate (Plan 1) for Government\"\n            'FLOW_P2'                                                               = \"Microsoft Power Automate Plan 2\"\n            'FLOW_P2_VIRAL'                                                         = \"Flow Free\"\n            'FLOW_P2_VIRAL_REAL'                                                    = \"Flow P2 Viral\"\n            'Flow_Per_APP'                                                          = \"Power Automate for Power Apps per App Plan\"\n            'Flow_Per_APP_IWTRIAL'                                                  = \"Flow per app baseline access\"\n            'FLOW_PER_USER'                                                         = \"Power Automate per user plan\"\n            'FLOW_PER_USER_DEPT'                                                    = \"Power Automate per user plan dept\"\n            'FLOW_PER_USER_GCC'                                                     = \"Power Automate per user plan for Government\"\n            'Flow_PowerApps_PerUser'                                                = \"Power Automate for Power Apps per User Plan\"\n            'Flow_PowerApps_PerUser_GCC'                                            = \"Power Automate for Power Apps per User Plan for GCC\"\n            'FLOW_VIRTUAL_AGENT_BASE'                                               = \"Power Automate for Virtual Agent\"\n            'FLOW_VIRTUAL_AGENT_USL'                                                = \"Power Automate for Virtual Agent\"\n            'FORMS_GOV_E1'                                                          = \"Forms for Government (Plan E1)\"\n            'FORMS_GOV_E3'                                                          = \"FORMS FOR GOVERNMENT (PLAN E3)\"\n            'FORMS_GOV_E5'                                                          = \"Microsoft Forms for Government (Plan E5)\"\n            'FORMS_GOV_F1'                                                          = \"Forms for Government (Plan F1)\"\n            'FORMS_PLAN_E1'                                                         = \"MICROSOFT FORMS (PLAN E1)\"\n            'FORMS_PLAN_E3'                                                         = \"Microsoft Forms (Plan E3)\"\n            'FORMS_PLAN_E5'                                                         = \"Microsoft Forms (Plan E5)\"\n            'FORMS_PLAN_K'                                                          = \"Microsoft Forms (Plan F1)\"\n            'FORMS_PRO'                                                             = \"Dynamics 365 Customer Voice Trial\"\n            'Forms_Pro_AddOn'                                                       = \"Dynamics 365 Customer Voice Additional Responses\"\n            'Forms_Pro_CE'                                                          = \"Microsoft Dynamics 365 Customer Voice for Customer Engagement Plan\"\n            'Forms_Pro_Customer_Insights'                                           = \"Microsoft Dynamics 365 Customer Voice for Customer Insights\"\n            'Forms_Pro_FS'                                                          = \"Microsoft Dynamics 365 Customer Voice for Field Service\"\n            'Forms_Pro_Marketing'                                                   = \"Microsoft Dynamics 365 Customer Voice for Marketing\"\n            'Forms_Pro_Marketing_App'                                               = \"Microsoft Dynamics 365 Customer Voice for Marketing Application\"\n            'Forms_Pro_Relationship_Sales'                                          = \"Microsoft Dynamics 365 Customer Voice for Relationship Sales\"\n            'Forms_Pro_SalesEnt'                                                    = \"Microsoft Dynamics 365 Customer Voice for Sales Enterprise\"\n            'Forms_Pro_Service'                                                     = \"Microsoft Dynamics 365 Customer Voice for Customer Service Enterprise\"\n            'Forms_Pro_USL'                                                         = \"Dynamics 365 Customer Voice USL\"\n            'GRAPH_CONNECTORS_SEARCH_INDEX'                                         = \"Graph Connectors Search with Index\"\n            'GRAPH_CONNECTORS_SEARCH_INDEX_TOPICEXP'                                = \"Graph Connectors Search with Index (Microsoft Viva Topics)\"\n            'GUIDES'                                                                = \"Dynamics 365 Guides\"\n            'GUIDES_USER'                                                           = \"Dynamics 365 Guides\"\n            'IDENTITY_THREAT_PROTECTION'                                            = \"Microsoft 365 E5 Security\"\n            'IDENTITY_THREAT_PROTECTION_FOR_EMS_E5'                                 = \"Microsoft 365 E5 Security for EMS E5\"\n            'INFO_GOVERNANCE'                                                       = \"Microsoft Information Governance\"\n            'INFORMATION_BARRIERS'                                                  = \"Information Barriers\"\n            'INFORMATION_PROTECTION_COMPLIANCE'                                     = \"Microsoft 365 E5 Compliance\"\n            'INSIDER_RISK'                                                          = \"Microsoft Insider Risk Management\"\n            'INSIDER_RISK_MANAGEMENT'                                               = \"Microsoft Insider Risk Management\"\n            'Intelligent_Content_Services'                                          = \"SharePoint Syntex\"\n            'Intelligent_Content_Services_SPO_type'                                 = \"SharePoint Syntex - SPO type\"\n            'INTUNE_A'                                                              = \"Intune\"\n            'INTUNE_A_D'                                                            = \"Microsoft Intune Device\"\n            'INTUNE_A_D_GOV'                                                        = \"Microsoft Intune Device for Government\"\n            'Intune_AdvancedEA'                                                     = \"Intune Advanced endpoint analytics\"\n            'Intune_Defender'                                                       = \"MDE_SecurityManagement\"\n            'INTUNE_EDU'                                                            = \"Intune for Education\"\n            'INTUNE_O365'                                                           = \"Mobile Device Management for Office 365\"\n            'INTUNE_P2'                                                             = \"Intune Plan 2\"\n            'INTUNE_SMB'                                                            = \"Microsoft Intune SMB\"\n            'INTUNE_SMBIZ'                                                          = \"Microsoft Intune\"\n            'Intune-EPM'                                                            = \"Intune Endpoint Privilege Management\"\n            'Intune-MAMTunnel'                                                      = \"Microsoft Tunnel for Mobile Application Management\"\n            'IT_ACADEMY_AD'                                                         = \"Microsoft Imagine Academy\"\n            'KAIZALA_O365_P1'                                                       = \"Microsoft Kaizala Pro\"\n            'KAIZALA_O365_P2'                                                       = \"Microsoft Kaizala Pro\"\n            'KAIZALA_O365_P3'                                                       = \"Microsoft Kaizala Pro\"\n            'KAIZALA_STANDALONE'                                                    = \"Microsoft Kaizala Pro\"\n            'LITEPACK'                                                              = \"Office 365 Small Business\"\n            'LITEPACK_P2'                                                           = \"Office 365 Small Business Premium\"\n            'LOCKBOX_ENTERPRISE'                                                    = \"Customer Lockbox\"\n            'LOCKBOX_ENTERPRISE_GOV'                                                = \"Customer Lockbox for Government\"\n            'M365_A5_SUITE_COMPONENTS_FACULTY'                                      = \"Microsoft 365 A5 Suite features for faculty\"\n            'M365_ADVANCED_AUDITING'                                                = \"Microsoft 365 Advanced Auditing\"\n            'M365_AUDIT_PLATFORM'                                                   = \"Microsoft 365 Audit Platform\"\n            'M365_E5_SUITE_COMPONENTS'                                              = \"Microsoft 365 E5 Suite features\"\n            'M365_F1'                                                               = \"Microsoft 365 F1\"\n            'M365_F1_COMM'                                                          = \"Microsoft 365 F1\"\n            'M365_F1_GOV'                                                           = \"Microsoft 365 F3 GCC\"\n            'M365_G3_GOV'                                                           = \"Microsoft 365 G3 GCC\"\n            'M365_G5_GCC'                                                           = \"Microsoft 365 GCC G5\"\n            'M365_LIGHTHOUSE_CUSTOMER_PLAN1'                                        = \"Microsoft 365 Lighthouse (Plan 1)\"\n            'M365_LIGHTHOUSE_PARTNER_PLAN1'                                         = \"Microsoft 365 Lighthouse (Plan 2)\"\n            'M365_SECURITY_COMPLIANCE_FOR_FLW'                                      = \"Microsoft 365 Security and Compliance for Firstline Workers\"\n            'M365EDU_A1'                                                            = \"Microsoft 365 A1\"\n            'M365EDU_A3_FACULTY'                                                    = \"Microsoft 365 A3 for Faculty\"\n            'M365EDU_A3_STUDENT'                                                    = \"Microsoft 365 A3 for Students\"\n            'M365EDU_A3_STUUSEBNFT'                                                 = \"Microsoft 365 A3 for students use benefit\"\n            'M365EDU_A3_STUUSEBNFT_RPA1'                                            = \"Microsoft 365 A3 - Unattended License for students use benefit\"\n            'M365EDU_A5_FACULTY'                                                    = \"Microsoft 365 A5 for Faculty\"\n            'M365EDU_A5_NOPSTNCONF_STUUSEBNFT'                                      = \"Microsoft 365 A5 without Audio Conferencing for students use benefit\"\n            'M365EDU_A5_STUDENT'                                                    = \"Microsoft 365 A5 for Students\"\n            'M365EDU_A5_STUUSEBNFT'                                                 = \"Microsoft 365 A5 for students use benefit\"\n            'MCO_TEAMS_IW'                                                          = \"MICROSOFT TEAMS\"\n            'MCO_VIRTUAL_APPT'                                                      = \"Microsoft Teams Premium Virtual Appointments\"\n            'MCOCAP'                                                                = \"Microsoft Teams Shared Devices\"\n            'MCOCAP_GOV'                                                            = \"Microsoft Teams Shared Devices for GCC\"\n            'MCOEV'                                                                 = \"Microsoft Teams Phone Standard\"\n            'MCOEV_DOD'                                                             = \"Microsoft Teams Phone Standard for DOD\"\n            'MCOEV_FACULTY'                                                         = \"Microsoft Teams Phone Standard for Faculty\"\n            'MCOEV_GCCHIGH'                                                         = \"Microsoft Teams Phone Standard for GCCHIGH\"\n            'MCOEV_GOV'                                                             = \"Microsoft Teams Phone Standard for GCC\"\n            'MCOEV_STUDENT'                                                         = \"Microsoft Teams Phone Standard for Students\"\n            'MCOEV_TELSTRA'                                                         = \"Microsoft Teams Phone Standard for TELSTRA\"\n            'MCOEV_USGOV_DOD'                                                       = \"Microsoft Teams Phone Standard_USGOV_DOD\"\n            'MCOEV_USGOV_GCCHIGH'                                                   = \"Microsoft Teams Phone Standard_USGOV_GCCHIGH\"\n            'MCOEV_VIRTUALUSER'                                                     = \"Microsoft 365 Phone Standard Resource Account\"\n            'MCOEV_VIRTUALUSER_GOV'                                                 = \"Microsoft 365 Phone Standard Resource Account for Government\"\n            'MCOEVSMB'                                                              = \"SKYPE FOR BUSINESS CLOUD PBX FOR SMALL AND MEDIUM BUSINESS\"\n            'MCOEVSMB_1'                                                            = \"Microsoft Teams Phone Standard for Small and Medium Business\"\n            'MCOFREE'                                                               = \"MCO FREE FOR MICROSOFT TEAMS (FREE)\"\n            'MCOIMP'                                                                = \"Skype for Business Online (Plan 1)\"\n            'MCOIMP_GOV'                                                            = \"Skype for Business Online (Plan 1) for Government\"\n            'MCOLITE'                                                               = \"SKYPE FOR BUSINESS ONLINE (PLAN P1)\"\n            'MCOMEETACPEA'                                                          = \"Microsoft 365 Audio Conferencing Pay-Per-Minute - EA\"\n            'MCOMEETADV'                                                            = \"Microsoft 365 Audio Conferencing\"\n            'MCOMEETADV_GOV'                                                        = \"Microsoft 365 Audio Conferencing for GCC\"\n            'MCOMEETBASIC'                                                          = \"Microsoft Teams Audio Conferencing with dial-out to select geographies\"\n            'MCOPSTN_1_GOV'                                                         = \"Microsoft 365 Domestic Calling Plan for GCC\"\n            'MCOPSTN_5'                                                             = \"Microsoft 365 Domestic Calling Plan (120 Minutes)\"\n            'MCOPSTN1'                                                              = \"Skype for Business PSTN Domestic Calling\"\n            'MCOPSTN1_GOV'                                                          = \"Domestic Calling for Government\"\n            'MCOPSTN2'                                                              = \"Skype for Business PSTN Domestic and International Calling\"\n            'MCOPSTN3'                                                              = \"MCOPSTN3\"\n            'MCOPSTN5'                                                              = \"Skype for Business PSTN Domestic Calling (120 Minutes)\"\n            'MCOPSTN8'                                                              = \"Microsoft 365 Domestic Calling Plan (120 min) at User Level\"\n            'MCOPSTNC'                                                              = \"Communications Credits\"\n            'MCOPSTNEAU'                                                            = \"AUSTRALIA CALLING PLAN\"\n            'MCOPSTNEAU2'                                                           = \"TELSTRA Calling for O365\"\n            'MCOPSTNPP'                                                             = \"Skype for Business PSTN Usage Calling Plan\"\n            'MCOSTANDARD'                                                           = \"Skype for Business Online (Plan 2)\"\n            'MCOSTANDARD_GOV'                                                       = \"Skype for Business Online (Plan 2) for Government\"\n            'MCOSTANDARD_MIDMARKET'                                                 = \"SKYPE FOR BUSINESS ONLINE (PLAN 2) FOR MIDSIZ\"\n            'MCOTEAMS_ESSENTIALS'                                                   = \"Teams Phone with Calling Plan\"\n            'MCOVOICECONF'                                                          = \"SKYPE FOR BUSINESS ONLINE (PLAN 3)\"\n            'MCS_BizApps_Cloud_for_Sustainability_vTrial'                           = \"MCS - BizApps_Cloud for Sustainability_vTrial\"\n            'MDATP_Server'                                                          = \"Microsoft Defender for Endpoint Server\"\n            'MDATP_XPLAT'                                                           = \"Microsoft Defender for Endpoint P2_XPLAT\"\n            'MDE_LITE'                                                              = \"Microsoft Defender for Endpoint Plan 1\"\n            'MDE_SMB'                                                               = \"Microsoft Defender for Business\"\n            'MDM_SALES_COLLABORATION'                                               = \"MICROSOFT DYNAMICS MARKETING SALES COLLABORATION - ELIGIBILITY CRITERIA APPLY\"\n            'MEE_FACULTY'                                                           = \"Minecraft Education Faculty\"\n            'MEE_STUDENT'                                                           = \"Minecraft Education Student\"\n            'MEETING_ROOM'                                                          = \"Microsoft Teams Rooms Standard\"\n            'MEETING_ROOM_NOAUDIOCONF'                                              = \"Microsoft Teams Rooms Standard without Audio Conferencing\"\n            'MFA_PREMIUM'                                                           = \"MICROSOFT AZURE MULTI-FACTOR AUTHENTICATION\"\n            'MFA_STANDALONE'                                                        = \"Microsoft Azure Multi-Factor Authentication\"\n            'Microsoft 365 A3 Suite features for faculty'                           = \"Microsoft 365 A3 Suite features for faculty\"\n            'Microsoft_365_E3'                                                      = \"Microsoft 365 E3 (500 seats min)_HUB\"\n            'Microsoft_365_E3_Extra_Features'                                       = \"Microsoft 365 E3 Extra Features\"\n            'Microsoft_365_E5'                                                      = \"Microsoft 365 E5 (500 seats min)_HUB\"\n            'Microsoft_365_E5_without_Audio_Conferencing'                           = \"Microsoft 365 E5 without Audio Conferencing (500 seats min)_HUB\"\n            'MICROSOFT_APPLICATION_PROTECTION_AND_GOVERNANCE_A'                     = \"Microsoft Application Protection and Governance (A)\"\n            'MICROSOFT_APPLICATION_PROTECTION_AND_GOVERNANCE_D'                     = \"Microsoft Application Protection and Governance (D)\"\n            'MICROSOFT_BUSINESS_CENTER'                                             = \"Microsoft Business Center\"\n            'Microsoft_Cloud_App_Security_App_Governance_Add_On'                    = \"App governance add-on to Microsoft Defender for Cloud Apps\"\n            'Microsoft_Cloud_for_Sustainability_vTrial'                             = \"Microsoft Cloud for Sustainability vTrial\"\n            'MICROSOFT_COMMUNICATION_COMPLIANCE'                                    = \"Microsoft 365 Communication Compliance\"\n            'MICROSOFT_ECDN'                                                        = \"Microsoft eCDN\"\n            'Microsoft_Intune_Suite'                                                = \"Microsoft Intune Suite\"\n            'MICROSOFT_REMOTE_ASSIST'                                               = \"Dynamics 365 Remote Assist\"\n            'MICROSOFT_REMOTE_ASSIST_HOLOLENS'                                      = \"Dynamics 365 Remote Assist HoloLens\"\n            'MICROSOFT_SEARCH'                                                      = \"Microsoft Search\"\n            'Microsoft_Teams_Audio_Conferencing_select_dial_out'                    = \"Microsoft Teams Audio Conferencing with dial-out to USA/CAN\"\n            'Microsoft_Teams_Premium'                                               = \"Microsoft Teams Premium Introductory Pricing\"\n            'Microsoft_Teams_Rooms_Basic'                                           = \"Microsoft Teams Rooms Basic\"\n            'Microsoft_Teams_Rooms_Basic_FAC'                                       = \"Microsoft Teams Rooms Basic for EDU\"\n            'Microsoft_Teams_Rooms_Basic_without_Audio_Conferencing'                = \"Microsoft Teams Rooms Basic without Audio Conferencing\"\n            'Microsoft_Teams_Rooms_Pro'                                             = \"Microsoft Teams Rooms Pro\"\n            'Microsoft_Teams_Rooms_Pro_FAC'                                         = \"Microsoft Teams Rooms Pro for EDU\"\n            'Microsoft_Teams_Rooms_Pro_without_Audio_Conferencing'                  = \"Microsoft Teams Rooms Pro without Audio Conferencing\"\n            'Microsoft_Viva_Goals'                                                  = \"Microsoft Viva Goals\"\n            'Microsoft_Viva_Sales_PowerAutomate'                                    = \"Microsoft Viva Sales Premium with Power Automate\"\n            'Microsoft_Viva_Sales_PremiumTrial'                                     = \"Microsoft Viva Sales Premium & Trial\"\n            'Microsoft365_Lighthouse'                                               = \"Microsoft 365 Lighthouse\"\n            'MICROSOFTBOOKINGS'                                                     = \"Microsoft Bookings\"\n            'MICROSOFTENDPOINTDLP'                                                  = \"Microsoft Endpoint DLP\"\n            'MICROSOFTSTREAM'                                                       = \"MICROSOFT STREAM\"\n            'MIDSIZEPACK'                                                           = \"Office 365 Midsize Business\"\n            'MINECRAFT_EDUCATION_EDITION'                                           = \"Minecraft Education Edition\"\n            'MIP_S_CLP1'                                                            = \"Information Protection for Office 365 - Standard\"\n            'MIP_S_CLP2'                                                            = \"Information Protection for Office 365 - Premium\"\n            'MIP_S_Exchange'                                                        = \"Data Classification in Microsoft 365\"\n            'MIP_S_EXCHANGE_CO'                                                     = \"Data Classification in Microsoft 365 - Company Level\"\n            'ML_CLASSIFICATION'                                                     = \"Microsoft ML-Based Classification\"\n            'MMR_P1'                                                                = \"Meeting Room Managed Services\"\n            'MS_TEAMS_IW'                                                           = \"Microsoft Teams Trial\"\n            'MTP'                                                                   = \"Microsoft 365 Defender\"\n            'MTR_PREM'                                                              = \"Teams Rooms Premium\"\n            'MTRProManagement'                                                      = \"Microsoft Teams Rooms Pro Management\"\n            'MYANALYTICS_P2'                                                        = \"Insights by MyAnalytics\"\n            'MYANALYTICS_P2_GOV'                                                    = \"INSIGHTS BY MYANALYTICS FOR GOVERNMENT\"\n            'NBENTERPRISE'                                                          = \"Microsoft Social Engagement Enterprise\"\n            'NBPROFESSIONALFORCRM'                                                  = \"MICROSOFT SOCIAL ENGAGEMENT PROFESSIONAL - ELIGIBILITY CRITERIA APPLY\"\n            'NONPROFIT_PORTAL'                                                      = \"Nonprofit Portal\"\n            'Nucleus'                                                               = \"Nucleus\"\n            'O365_BUSINESS'                                                         = \"Microsoft 365 Apps for Business\"\n            'O365_BUSINESS_ESSENTIALS'                                              = \"Microsoft 365 Business Basic\"\n            'O365_BUSINESS_PREMIUM'                                                 = \"Microsoft 365 Business Standard\"\n            'O365_SB_Relationship_Management'                                       = \"OUTLOOK CUSTOMER MANAGER\"\n            'OFFICE_BUSINESS'                                                       = \"OFFICE 365 BUSINESS\"\n            'OFFICE_FORMS_PLAN_2'                                                   = \"Microsoft Forms (Plan 2)\"\n            'OFFICE_FORMS_PLAN_3'                                                   = \"Microsoft Forms (Plan 3)\"\n            'OFFICE_PRO_PLUS_SUBSCRIPTION_SMBIZ'                                    = \"OFFICE 365 SMALL BUSINESS SUBSCRIPTION\"\n            'OFFICE_PROPLUS_DEVICE'                                                 = \"Microsoft 365 Apps for Enterprise (Device)\"\n            'OFFICE_PROPLUS_DEVICE1'                                                = \"Microsoft 365 Apps for enterprise (device)\"\n            'OFFICE_SHARED_COMPUTER_ACTIVATION'                                     = \"Office Shared Computer Activation\"\n            'OFFICE365_MULTIGEO'                                                    = \"Multi-Geo Capabilities in Office 365\"\n            'OFFICEMOBILE_SUBSCRIPTION'                                             = \"OFFICEMOBILE_SUBSCRIPTION\"\n            'OFFICEMOBILE_SUBSCRIPTION_GOV'                                         = \"Office Mobile Apps for Office 365 for GCC\"\n            'OFFICESUBSCRIPTION'                                                    = \"Microsoft 365 Apps for Enterprise\"\n            'OFFICESUBSCRIPTION_FACULTY'                                            = \"Microsoft 365 Apps for Faculty\"\n            'OFFICESUBSCRIPTION_GOV'                                                = \"Microsoft 365 Apps for enterprise G\"\n            'OFFICESUBSCRIPTION_STUDENT'                                            = \"Microsoft 365 Apps for Students\"\n            'OFFICESUBSCRIPTION_unattended'                                         = \"Microsoft 365 Apps for Enterprise (Unattended)\"\n            'ONEDRIVE_BASIC'                                                        = \"OneDrive for business Basic\"\n            'ONEDRIVE_BASIC_GOV'                                                    = \"ONEDRIVE FOR BUSINESS BASIC FOR GOVERNMENT\"\n            'ONEDRIVE_BASIC_P2'                                                     = \"OneDrive for Business (Basic 2)\"\n            'ONEDRIVEENTERPRISE'                                                    = \"ONEDRIVEENTERPRISE\"\n            'ONEDRIVESTANDARD'                                                      = \"ONEDRIVESTANDARD\"\n            'PAM_ENTERPRISE'                                                        = \"Office 365 Privileged Access Management\"\n            'PBI_PREMIUM_P1_ADDON'                                                  = \"Power BI Premium P1\"\n            'PBI_PREMIUM_PER_USER'                                                  = \"Power BI Premium Per User\"\n            'PBI_PREMIUM_PER_USER_ADDON'                                            = \"Power BI Premium Per User Add-On\"\n            'PBI_PREMIUM_PER_USER_DEPT'                                             = \"Power BI Premium Per User Dept\"\n            'PBI_PREMIUM_PER_USER_FACULTY'                                          = \"Power BI Premium Per User for Faculty\"\n            'PHONESYSTEM_VIRTUALUSER'                                               = \"Microsoft Teams Phone Resource Account\"\n            'PHONESYSTEM_VIRTUALUSER_GOV'                                           = \"Microsoft Teams Phone Resource Account for GCC\"\n            'POWER_APPS_DYN365_VIRAL_TRIAL'                                         = \"Power Apps for Dynamics 365 vTrial\"\n            'POWER_AUTOMATE_ATTENDED_RPA'                                           = \"Power Automate RPA Attended\"\n            'POWER_AUTOMATE_DYN365_VIRAL_TRIAL'                                     = \"Power Automate for Dynamics 365 vTrial\"\n            'Power_Automate_For_Project_P1'                                         = \"POWER AUTOMATE FOR PROJECT P1\"\n            'POWER_AUTOMATE_UNATTENDED_RPA'                                         = \"Power Automate Unattended RPA add-on\"\n            'POWER_BI_ADDON'                                                        = \"Power BI for Office 365 Add-On\"\n            'POWER_BI_INDIVIDUAL_USER'                                              = \"Power BI\"\n            'POWER_BI_PRO'                                                          = \"Power BI Pro\"\n            'POWER_BI_PRO_CE'                                                       = \"Power BI Pro CE\"\n            'POWER_BI_PRO_DEPT'                                                     = \"Power BI Pro Dept\"\n            'POWER_BI_PRO_FACULTY'                                                  = \"Power BI Pro for Faculty\"\n            'POWER_BI_STANDARD'                                                     = \"Power BI (free)\"\n            'POWER_BI_STANDARD_FACULTY'                                             = \"Microsoft Fabric (Free) for faculty\"\n            'POWER_BI_STANDARD_STUDENT'                                             = \"Microsoft Fabric (Free) for student\"\n            'Power_Pages_Internal_User'                                             = \"Power Pages Internal User\"\n            'POWER_PAGES_VTRIAL'                                                    = \"Power Pages vTrial for Makers\"\n            'Power_Pages_vTrial_for_Makers'                                         = \"Power Pages vTrial for Makers\"\n            'POWER_VIRTUAL_AGENTS_D365_CS_CHAT'                                     = \"Power Virtual Agents for Chat\"\n            'POWER_VIRTUAL_AGENTS_D365_CS_MESSAGING'                                = \"Power Virtual Agents for Digital Messaging\"\n            'POWER_VIRTUAL_AGENTS_D365_CS_VOICE'                                    = \"Power Virtual Agents for Customer Service Voice\"\n            'POWER_VIRTUAL_AGENTS_O365_F1'                                          = \"Power Virtual Agents for Office 365\"\n            'POWER_VIRTUAL_AGENTS_O365_P1'                                          = \"POWER VIRTUAL AGENTS FOR OFFICE 365 P1\"\n            'POWER_VIRTUAL_AGENTS_O365_P2'                                          = \"Power Virtual Agents for Office 365\"\n            'POWER_VIRTUAL_AGENTS_O365_P3'                                          = \"Power Virtual Agents for Office 365\"\n            'POWERAPPS_CUSTOMER_SERVICE_PRO'                                        = \"Power Apps for Customer Service Pro\"\n            'POWERAPPS_DEV'                                                         = \"Microsoft Power Apps for Developer\"\n            'POWERAPPS_DEV_VIRAL'                                                   = \"PowerApps for Developer\"\n            'POWERAPPS_DYN_APPS'                                                    = \"PowerApps for Dynamics 365\"\n            'POWERAPPS_DYN_P2'                                                      = \"Power Apps for Dynamics 365\"\n            'POWERAPPS_DYN_TEAM'                                                    = \"Power Apps for Dynamics 365\"\n            'POWERAPPS_GUIDES'                                                      = \"Power Apps for Guides\"\n            'POWERAPPS_INDIVIDUAL_USER'                                             = \"Power Apps and Logic Flows\"\n            'POWERAPPS_O365_P1'                                                     = \"POWERAPPS FOR OFFICE 365\"\n            'POWERAPPS_O365_P1_GOV'                                                 = \"Power Apps for Office 365 for Government\"\n            'POWERAPPS_O365_P2'                                                     = \"Power Apps for Office 365\"\n            'POWERAPPS_O365_P2_GOV'                                                 = \"POWER APPS FOR OFFICE 365 FOR GOVERNMENT\"\n            'POWERAPPS_O365_P3'                                                     = \"Power Apps for Office 365 (Plan 3)\"\n            'POWERAPPS_O365_P3_GOV'                                                 = \"Power Apps for Office 365 for Government\"\n            'POWERAPPS_O365_S1'                                                     = \"Power Apps for Office 365 F3\"\n            'POWERAPPS_O365_S1_GOV'                                                 = \"Power Apps for Office 365 F3 for Government\"\n            'POWERAPPS_P1_GOV'                                                      = \"PowerApps Plan 1 for Government\"\n            'POWERAPPS_P2'                                                          = \"Power Apps (Plan 2)\"\n            'POWERAPPS_P2_VIRAL'                                                    = \"PowerApps Trial\"\n            'POWERAPPS_PER_APP'                                                     = \"Power Apps per app plan\"\n            'POWERAPPS_PER_APP_IW'                                                  = \"PowerApps per app baseline access\"\n            'POWERAPPS_PER_APP_IWTRIAL'                                             = \"PowerApps per app baseline access\"\n            'POWERAPPS_PER_APP_NEW'                                                 = \"Power Apps per app plan (1 app or portal)\"\n            'POWERAPPS_PER_USER'                                                    = \"Power Apps per user plan\"\n            'POWERAPPS_PER_USER_GCC'                                                = \"Power Apps per user plan for Government\"\n            'POWERAPPS_PORTALS_LOGIN'                                               = \"Power Apps Portals Login Capacity Add-On\"\n            'POWERAPPS_PORTALS_LOGIN_GCC'                                           = \"Power Apps Portals Login Capacity Add-On for Government\"\n            'POWERAPPS_PORTALS_LOGIN_T2'                                            = \"Power Apps Portals login capacity add-on Tier 2 (10 unit min)\"\n            'POWERAPPS_PORTALS_LOGIN_T2_GCC'                                        = \"Power Apps Portals login capacity add-on Tier 2 (10 unit min) for Government\"\n            'POWERAPPS_PORTALS_LOGIN_T3'                                            = \"Power Apps Portals login capacity add-on Tier 3 (50 unit min)\"\n            'POWERAPPS_PORTALS_PAGEVIEW'                                            = \"Power Apps Portals page view capacity add-on\"\n            'POWERAPPS_PORTALS_PAGEVIEW_GCC'                                        = \"Power Apps Portals page view capacity add-on for Government\"\n            'POWERAPPS_SALES_PRO'                                                   = \"Power Apps for Sales Pro\"\n            'POWERAPPS_VIRAL'                                                       = \"Microsoft Power Apps Plan 2 Trial\"\n            'POWERAPPSFREE'                                                         = \"MICROSOFT POWERAPPS\"\n            'POWERAUTOMATE_ATTENDED_RPA'                                            = \"Power Automate per user with attended RPA plan\"\n            'POWERAUTOMATE_DESKTOP_FOR_WIN'                                         = \"PAD for Windows\"\n            'POWERAUTOMATE_UNATTENDED_RPA'                                          = \"Power Automate unattended RPA add-on\"\n            'POWERBI_PRO_GOV'                                                       = \"Power BI Pro for GCC\"\n            'POWERFLOW_P2'                                                          = \"Microsoft Power Apps Plan 2 (Qualified Offer)\"\n            'POWERFLOWSFREE'                                                        = \"LOGIC FLOWS\"\n            'POWERVIDEOSFREE'                                                       = \"MICROSOFT POWER VIDEOS BASIC\"\n            'PREMIUM_ENCRYPTION'                                                    = \"Premium Encryption in Office 365\"\n            'PRIVACY_MANAGEMENT_RISK'                                               = \"Privacy Management � risk\"\n            'PRIVACY_MANAGEMENT_RISK_EDU'                                           = \"Privacy Management - risk for EDU\"\n            'PRIVACY_MANAGEMENT_RISK_GCC'                                           = \"Privacy Management - risk GCC\"\n            'PRIVACY_MANAGEMENT_RISK_USGOV_DOD'                                     = \"Privacy Management - risk_USGOV_DOD\"\n            'PRIVACY_MANAGEMENT_RISK_USGOV_GCCHIGH'                                 = \"Privacy Management - risk_USGOV_GCCHIGH\"\n            'PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_1_EDU_V2'                            = \"Privacy Management - subject rights request (1) for EDU\"\n            'PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_1_V2'                                = \"Privacy Management - subject rights request (1)\"\n            'PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_1_V2_GCC'                            = \"Privacy Management - subject rights request (1) GCC\"\n            'PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_1_V2_USGOV_DOD'                      = \"Privacy Management - subject rights request (1) USGOV_DOD\"\n            'PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_1_V2_USGOV_GCCHIGH'                  = \"Privacy Management - subject rights request (1) USGOV_GCCHIGH\"\n            'PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_10_EDU_V2'                           = \"Privacy Management - subject rights request (10) for EDU\"\n            'PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_10_V2'                               = \"Privacy Management - subject rights request (10)\"\n            'PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_10_V2_GCC'                           = \"Privacy Management - subject rights request (10) GCC\"\n            'PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_10_V2_USGOV_DOD'                     = \"Privacy Management - subject rights request (10) USGOV_DOD\"\n            'PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_10_V2_USGOV_GCCHIGH'                 = \"Privacy Management - subject rights request (10) USGOV_GCCHIGH\"\n            'PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_100_EDU_V2'                          = \"Privacy Management - subject rights request (100) for EDU\"\n            'PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_100_V2'                              = \"Privacy Management - subject rights request (100)\"\n            'PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_100_V2_GCC'                          = \"Privacy Management - subject rights request (100) GCC\"\n            'PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_100_V2_USGOV_DOD'                    = \"Privacy Management - subject rights request (100) USGOV_DOD\"\n            'PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_100_V2_USGOV_GCCHIGH'                = \"Privacy Management - subject rights request (100) USGOV_GCCHIGH\"\n            'PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_50'                                  = \"Privacy Management - subject rights request (50)\"\n            'PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_50_EDU_V2'                           = \"Privacy Management - subject rights request (50) for EDU\"\n            'PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_50_V2'                               = \"Privacy Management - subject rights request (50)\"\n            'PRIVACY_MANGEMENT_DSR'                                                 = \"Privacy Management - Subject Rights Request\"\n            'PRIVACY_MANGEMENT_DSR_1'                                               = \"Privacy Management - Subject Rights Request (1 - Exchange)\"\n            'PRIVACY_MANGEMENT_DSR_10'                                              = \"Privacy Management - Subject Rights Request (10)\"\n            'PRIVACY_MANGEMENT_DSR_100'                                             = \"Privacy Management - Subject Rights Request (100)\"\n            'PRIVACY_MANGEMENT_DSR_EXCHANGE'                                        = \"Privacy Management - Subject Rights Request (Exchange)\"\n            'PRIVACY_MANGEMENT_DSR_EXCHANGE_1'                                      = \"Privacy Management - Subject Rights Request (1)\"\n            'PRIVACY_MANGEMENT_DSR_EXCHANGE_10'                                     = \"Privacy Management - Subject Rights Request (10 - Exchange)\"\n            'PRIVACY_MANGEMENT_DSR_EXCHANGE_100'                                    = \"Privacy Management - Subject Rights Request (100 - Exchange)\"\n            'PRIVACY_MANGEMENT_RISK'                                                = \"Priva - Risk\"\n            'PRIVACY_MANGEMENT_RISK_EXCHANGE'                                       = \"Priva - Risk (Exchange)\"\n            'PROJECT_CLIENT_SUBSCRIPTION'                                           = \"Project Online Desktop Client\"\n            'PROJECT_CLIENT_SUBSCRIPTION_GOV'                                       = \"Project Online Desktop Client for Government\"\n            'PROJECT_ESSENTIALS'                                                    = \"Project Online Essentials\"\n            'PROJECT_ESSENTIALS_GOV'                                                = \"Project Online Essentials for Government\"\n            'PROJECT_FOR_PROJECT_OPERATIONS'                                        = \"Project for Project Operations\"\n            'PROJECT_MADEIRA_PREVIEW_IW'                                            = \"Dynamics 365 Business Central for IWs\"\n            'PROJECT_MADEIRA_PREVIEW_IW_SKU'                                        = \"Dynamics 365 Business Central for IWs\"\n            'PROJECT_O365_F3'                                                       = \"Project for Office (Plan F)\"\n            'PROJECT_O365_P1'                                                       = \"Project for Office (Plan E1)\"\n            'PROJECT_O365_P2'                                                       = \"Project for Office (Plan E3)\"\n            'PROJECT_O365_P3'                                                       = \"Project for Office (Plan E5)\"\n            'PROJECT_P1'                                                            = \"Project Plan 1\"\n            'PROJECT_PLAN1_DEPT'                                                    = \"Project Plan 1 (for Department)\"\n            'PROJECT_PLAN3_DEPT'                                                    = \"Project Plan 3 (for Department)\"\n            'PROJECT_PROFESSIONAL'                                                  = \"Project P3\"\n            'PROJECT_PROFESSIONAL_FACULTY'                                          = \"Project P3 for Faculty\"\n            'PROJECTCLIENT'                                                         = \"Project for Office 365\"\n            'PROJECTESSENTIALS'                                                     = \"Project Online Essentials\"\n            'PROJECTESSENTIALS_FACULTY'                                             = \"Project Online Essentials for Faculty\"\n            'PROJECTESSENTIALS_GOV'                                                 = \"Project Online Essentials for GCC\"\n            'PROJECTONLINE_PLAN_1'                                                  = \"Project Online Premium Without Project Client\"\n            'PROJECTONLINE_PLAN_1_FACULTY'                                          = \"Project Plan 5 without Project Client for Faculty\"\n            'PROJECTONLINE_PLAN_2'                                                  = \"Project Online With Project for Office 365\"\n            'PROJECTPREMIUM'                                                        = \"Project Online Premium\"\n            'PROJECTPREMIUM_GOV'                                                    = \"Project Plan 5 for GCC\"\n            'PROJECTPROFESSIONAL'                                                   = \"Project Plan 3\"\n            'PROJECTPROFESSIONAL_FACULTY'                                           = \"Project Plan 3 for Faculty\"\n            'PROJECTPROFESSIONAL_GOV'                                               = \"Project Plan 3 for GCC\"\n            'PROJECTWORKMANAGEMENT'                                                 = \"Microsoft Planner\"\n            'PROJECTWORKMANAGEMENT_GOV'                                             = \"Office 365 Planner for Government\"\n            'RECORDS_MANAGEMENT'                                                    = \"Microsoft Records Management\"\n            'REMOTE_HELP'                                                           = \"Remote help\"\n            'RIGHTSMANAGEMENT'                                                      = \"Azure Information Protection Plan 1\"\n            'RIGHTSMANAGEMENT_ADHOC'                                                = \"Rights Management Adhoc\"\n            'RMS_S_ADHOC'                                                           = \"Rights Management Adhoc\"\n            'RMS_S_BASIC'                                                           = \"Microsoft Azure Rights Management Service\"\n            'RMS_S_ENTERPRISE'                                                      = \"AZURE INFORMATION PROTECTION PREMIUM P1\"\n            'RMS_S_ENTERPRISE)'                                                     = \"Microsoft Azure Active Directory Rights\"\n            'RMS_S_ENTERPRISE_GOV'                                                  = \"Azure Rights Management\"\n            'RMS_S_PREMIUM'                                                         = \"MICROSOFT AZURE ACTIVE DIRECTORY RIGHTS\"\n            'RMS_S_PREMIUM_GOV'                                                     = \"Azure Information Protection Premium P1 for GCC\"\n            'RMS_S_PREMIUM2'                                                        = \"AZURE INFORMATION PROTECTION PREMIUM P2\"\n            'RMS_S_PREMIUM2_GOV'                                                    = \"Azure Information Protection Premium P2 for GCC\"\n            'RMSBASIC'                                                              = \"Rights Management Service Basic Content Protection\"\n            'SAFEDOCS'                                                              = \"Office 365 SafeDocs\"\n            'SCHOOL_DATA_SYNC_P1'                                                   = \"School Data Sync (Plan 1)\"\n            'SCHOOL_DATA_SYNC_P2'                                                   = \"School Data Sync (Plan 2)\"\n            'SharePoint Plan 1G'                                                    = \"SharePoint Plan 1G\"\n            'SHAREPOINT_PROJECT'                                                    = \"Project Online Service\"\n            'SHAREPOINT_PROJECT_EDU'                                                = \"Project Online Service for Education\"\n            'SHAREPOINT_PROJECT_GOV'                                                = \"Project Online Service for Government\"\n            'SHAREPOINT_S_DEVELOPER'                                                = \"SHAREPOINT FOR DEVELOPER\"\n            'SHAREPOINTDESKLESS'                                                    = \"SharePoint Online Kiosk\"\n            'SHAREPOINTDESKLESS_GOV'                                                = \"SharePoint KioskG\"\n            'SHAREPOINTENTERPRISE'                                                  = \"SharePoint Online (Plan 2)\"\n            'SHAREPOINTENTERPRISE_EDU'                                              = \"SharePoint (Plan 2) for Education\"\n            'SHAREPOINTENTERPRISE_GOV'                                              = \"SharePoint Plan 2G\"\n            'SHAREPOINTENTERPRISE_MIDMARKET'                                        = \"SHAREPOINT PLAN 1\"\n            'SHAREPOINTLITE'                                                        = \"SHAREPOINTLITE\"\n            'SHAREPOINTONLINE_MULTIGEO'                                             = \"SharePoint Multi-Geo\"\n            'SHAREPOINTSTANDARD'                                                    = \"SharePoint Online (Plan 1)\"\n            'SHAREPOINTSTANDARD_EDU'                                                = \"SharePoint (Plan 1) for Education\"\n            'SHAREPOINTSTORAGE'                                                     = \"Office 365 Extra File Storage\"\n            'SHAREPOINTSTORAGE_GOV'                                                 = \"Office 365 Extra File Storage for GCC\"\n            'SHAREPOINTWAC'                                                         = \"Office for the web\"\n            'SHAREPOINTWAC_DEVELOPER'                                               = \"OFFICE ONLINE FOR DEVELOPER\"\n            'SHAREPOINTWAC_EDU'                                                     = \"Office for the Web for Education\"\n            'SHAREPOINTWAC_GOV'                                                     = \"Office for the Web for Government\"\n            'SKU_Dynamics_365_for_HCM_Trial'                                        = \"Dynamics 365 for Talent\"\n            'SMB_APPS'                                                              = \"Business Apps (free)\"\n            'SMB_BUSINESS'                                                          = \"Microsoft 365 Apps for Business\"\n            'SMB_BUSINESS_ESSENTIALS'                                               = \"Microsoft 365 Business Basic\"\n            'SMB_BUSINESS_PREMIUM'                                                  = \"Microsoft 365 Business Standard - Prepaid Legacy\"\n            'SOCIAL_ENGAGEMENT_APP_USER'                                            = \"Dynamics 365 AI for Market Insights (Preview)\"\n            'SPB'                                                                   = \"Microsoft 365 Business Premium\"\n            'SPE_E3'                                                                = \"Microsoft 365 E3\"\n            'SPE_E3_RPA1'                                                           = \"Microsoft 365 E3 - Unattended License\"\n            'SPE_E3_USGOV_DOD'                                                      = \"Microsoft 365 E3_USGOV_DOD\"\n            'SPE_E3_USGOV_GCCHIGH'                                                  = \"Microsoft 365 E3_USGOV_GCCHIGH\"\n            'SPE_E5'                                                                = \"Microsoft 365 E5\"\n            'SPE_E5_CALLINGMINUTES'                                                 = \"Microsoft 365 E5 with Calling Minutes\"\n            'SPE_E5_NOPSTNCONF'                                                     = \"Microsoft 365 E5 without Audio Conferencing\"\n            'SPE_F1'                                                                = \"Microsoft 365 F3\"\n            'SPE_F5_COMP'                                                           = \"Microsoft 365 F5 Compliance Add-on\"\n            'SPE_F5_COMP_AR_D_USGOV_DOD'                                            = \"Microsoft 365 F5 Compliance Add-on AR (DOD)_USGOV_DOD\"\n            'SPE_F5_COMP_AR_USGOV_GCCHIGH'                                          = \"Microsoft 365 F5 Compliance Add-on AR_USGOV_GCCHIGH\"\n            'SPE_F5_COMP_GCC'                                                       = \"Microsoft 365 F5 Compliance Add-on GCC\"\n            'SPE_F5_SEC'                                                            = \"Microsoft 365 F5 Security Add-on\"\n            'SPE_F5_SECCOMP'                                                        = \"Microsoft 365 F5 Security + Compliance Add-on\"\n            'SPZA'                                                                  = \"APP CONNECT\"\n            'SPZA_IW'                                                               = \"App Connect IW\"\n            'SQL_IS_SSIM'                                                           = \"Microsoft Power BI Information Services Plan 1\"\n            'STANDARDPACK'                                                          = \"Office 365 E1\"\n            'STANDARDPACK_GOV'                                                      = \"Office 365 G1 GCC\"\n            'STANDARDWOFFPACK'                                                      = \"Office 365 E2\"\n            'STANDARDWOFFPACK_FACULTY'                                              = \"Office 365 A1 for faculty\"\n            'STANDARDWOFFPACK_IW_FACULTY'                                           = \"Office 365 A1 Plus for faculty\"\n            'STANDARDWOFFPACK_IW_STUDENT'                                           = \"Office 365 A1 Plus for students\"\n            'STANDARDWOFFPACK_STUDENT'                                              = \"Office 365 A1 for students\"\n            'STREAM'                                                                = \"Microsoft Stream\"\n            'STREAM_O365_E1'                                                        = \"Microsoft Stream for Office 365 E1\"\n            'STREAM_O365_E1_GOV'                                                    = \"Microsoft Stream for O365 for Government (E1)\"\n            'STREAM_O365_E3'                                                        = \"Microsoft Stream for Office 365 E3\"\n            'STREAM_O365_E3_GOV'                                                    = \"MICROSOFT STREAM FOR O365 FOR GOVERNMENT (E3)\"\n            'STREAM_O365_E5'                                                        = \"Microsoft Stream for Office 365 E5\"\n            'STREAM_O365_E5_GOV'                                                    = \"Stream for Office 365 for Government (E5)\"\n            'STREAM_O365_K'                                                         = \"Microsoft Stream for O365 K SKU\"\n            'STREAM_O365_K_GOV'                                                     = \"Microsoft Stream for O365 for Government (F1)\"\n            'STREAM_O365_SMB'                                                       = \"Stream for Office 365\"\n            'STREAM_P2'                                                             = \"Microsoft Stream Plan 2\"\n            'STREAM_STORAGE'                                                        = \"Microsoft Stream Storage Add-On (500 GB)\"\n            'SWAY'                                                                  = \"Sway\"\n            'TEAMS_ADVCOMMS'                                                        = \"Microsoft 365 Advanced Communications\"\n            'TEAMS_AR_DOD'                                                          = \"Microsoft Teams for DOD (AR)\"\n            'TEAMS_AR_GCCHIGH'                                                      = \"Microsoft Teams for GCCHigh (AR)\"\n            'TEAMS_COMMERCIAL_TRIAL'                                                = \"Microsoft Teams Commercial Cloud\"\n            'Teams_Ess'                                                             = \"Microsoft Teams Essentials\"\n            'TEAMS_ESSENTIALS_AAD'                                                  = \"Microsoft Teams Essentials (AAD Identity)\"\n            'TEAMS_EXPLORATORY'                                                     = \"Microsoft Teams Exploratory\"\n            'TEAMS_FREE'                                                            = \"Microsoft Teams (Free)\"\n            'TEAMS_FREE_SERVICE'                                                    = \"TEAMS FREE SERVICE\"\n            'TEAMS_GOV'                                                             = \"Microsoft Teams for Government\"\n            'Teams_Room_Basic'                                                      = \"Teams Room Basic\"\n            'Teams_Room_Pro'                                                        = \"Teams Room Pro\"\n            'Teams_Room_Standard'                                                   = \"Teams Room Standard\"\n            'TEAMS1'                                                                = \"Microsoft Teams\"\n            'TeamsEss'                                                              = \"Microsoft Teams Essentials\"\n            'TEAMSMULTIGEO'                                                         = \"Teams Multi-Geo\"\n            'TEAMSPRO_CUST'                                                         = \"Microsoft Teams Premium Personalized\"\n            'TEAMSPRO_MGMT'                                                         = \"Microsoft Teams Premium Intelligent\"\n            'TEAMSPRO_PROTECTION'                                                   = \"Microsoft Teams Premium Secure\"\n            'TEAMSPRO_VIRTUALAPPT'                                                  = \"Microsoft Teams Premium Virtual Appointment\"\n            'TEAMSPRO_WEBINAR'                                                      = \"Microsoft Teams Premium Webinar\"\n            'THREAT_INTELLIGENCE'                                                   = \"Microsoft Defender for Office 365 (Plan 2)\"\n            'THREAT_INTELLIGENCE_APP'                                               = \"Defender Threat Intelligence\"\n            'THREAT_INTELLIGENCE_GOV'                                               = \"Microsoft Defender for Office 365 (Plan 2) GCC\"\n            'TOPIC_EXPERIENCES'                                                     = \"Viva Topics\"\n            'TVM_PREMIUM_1'                                                         = \"Microsoft Defender Vulnerability Management\"\n            'TVM_Premium_Add_on'                                                    = \"Microsoft Defender Vulnerability Management Add-on\"\n            'TVM_Premium_Standalone'                                                = \"Microsoft Defender Vulnerability Management\"\n            'UNIVERSAL_PRINT'                                                       = \"Universal Print\"\n            'UNIVERSAL_PRINT_01'                                                    = \"Universal Print\"\n            'UNIVERSAL_PRINT_NO_SEEDING'                                            = \"Universal Print Without Seeding\"\n            'VIRTUAL_AGENT_BASE'                                                    = \"Power Virtual Agent\"\n            'VIRTUAL_AGENT_USL'                                                     = \"Power Virtual Agent User License\"\n            'Virtualization \tRights \tfor \tWindows \t10 \t(E3/E5+VDA)'                 = \"Windows 10 Enterprise (New)\"\n            'Virtualization Rights for Windows 10'                                  = \"Windows 10/11 Enterprise\"\n            'Virtualization Rights for Windows 10 (E3/E5+VDA)'                      = \"Windows 10/11 Enterprise\"\n            'VISIO_CLIENT_SUBSCRIPTION'                                             = \"Visio Desktop App\"\n            'VISIO_CLIENT_SUBSCRIPTION_GOV'                                         = \"VISIO DESKTOP APP FOR Government\"\n            'VISIO_PLAN1_DEPT'                                                      = \"Visio Plan 1\"\n            'VISIO_PLAN2_DEPT'                                                      = \"Visio Plan 2\"\n            'VISIOCLIENT'                                                           = \"Visio Online Plan 2\"\n            'VISIOCLIENT_FACULTY'                                                   = \"Visio Plan 2 for Faculty\"\n            'VISIOCLIENT_GOV'                                                       = \"Visio Plan 2 for GCC\"\n            'VISIOONLINE'                                                           = \"Visio web app\"\n            'VISIOONLINE_GOV'                                                       = \"VISIO WEB APP FOR GOVERNMENT\"\n            'VISIOONLINE_PLAN1'                                                     = \"Visio Online Plan 1\"\n            'VIVA'                                                                  = \"Microsoft Viva Suite\"\n            'Viva_Goals_Premium'                                                    = \"Viva Goals\"\n            'VIVA_LEARNING_PREMIUM'                                                 = \"Viva Learning\"\n            'VIVA_LEARNING_SEEDED'                                                  = \"Viva Learning Seeded\"\n            'VIVAENGAGE_COMMUNITIES_AND_COMMUNICATIONS'                             = \"Viva Engage Communities and Communications\"\n            'VIVAENGAGE_CORE'                                                       = \"Viva Engage Core\"\n            'VIVAENGAGE_KNOWLEDGE'                                                  = \"Viva Engage Knowledge\"\n            'WACONEDRIVEENTERPRISE'                                                 = \"OneDrive for Business (Plan 2)\"\n            'WACONEDRIVESTANDARD'                                                   = \"OneDrive for Business (Plan 1)\"\n            'WHITEBOARD_FIRSTLINE1'                                                 = \"Whiteboard (Firstline)\"\n            'WHITEBOARD_PLAN1'                                                      = \"Whiteboard (Plan 1)\"\n            'WHITEBOARD_PLAN2'                                                      = \"Whiteboard (Plan 2)\"\n            'WHITEBOARD_PLAN3'                                                      = \"Whiteboard (Plan 3)\"\n            'WIN_DEF_ATP'                                                           = \"Microsoft Defender for Endpoint\"\n            'WIN_ENT_E5'                                                            = \"Windows 10/11 Enterprise E5 (Original)\"\n            'WIN10_ENT_A3_FAC'                                                      = \"Windows 10/11 Enterprise A3 for faculty\"\n            'WIN10_ENT_A3_STU'                                                      = \"Windows 10/11 Enterprise A3 for students\"\n            'WIN10_ENT_A5_FAC'                                                      = \"Windows 10/11 Enterprise A5 for faculty\"\n            'WIN10_ENT_LOC_F1'                                                      = \"Windows 10 Enterprise E3 (Local Only)\"\n            'WIN10_PRO_ENT_SUB'                                                     = \"Windows 10/11 Enterprise E3\"\n            'WIN10_VDA_E3'                                                          = \"Windows 10/11 Enterprise E3\"\n            'WIN10_VDA_E5'                                                          = \"Windows 10/11 Enterprise E5\"\n            'WINBIZ'                                                                = \"Windows 10/11 Business\"\n            'WINDEFATP'                                                             = \"Microsoft Defender for Endpoint\"\n            'Windows Autopatch'                                                     = \"Windows Autopatch\"\n            'Windows Store for Business EDU Store_faculty'                          = \"Windows Store for Business EDU Store_faculty\"\n            'Windows_365_S_2vCPU_4GB_128GB'                                         = \"Windows 365 Shared Use 2 vCPU 4 GB 128 GB\"\n            'Windows_365_S_2vCPU_4GB_256GB'                                         = \"Windows 365 Shared Use 2 vCPU 4 GB 256 GB\"\n            'Windows_365_S_2vCPU_4GB_64GB'                                          = \"Windows 365 Shared Use 2 vCPU 4 GB 64 GB\"\n            'Windows_365_S_2vCPU_8GB_128GB'                                         = \"Windows 365 Shared Use 2 vCPU 8 GB 128 GB\"\n            'Windows_365_S_2vCPU_8GB_256GB'                                         = \"Windows 365 Shared Use 2 vCPU 8 GB 256 GB\"\n            'Windows_365_S_4vCPU_16GB_128GB'                                        = \"Windows 365 Shared Use 4 vCPU 16 GB 128 GB\"\n            'Windows_365_S_4vCPU_16GB_256GB'                                        = \"Windows 365 Shared Use 4 vCPU 16 GB 256 GB\"\n            'Windows_365_S_4vCPU_16GB_512GB'                                        = \"Windows 365 Shared Use 4 vCPU 16 GB 512 GB\"\n            'Windows_365_S_8vCPU_32GB_128GB'                                        = \"Windows 365 Shared Use 8 vCPU 32 GB 128 GB\"\n            'Windows_365_S_8vCPU_32GB_256GB'                                        = \"Windows 365 Shared Use 8 vCPU 32 GB 256 GB\"\n            'Windows_365_S_8vCPU_32GB_512GB'                                        = \"Windows 365 Shared Use 8 vCPU 32 GB 512 GB\"\n            'Windows_Autopatch'                                                     = \"Windows Autopatch\"\n            'WINDOWS_STORE'                                                         = \"Windows Store for Business\"\n            'WINDOWSUPDATEFORBUSINESS_DEPLOYMENTSERVICE'                            = \"Windows Update for Business Deployment Service\"\n            'WINE5_GCC_COMPAT'                                                      = \"Windows 10/11 Enterprise E5 Commercial (GCC Compatible)\"\n            'WORKPLACE_ANALYTICS'                                                   = \"Microsoft Workplace Analytics\"\n            'WORKPLACE_ANALYTICS_INSIGHTS_BACKEND'                                  = \"Microsoft Viva Insights Backend\"\n            'WORKPLACE_ANALYTICS_INSIGHTS_USER'                                     = \"Microsoft Viva Insights\"\n            'WSFB_EDU_FACULTY'                                                      = \"Windows Store for Business EDU Faculty\"\n            'YAMMER_EDU'                                                            = \"Yammer for Academic\"\n            'YAMMER_ENTERPRISE'                                                     = \"YAMMER_ENTERPRISE\"\n            'YAMMER_MIDSIZE'                                                        = \"YAMMER MIDSIZE\"\n        }\n        $SKUO365 = [ordered] @{\n            'AAD_PREMIUM'                                                                                            = \"AAD_PREMIUM\"\n            'ADALLOM_S_DISCOVERY'                                                                                    = \"ADALLOM_S_DISCOVERY\"\n            'ADALLOM_S_O365'                                                                                         = \"ADALLOM_S_O365\"\n            'Advanced Communications'                                                                                = \"ADV_COMMS\"\n            'AI Builder Capacity add-on'                                                                             = \"CDSAICAPACITY\"\n            'AI Builder capacity Per App add-on'                                                                     = \"CDSAICAPACITY_PERAPP\"\n            'AI Builder capacity Per User add-on'                                                                    = \"CDSAICAPACITY_PERUSER\"\n            'APP CONNECT'                                                                                            = \"SPZA\"\n            'App Connect IW'                                                                                         = \"SPZA_IW\"\n            'App governance add-on to Microsoft Defender for Cloud Apps'                                             = \"Microsoft_Cloud_App_Security_App_Governance_Add_On\"\n            'Asset Maintenance Add-in'                                                                               = \"D365_AssetforSCM\"\n            'ATP_ENTERPRISE_GOV'                                                                                     = \"ATP_ENTERPRISE_GOV\"\n            'AUSTRALIA CALLING PLAN'                                                                                 = \"MCOPSTNEAU\"\n            'Azure Active Directory'                                                                                 = \"AAD_SMB\"\n            'Azure Active Directory Basic'                                                                           = \"AAD_BASIC\"\n            'Azure Active Directory Basic for EDU'                                                                   = \"AAD_BASIC_EDU\"\n            'Azure Active Directory Basic for Education'                                                             = \"AAD_BASIC_EDU\"\n            'Azure Active Directory for Education'                                                                   = \"AAD_EDU\"\n            'Azure Active Directory Premium P1'                                                                      = \"AAD_PREMIUM\"\n            'Azure Active Directory Premium P1 for Faculty'                                                          = \"AAD_PREMIUM_FACULTY\"\n            'Azure Active Directory Premium P2'                                                                      = \"AAD_PREMIUM_P2\"\n            'Azure Active Directory Premium Plan 1'                                                                  = \"AAD_PREMIUM\"\n            'Azure Information Protection Plan 1'                                                                    = \"RIGHTSMANAGEMENT\"\n            'Azure Information Protection Premium P'                                                                 = \"RMS_S_PREMIUM\"\n            'AZURE INFORMATION PROTECTION PREMIUM P1'                                                                = \"RMS_S_ENTERPRISE\"\n            'Azure Information Protection Premium P1 for GCC'                                                        = \"RMS_S_PREMIUM_GOV\"\n            'AZURE INFORMATION PROTECTION PREMIUM P2'                                                                = \"RMS_S_PREMIUM2\"\n            'Azure Information Protection Premium P2 for GCC'                                                        = \"RMS_S_PREMIUM2_GOV\"\n            'Azure Rights Management'                                                                                = \"RMS_S_ENTERPRISE\"\n            'AZURE RIGHTS MANAGEMENT PREMIUM FOR GOVERNMENT'                                                         = \"RMS_S_PREMIUM_GOV\"\n            'BI_AZURE_P_2_GOV'                                                                                       = \"BI_AZURE_P_2_GOV\"\n            'BI_AZURE_P0'                                                                                            = \"BI_AZURE_P0\"\n            'BPOS_S_TODO_1'                                                                                          = \"BPOS_S_TODO_1\"\n            'BPOS_S_TODO_2'                                                                                          = \"BPOS_S_TODO_2\"\n            'BPOS_S_TODO_3'                                                                                          = \"BPOS_S_TODO_3\"\n            'Business Apps (free)'                                                                                   = \"SMB_APPS\"\n            'CDS Per app baseline access'                                                                            = \"CDS_PER_APP_IWTRIAL\"\n            'CDS PowerApps per app plan'                                                                             = \"CDS_PER_APP\"\n            'CDS PowerApps Portals page view capacity add-on'                                                        = \"CDS_POWERAPPS_PORTALS_PAGEVIEW\"\n            'CDS PowerApps Portals page view capacity add-on for GCC'                                                = \"CDS_POWERAPPS_PORTALS_PAGEVIEW_GCC\"\n            'CDS_O365_P3_GCC'                                                                                        = \"CDS_O365_P3_GCC\"\n            'CLOUD APP SECURITY DISCOVERY'                                                                           = \"ADALLOM_S_DISCOVERY\"\n            'Common Data Service'                                                                                    = \"DYN365_CDS_FORMS_PRO\"\n            'Common Data Service - DEV VIRAL'                                                                        = \"DYN365_CDS_DEV_VIRAL\"\n            'Common Data Service - O365 F1'                                                                          = \"DYN365_CDS_O365_F1_GCC\"\n            'Common Data Service - O365 P1'                                                                          = \"DYN365_CDS_O365_P1\"\n            'Common Data Service - O365 P1 GCC'                                                                      = \"DYN365_CDS_O365_P1_GCC\"\n            'Common Data Service - O365 P2'                                                                          = \"DYN365_CDS_O365_P2\"\n            'COMMON DATA SERVICE - O365 P2 GCC'                                                                      = \"DYN365_CDS_O365_P2_GCC\"\n            'Common Data Service - O365 P3'                                                                          = \"DYN365_CDS_O365_P3\"\n            'Common Data Service - P2'                                                                               = \"DYN365_CDS_P2\"\n            'Common Data Service - VIRAL'                                                                            = \"DYN365_CDS_VIRAL\"\n            'Common Data Service Attended RPA'                                                                       = \"CDS_ATTENDED_RPA\"\n            'Common Data Service Database Capacity'                                                                  = \"CDS_DB_CAPACITY\"\n            'Common Data Service Database Capacity for Government'                                                   = \"CDS_DB_CAPACITY_GOV\"\n            'Common Data Service for Apps Database Capacity'                                                         = \"CDS_DB_CAPACITY\"\n            'Common Data Service for Apps Database Capacity for Government'                                          = \"CDS_DB_CAPACITY_GOV\"\n            'Common Data Service for Apps File Capacity'                                                             = \"CDS_FILE_CAPACITY\"\n            'Common Data Service for Apps Log Capacity'                                                              = \"CDS_LOG_CAPACITY\"\n            'Common Data Service for CCI Bots'                                                                       = \"DYN365_CDS_CCI_BOTS\"\n            'Common Data Service for Customer Insights'                                                              = \"CDS_CUSTOMER_INSIGHTS\"\n            'Common Data Service for Customer Insights Trial'                                                        = \"CDS_CUSTOMER_INSIGHTS_TRIAL\"\n            'Common Data Service for Dynamics 365 Finance'                                                           = \"DYN365_CDS_FINANCE\"\n            'COMMON DATA SERVICE FOR DYNAMICS 365 SUPPLY CHAIN MANAGEMENT'                                           = \"DYN365_CDS_SUPPLYCHAINMANAGEMENT\"\n            'Common data service for Flow per business process plan'                                                 = \"CDS_Flow_Business_Process\"\n            'Common Data Service for Government'                                                                     = \"DYN365_CDS_P2_GOV\"\n            'Common Data Service for Project'                                                                        = \"DYN365_CDS_PROJECT\"\n            'COMMON DATA SERVICE FOR PROJECT P1'                                                                     = \"DYN365_CDS_FOR_PROJECT_P1\"\n            'Common Data Service for Remote Assist'                                                                  = \"CDS_REMOTE_ASSIST\"\n            'Common Data Service for SharePoint Syntex'                                                              = \"CDS_O365_E5_KM\"\n            'Common Data Service for Teams'                                                                          = \"CDS_O365_P2\"\n            'Common Data Service for Teams_F1'                                                                       = \"CDS_O365_F1\"\n            'Common Data Service for Teams_F1 GCC'                                                                   = \"CDS_O365_F1_GCC\"\n            'COMMON DATA SERVICE FOR TEAMS_P1'                                                                       = \"CDS_O365_P1\"\n            'Common Data Service for Teams_P1 GCC'                                                                   = \"CDS_O365_P1_GCC\"\n            'Common Data Service for Teams_P2'                                                                       = \"CDS_O365_P2\"\n            'COMMON DATA SERVICE FOR TEAMS_P2 GCC'                                                                   = \"CDS_O365_P2_GCC\"\n            'Common Data Service for Teams_P3'                                                                       = \"CDS_O365_P3\"\n            'Common Data Service for Virtual Agent Base'                                                             = \"CDS_VIRTUAL_AGENT_BASE\"\n            'Common Data Service Log Capacity'                                                                       = \"CDS_LOG_CAPACITY\"\n            'Common Data Service Power Apps Portals Login Capacity'                                                  = \"CDS_POWERAPPS_PORTALS_LOGIN\"\n            'Common Data Service Power Apps Portals Login Capacity for GCC'                                          = \"CDS_POWERAPPS_PORTALS_LOGIN_GCC\"\n            'Common Data Service Unattended RPA'                                                                     = \"CDS_UNATTENDED_RPA\"\n            'Communications Credits'                                                                                 = \"MCOPSTNC\"\n            'COMMUNICATIONS_DLP'                                                                                     = \"COMMUNICATIONS_DLP\"\n            'Compliance Manager Premium Assessment Add-On'                                                           = \"CMPA_addon\"\n            'Compliance Manager Premium Assessment Add-On for GCC'                                                   = \"CMPA_addon_GCC\"\n            'Content_Explorer'                                                                                       = \"Content_Explorer\"\n            'ContentExplorer_Standard'                                                                               = \"ContentExplorer_Standard\"\n            'CRM Hybrid Connector'                                                                                   = \"CRM_HYBRIDCONNECTOR\"\n            'Customer Lockbox'                                                                                       = \"LOCKBOX_ENTERPRISE\"\n            'Customer Lockbox for Government'                                                                        = \"LOCKBOX_ENTERPRISE_GOV\"\n            'Customer Voice for Dynamics 365 vTrial'                                                                 = \"CUSTOMER_VOICE_DYN365_VIRAL_TRIAL\"\n            'CUSTOMER_KEY'                                                                                           = \"CUSTOMER_KEY\"\n            'Data Classification in Microsoft 365'                                                                   = \"MIP_S_Exchange\"\n            'Data Classification in Microsoft 365 - Company Level'                                                   = \"MIP_S_EXCHANGE_CO\"\n            'Data Loss Prevention'                                                                                   = \"BPOS_S_DlpAddOn\"\n            'Dataverse for Cust Insights�BASE'                                                                       = \"CDS_CUSTOMER_INSIGHTS_BASE\"\n            'Dataverse for Customer Insights�BASE'                                                                   = \"CDS_CUSTOMER_INSIGHTS_BASE\"\n            'Dataverse for PAD'                                                                                      = \"DATAVERSE_FOR_POWERAUTOMATE_DESKTOP\"\n            'Dataverse for Power Apps per app'                                                                       = \"DATAVERSE_POWERAPPS_PER_APP_NEW\"\n            'Defender Threat Intelligence'                                                                           = \"Defender_Threat_Intelligence\"\n            'DOMESTIC AND INTERNATIONAL CALLING PLAN'                                                                = \"MCOPSTN2\"\n            'Domestic Calling for Government'                                                                        = \"MCOPSTN1_GOV\"\n            'DOMESTIC CALLING PLAN'                                                                                  = \"MCOPSTN1\"\n            'DYN365_CDS_O365_F1'                                                                                     = \"DYN365_CDS_O365_F1\"\n            'DYN365_CDS_O365_P3_GCC'                                                                                 = \"DYN365_CDS_O365_P3_GCC\"\n            'Dynamics 365 - Additional Database Storage (Qualified Offer)'                                           = \"CRMSTORAGE\"\n            'Dynamics 365 - Additional Non-Production Instance (Qualified Offer)'                                    = \"CRMTESTINSTANCE\"\n            'Dynamics 365 - Additional Production Instance (Qualified Offer)'                                        = \"CRMINSTANCE\"\n            'Dynamics 365 AI for Customer Service Trial'                                                             = \"DYN365_AI_SERVICE_INSIGHTS\"\n            'Dynamics 365 AI for Customer Service Virtual Agents Viral'                                              = \"CCIBOTS_PRIVPREV_VIRAL\"\n            'Dynamics 365 AI for Market Insights - Free'                                                             = \"SOCIAL_ENGAGEMENT_APP_USER\"\n            'Dynamics 365 AI for Market Insights (Preview)'                                                          = \"SOCIAL_ENGAGEMENT_APP_USER\"\n            'Dynamics 365 AI for Sales (Embedded)'                                                                   = \"DYN365_SALES_INSIGHTS\"\n            'Dynamics 365 Asset Management Addl Assets'                                                              = \"DYN365_ASSETMANAGEMENT\"\n            'Dynamics 365 Business Central Additional Environment Addon'                                             = \"DYN365_BUSCENTRAL_ADD_ENV_ADDON\"\n            'Dynamics 365 Business Central Database Capacity'                                                        = \"DYN365_BUSCENTRAL_DB_CAPACITY\"\n            'Dynamics 365 Business Central Essentials'                                                               = \"DYN365_BUSCENTRAL_ESSENTIAL\"\n            'Dynamics 365 Business Central External Accountant'                                                      = \"DYN365_FINANCIALS_ACCOUNTANT_SKU\"\n            'Dynamics 365 Business Central for IWs'                                                                  = \"PROJECT_MADEIRA_PREVIEW_IW_SKU\"\n            'Dynamics 365 Business Central Premium'                                                                  = \"DYN365_BUSCENTRAL_PREMIUM\"\n            'Dynamics 365 Business Central Team Members'                                                             = \"DYN365_BUSCENTRAL_TEAM_MEMBER\"\n            'Dynamics 365 Commerce Trial'                                                                            = \"DYN365_RETAIL_TRIAL\"\n            'Dynamics 365 Customer Engagement Plan'                                                                  = \"DYN365_ENTERPRISE_PLAN1\"\n            'Dynamics 365 Customer Insights'                                                                         = \"DYN365_CUSTOMER_INSIGHTS_BASE\"\n            'Dynamics 365 Customer Insights Attach'                                                                  = \"DYN365_CUSTOMER_INSIGHTS_ATTACH\"\n            'Dynamics 365 Customer Insights Engagement Insights'                                                     = \"DYN365_CUSTOMER_INSIGHTS_ENGAGEMENT_INSIGHTS_BASE\"\n            'Dynamics 365 Customer Insights Engagement Insights Viral'                                               = \"DYN365_CUSTOMER_INSIGHTS_ENGAGEMENT_INSIGHTS_BASE_TRIAL\"\n            'Dynamics 365 Customer Insights Standalone'                                                              = \"DYN365_CUSTOMER_INSIGHTS_BASE\"\n            'Dynamics 365 Customer Insights Viral Plan'                                                              = \"DYN365_CUSTOMER_INSIGHTS_VIRAL\"\n            'Dynamics 365 Customer Insights vTrial'                                                                  = \"DYN365_CUSTOMER_INSIGHTS_VIRAL\"\n            'Dynamics 365 Customer Service Chat Application Integration'                                             = \"DYN365_CS_CHAT_FPA\"\n            'Dynamics 365 Customer Service Digital Messaging add-on'                                                 = \"DYN365_CS_MESSAGING_TPS\"\n            'Dynamics 365 Customer Service Digital Messaging vTrial'                                                 = \"DYN365_CS_MESSAGING_VIRAL_TRIAL\"\n            'Dynamics 365 Customer Service Enterprise Admin'                                                         = \"Dynamics_365_Customer_Service_Enterprise_admin_trial\"\n            'Dynamics 365 Customer Service Enterprise Viral Trial'                                                   = \"Dynamics_365_Customer_Service_Enterprise_viral_trial\"\n            'Dynamics 365 Customer Service Enterprise vTrial'                                                        = \"DYN365_CS_ENTERPRISE_VIRAL_TRIAL\"\n            'Dynamics 365 Customer Service Insights for CE Plan'                                                     = \"D365_CSI_EMBED_CE\"\n            'Dynamics 365 Customer Service Insights for CS Enterprise'                                               = \"D365_CSI_EMBED_CSEnterprise\"\n            'Dynamics 365 Customer Service Insights Trial'                                                           = \"DYN365_AI_SERVICE_INSIGHTS\"\n            'Dynamics 365 Customer Service Insights vTrial'                                                          = \"DYNB365_CSI_VIRAL_TRIAL\"\n            'Dynamics 365 Customer Service Professional'                                                             = \"DYN365_CUSTOMER_SERVICE_PRO\"\n            'Dynamics 365 Customer Service Voice vTrial'                                                             = \"DYN365_CS_VOICE_VIRAL_TRIAL\"\n            'Dynamics 365 Customer Voice'                                                                            = \"DYN365_CUSTOMER_VOICE_BASE\"\n            'Dynamics 365 Customer Voice Additional Responses'                                                       = \"DYN365_CUSTOMER_VOICE_ADDON\"\n            'Dynamics 365 Customer Voice Base Plan'                                                                  = \"Customer_Voice_Base\"\n            'Dynamics 365 Customer Voice Trial'                                                                      = \"FORMS_PRO\"\n            'Dynamics 365 Customer Voice USL'                                                                        = \"Forms_Pro_USL\"\n            'Dynamics 365 Enterprise Edition - Additional Portal (Qualified Offer)'                                  = \"CRM_ONLINE_PORTAL\"\n            'Dynamics 365 Field Service Enterprise vTrial'                                                           = \"DYN365_FS_ENTERPRISE_VIRAL_TRIAL\"\n            'Dynamics 365 Field Service Viral Trial'                                                                 = \"Dynamics_365_Field_Service_Enterprise_viral_trial\"\n            'Dynamics 365 Field Service, Enterprise Edition - Resource Scheduling Optimization'                      = \"CRM_AUTO_ROUTING_ADDON\"\n            'Dynamics 365 Finance'                                                                                   = \"DYN365_FINANCE\"\n            'Dynamics 365 for Business Central Essentials'                                                           = \"DYN365_FINANCIALS_BUSINESS\"\n            'Dynamics 365 for Case Management'                                                                       = \"DYN365_ENTERPRISE_CASE_MANAGEMENT\"\n            'Dynamics 365 for Case Management Enterprise Edition'                                                    = \"DYN365_ENTERPRISE_CASE_MANAGEMENT\"\n            'Dynamics 365 for Customer Service'                                                                      = \"DYN365_ENTERPRISE_CUSTOMER_SERVICE\"\n            'Dynamics 365 for Customer Service Chat'                                                                 = \"DYN365_CS_CHAT\"\n            'Dynamics 365 for Customer Service Enterprise Attach'                                                    = \"D365_CUSTOMER_SERVICE_ENT_ATTACH\"\n            'Dynamics 365 for Customer Service Enterprise Attach to Qualifying Dynamics 365 Base Offer A'            = \"D365_CUSTOMER_SERVICE_ENT_ATTACH\"\n            'Dynamics 365 for Customer Service Enterprise Edition'                                                   = \"DYN365_ENTERPRISE_CUSTOMER_SERVICE\"\n            'Dynamics 365 for Customer Service Pro'                                                                  = \"DYN365_CUSTOMER_SERVICE_PRO\"\n            'Dynamics 365 for Customer Service Voice Add-in'                                                         = \"DYN365_CS_VOICE\"\n            'Dynamics 365 for Field Service'                                                                         = \"DYN365_ENTERPRISE_FIELD_SERVICE\"\n            'Dynamics 365 for Field Service Attach'                                                                  = \"D365_FIELD_SERVICE_ATTACH\"\n            'Dynamics 365 for Field Service Attach to Qualifying Dynamics 365 Base Offer'                            = \"D365_FIELD_SERVICE_ATTACH\"\n            'Dynamics 365 for Field Service Enterprise Edition'                                                      = \"DYN365_ENTERPRISE_FIELD_SERVICE\"\n            'Dynamics 365 for Finance and Operations Enterprise edition - Regulatory Service'                        = \"DYN365_REGULATORY_SERVICE\"\n            'DYNAMICS 365 FOR FINANCIALS'                                                                            = \"POWERAPPS_DYN_APPS\"\n            'Dynamics 365 for Financials Business Edition'                                                           = \"DYN365_FINANCIALS_BUSINESS_SKU\"\n            'Dynamics 365 for HCM Trial'                                                                             = \"Dynamics_365_for_HCM_Trial\"\n            'Dynamics 365 for Marketing'                                                                             = \"DYN365_MARKETING_APP\"\n            'Dynamics 365 for Marketing 50K Addnl Contacts'                                                          = \"DYN365_MARKETING_50K_CONTACT_ADDON\"\n            'Dynamics 365 for Marketing Additional Application'                                                      = \"DYN365_MARKETING_APPLICATION_ADDON\"\n            'Dynamics 365 for Marketing Additional Non-Prod Application'                                             = \"DYN365_MARKETING_SANDBOX_APPLICATION_ADDON\"\n            'Dynamics 365 for Marketing Addnl Contacts Tier 3'                                                       = \"DYN365_MARKETING_CONTACT_ADDON_T3\"\n            'Dynamics 365 for Marketing Addnl Contacts Tier 5'                                                       = \"DYN365_MARKETING_CONTACT_ADDON_T5\"\n            'Dynamics 365 for Marketing Attach'                                                                      = \"DYN365_MARKETING_APP_ATTACH\"\n            'Dynamics 365 for Marketing Business Edition'                                                            = \"DYN365_BUSINESS_MARKETING\"\n            'Dynamics 365 for Marketing MSE User'                                                                    = \"DYN365_MARKETING_MSE_USER\"\n            'Dynamics 365 for Marketing USL'                                                                         = \"D365_MARKETING_USER\"\n            'Dynamics 365 for Operations Devices'                                                                    = \"Dynamics_365_for_OperationsDevices\"\n            'Dynamics 365 for Operations Enterprise Edition - Sandbox Tier 4:Standard Performance Testing'           = \"Dynamics_365_for_Operations_Sandbox_Tier4\"\n            'Dynamics 365 for Operations non-production multi-box instance for standard acceptance testing (Tier 2)' = \"Dynamics_365_for_Operations_Sandbox_Tier2\"\n            'DYNAMICS 365 FOR OPERATIONS TEAM MEMBERS'                                                               = \"DYNAMICS_365_FOR_OPERATIONS_TEAM_MEMBERS\"\n            'DYNAMICS 365 FOR RETAIL'                                                                                = \"Dynamics_365_for_Retail\"\n            'Dynamics 365 for Retail Device'                                                                         = \"DYN365_RETAIL_DEVICE\"\n            'DYNAMICS 365 FOR RETAIL TEAM MEMBERS'                                                                   = \"Dynamics_365_for_Retail_Team_members\"\n            'Dynamics 365 for Retail Trial'                                                                          = \"DYN365_RETAIL_TRIAL\"\n            'DYNAMICS 365 FOR SALES'                                                                                 = \"DYN365_ENTERPRISE_SALES\"\n            'Dynamics 365 for Sales and Customer Service Enterprise Edition'                                         = \"DYN365_ENTERPRISE_SALES_CUSTOMERSERVICE\"\n            'Dynamics 365 for Sales Enterprise Attach'                                                               = \"D365_SALES_ENT_ATTACH\"\n            'Dynamics 365 for Sales Enterprise Edition'                                                              = \"DYN365_ENTERPRISE_SALES\"\n            'Dynamics 365 for Sales Pro Attach'                                                                      = \"D365_SALES_PRO_ATTACH\"\n            'Dynamics 365 For Sales Professional'                                                                    = \"D365_SALES_PRO\"\n            'Dynamics 365 For Sales Professional Trial'                                                              = \"D365_SALES_PRO_IW\"\n            'Dynamics 365 for Supply Chain Management'                                                               = \"DYN365_SCM\"\n            'Dynamics 365 for Talent'                                                                                = \"SKU_Dynamics_365_for_HCM_Trial\"\n            'DYNAMICS 365 FOR TALENT - ATTRACT EXPERIENCE TEAM MEMBER'                                               = \"DYN365_Enterprise_Talent_Attract_TeamMember\"\n            'DYNAMICS 365 FOR TALENT - ONBOARD EXPERIENCE'                                                           = \"DYN365_Enterprise_Talent_Onboard_TeamMember\"\n            'DYNAMICS 365 FOR TALENT TEAM MEMBERS'                                                                   = \"Dynamics_365_for_Talent_Team_members\"\n            'Dynamics 365 for Talent: Attract'                                                                       = \"Dynamics_365_Hiring_Free_PLAN\"\n            'Dynamics 365 for Talent: Onboard'                                                                       = \"Dynamics_365_Onboarding_Free_PLAN\"\n            'Dynamics 365 for Team Members'                                                                          = \"DYN365_FINANCIALS_TEAM_MEMBERS\"\n            'Dynamics 365 for Team Members Enterprise Edition'                                                       = \"DYN365_ENTERPRISE_TEAM_MEMBERS\"\n            'DYNAMICS 365 FOR_OPERATIONS'                                                                            = \"Dynamics_365_for_Operations\"\n            'Dynamics 365 Guides'                                                                                    = \"GUIDES_USER\"\n            'DYNAMICS 365 HIRING FREE PLAN'                                                                          = \"DYNAMICS_365_HIRING_FREE_PLAN\"\n            'Dynamics 365 Hybrid Connector'                                                                          = \"CRM_HYBRIDCONNECTOR\"\n            'Dynamics 365 Marketing'                                                                                 = \"DYN365_BUSINESS_Marketing\"\n            'Dynamics 365 Marketing Sandbox Application AddOn'                                                       = \"DYN365_MARKETING_SANDBOX_APPLICATION_ADDON\"\n            'Dynamics 365 Operations - Device'                                                                       = \"Dynamics_365_for_Operations_Devices\"\n            'Dynamics 365 Operations - Sandbox Tier 2:Standard Acceptance Testing'                                   = \"Dynamics_365_for_Operations_Sandbox_Tier2_SKU\"\n            'Dynamics 365 Operations - Sandbox Tier 4:Standard Performance Testing'                                  = \"Dynamics_365_for_Operations_Sandbox_Tier4_SKU\"\n            'Dynamics 365 Operations Trial Environment'                                                              = \"ERP_TRIAL_INSTANCE\"\n            'Dynamics 365 P1'                                                                                        = \"DYN365_ENTERPRISE_P1\"\n            'Dynamics 365 P1 Tria for Information Workers'                                                           = \"DYN365_ENTERPRISE_P1_IW\"\n            'DYNAMICS 365 P1 TRIAL FOR INFORMATION WORKERS'                                                          = \"DYN365_ENTERPRISE_P1_IW\"\n            'Dynamics 365 Project Operations'                                                                        = \"D365_ProjectOperations\"\n            'Dynamics 365 Project Operations CDS'                                                                    = \"D365_ProjectOperationsCDS\"\n            'Dynamics 365 Regulatory Service - Enterprise Edition Trial'                                             = \"DYN365_REGULATORY_SERVICE\"\n            'Dynamics 365 Remote Assist'                                                                             = \"MICROSOFT_REMOTE_ASSIST\"\n            'Dynamics 365 Remote Assist HoloLens'                                                                    = \"MICROSOFT_REMOTE_ASSIST_HOLOLENS\"\n            'Dynamics 365 Sales Enterprise Attach to Qualifying Dynamics 365 Base Offer'                             = \"D365_SALES_ENT_ATTACH\"\n            'Dynamics 365 Sales Enterprise vTrial'                                                                   = \"DYN365_SALES_ENTERPRISE_VIRAL_TRIAL\"\n            'Dynamics 365 Sales Insights vTrial'                                                                     = \"DYN365_SALES_INSIGHTS_VIRAL_TRIAL\"\n            'Dynamics 365 Sales Premium'                                                                             = \"DYN365_SALES_PREMIUM\"\n            'Dynamics 365 Sales Premium Viral Trial'                                                                 = \"Dynamics_365_Sales_Premium_Viral_Trial\"\n            'Dynamics 365 Sales Professional Attach to Qualifying Dynamics 365 Base Offer'                           = \"D365_SALES_PRO_ATTACH\"\n            'Dynamics 365 Sales, Field Service and Customer Service Partner Sandbox'                                 = \"Dynamics_365_Sales_Field_Service_and_Customer_Service_Partner_Sandbox\"\n            'Dynamics 365 Talent: Attract'                                                                           = \"Dynamics_365_Hiring_SKU\"\n            'Dynamics 365 Talent: Onboard'                                                                           = \"DYNAMICS_365_ONBOARDING_SKU\"\n            'Dynamics 365 Team Members'                                                                              = \"DYN365_TEAM_MEMBERS\"\n            'Dynamics 365 UNF OPS Plan ENT Edition'                                                                  = \"Dynamics_365_for_Operations\"\n            'Dynamics Customer Voice Add-On'                                                                         = \"CUSTOMER_VOICE_ADDON\"\n            'Education Analytics'                                                                                    = \"EducationAnalyticsP1\"\n            'Enterprise Mobility + Security A3 for Faculty'                                                          = \"EMS_EDU_FACULTY\"\n            'Enterprise Mobility + Security E3'                                                                      = \"EMS\"\n            'Enterprise Mobility + Security E5'                                                                      = \"EMSPREMIUM\"\n            'Enterprise Mobility + Security G3 GCC'                                                                  = \"EMS_GOV\"\n            'Enterprise Mobility + Security G5 GCC'                                                                  = \"EMSPREMIUM_GOV\"\n            'EQUIVIO_ANALYTICS_GOV'                                                                                  = \"EQUIVIO_ANALYTICS_GOV\"\n            'Exchange Enterprise CAL Services (EOP DLP)'                                                             = \"EOP_ENTERPRISE_PREMIUM\"\n            'EXCHANGE ESSENTIALS'                                                                                    = \"EXCHANGE_S_ESSENTIALS\"\n            'Exchange Foundation'                                                                                    = \"EXCHANGE_S_FOUNDATION\"\n            'Exchange Foundation for Government'                                                                     = \"EXCHANGE_S_FOUNDATION_GOV\"\n            'Exchange Online (Kiosk) for Government'                                                                 = \"EXCHANGE_S_DESKLESS_GOV\"\n            'EXCHANGE ONLINE (P1)'                                                                                   = \"EXCHANGE_L_STANDARD\"\n            'Exchange Online (Plan 1)'                                                                               = \"EXCHANGESTANDARD\"\n            'Exchange Online (Plan 1) for Alumni with Yammer'                                                        = \"EXCHANGESTANDARD_ALUMNI\"\n            'Exchange Online (Plan 1) for GCC'                                                                       = \"EXCHANGESTANDARD_GOV\"\n            'Exchange Online (Plan 1) for Government'                                                                = \"EXCHANGE_S_STANDARD_GOV\"\n            'Exchange Online (Plan 1) for Students'                                                                  = \"EXCHANGESTANDARD_STUDENT\"\n            'Exchange Online (Plan 2)'                                                                               = \"EXCHANGEENTERPRISE\"\n            'Exchange Online (Plan 2) for Faculty'                                                                   = \"EXCHANGEENTERPRISE_FACULTY\"\n            'Exchange Online (Plan 2) for Government'                                                                = \"EXCHANGE_S_ENTERPRISE_GOV\"\n            'Exchange Online Archiving'                                                                              = \"EXCHANGE_S_ARCHIVE_ADDON\"\n            'Exchange Online Archiving for Exchange Online'                                                          = \"EXCHANGEARCHIVE_ADDON\"\n            'Exchange Online Archiving for Exchange Server'                                                          = \"EXCHANGEARCHIVE\"\n            'Exchange Online Essentials'                                                                             = \"EXCHANGE_S_ESSENTIALS\"\n            'Exchange Online Essentials (ExO P1 Based)'                                                              = \"EXCHANGEESSENTIALS\"\n            'Exchange Online Kiosk'                                                                                  = \"EXCHANGEDESKLESS\"\n            'Exchange Online Multi-Geo'                                                                              = \"EXCHANGEONLINE_MULTIGEO\"\n            'EXCHANGE ONLINE PLAN'                                                                                   = \"EXCHANGE_S_STANDARD_MIDMARKET\"\n            'Exchange Online POP'                                                                                    = \"EXCHANGETELCO\"\n            'Exchange Online Protection'                                                                             = \"EOP_ENTERPRISE\"\n            'EXCHANGE PLAN 2G'                                                                                       = \"EXCHANGE_S_ENTERPRISE_GOV\"\n            'EXCHANGE_ANALYTICS_GOV'                                                                                 = \"EXCHANGE_ANALYTICS_GOV\"\n            'EXCHANGE_S_DESKLESS'                                                                                    = \"EXCHANGE_S_DESKLESS\"\n            'EXCHANGE_S_ENTERPRISE_GOV'                                                                              = \"EXCHANGE_S_ENTERPRISE_GOV\"\n            'EXCHANGE_S_FOUNDATION'                                                                                  = \"EXCHANGE_S_FOUNDATION\"\n            'EXCHANGE_S_FOUNDATION_GOV'                                                                              = \"EXCHANGE_S_FOUNDATION_GOV\"\n            'Field Service � Automated Routing Engine Add-On'                                                        = \"CRM_AUTO_ROUTING_ENGINE_ADDON\"\n            'Flow for CCI Bots'                                                                                      = \"FLOW_CCI_BOTS\"\n            'Flow for Developer'                                                                                     = \"FLOW_DEV_VIRAL\"\n            'FLOW FOR DYNAMICS 36'                                                                                   = \"FLOW_DYN_P2\"\n            'Flow for Dynamics 365'                                                                                  = \"FLOW_DYN_APPS\"\n            'FLOW FOR OFFICE 365'                                                                                    = \"FLOW_O365_P1\"\n            'Flow for Project'                                                                                       = \"FLOW_FOR_PROJECT\"\n            'Flow Free'                                                                                              = \"FLOW_P2_VIRAL\"\n            'Flow P2 Viral'                                                                                          = \"FLOW_P2_VIRAL_REAL\"\n            'Flow per app baseline access'                                                                           = \"Flow_Per_APP_IWTRIAL\"\n            'Flow per business process plan'                                                                         = \"FLOW_BUSINESS_PROCESS\"\n            'Flow per user plan'                                                                                     = \"FLOW_PER_USER\"\n            'FLOW_O365_P3_GOV'                                                                                       = \"FLOW_O365_P3_GOV\"\n            'Forms for Government (Plan E1)'                                                                         = \"FORMS_GOV_E1\"\n            'FORMS FOR GOVERNMENT (PLAN E3)'                                                                         = \"FORMS_GOV_E3\"\n            'Forms for Government (Plan F1)'                                                                         = \"FORMS_GOV_F1\"\n            'FORMS_GOV_E5'                                                                                           = \"FORMS_GOV_E5\"\n            'Graph Connectors Search with Index'                                                                     = \"GRAPH_CONNECTORS_SEARCH_INDEX\"\n            'Graph Connectors Search with Index (Microsoft Viva Topics)'                                             = \"GRAPH_CONNECTORS_SEARCH_INDEX_TOPICEXP\"\n            'Graph Connectors Search with Index (Viva Topics)'                                                       = \"GRAPH_CONNECTORS_SEARCH_INDEX_TOPICEXP\"\n            'INFO_GOVERNANCE'                                                                                        = \"INFO_GOVERNANCE\"\n            'Information Barriers'                                                                                   = \"INFORMATION_BARRIERS\"\n            'Information Protection and Governance Analytics � Premium'                                              = \"Content_Explorer\"\n            'Information Protection and Governance Analytics - Premium'                                              = \"Content_Explorer\"\n            'Information Protection and Governance Analytics - Premium)'                                             = \"Content_Explorer\"\n            'Information Protection and Governance Analytics � Standard'                                             = \"ContentExplorer_Standard\"\n            'Information Protection and Governance Analytics - Standard'                                             = \"ContentExplorer_Standard\"\n            'Information Protection and Governance Analytics -Premium'                                               = \"Content_Explorer\"\n            'Information Protection for Office 365 - Premium'                                                        = \"MIP_S_CLP2\"\n            'Information Protection for Office 365 - Standard'                                                       = \"MIP_S_CLP1\"\n            'INFORMATION_BARRIERS'                                                                                   = \"INFORMATION_BARRIERS\"\n            'Insights by MyAnalytics'                                                                                = \"MYANALYTICS_P2\"\n            'INSIGHTS BY MYANALYTICS FOR GOVERNMENT'                                                                 = \"MYANALYTICS_P2_GOV\"\n            'Intune'                                                                                                 = \"INTUNE_A\"\n            'Intune Advanced endpoint analytics'                                                                     = \"Intune_AdvancedEA\"\n            'Intune Endpoint Privilege Management'                                                                   = \"Intune-EPM\"\n            'Intune for Education'                                                                                   = \"INTUNE_EDU\"\n            'Intune Plan 2'                                                                                          = \"INTUNE_P2\"\n            'INTUNE_A'                                                                                               = \"INTUNE_A\"\n            'INTUNE_O365'                                                                                            = \"INTUNE_O365\"\n            'IoT Intelligence Add-in Additional Machines'                                                            = \"D365_IOTFORSCM_ADDITIONAL\"\n            'Iot Intelligence Add-in for D365 Supply Chain Management'                                               = \"D365_IOTFORSCM\"\n            'LOCKBOX_ENTERPRISE_GOV'                                                                                 = \"LOCKBOX_ENTERPRISE_GOV\"\n            'LOGIC FLOWS'                                                                                            = \"POWERFLOWSFREE\"\n            'M365 Communication Compliance'                                                                          = \"MICROSOFT_COMMUNICATION_COMPLIANCE\"\n            'M365_ADVANCED_AUDITING'                                                                                 = \"M365_ADVANCED_AUDITING\"\n            'MCO FREE FOR MICROSOFT TEAMS (FREE)'                                                                    = \"MCOFREE\"\n            'MCOEV_GOV'                                                                                              = \"MCOEV_GOV\"\n            'MCOIMP'                                                                                                 = \"MCOIMP\"\n            'MCOMEETADV_GOV'                                                                                         = \"MCOMEETADV_GOV\"\n            'MCOPSTN3'                                                                                               = \"MCOPSTN3\"\n            'MCOSTANDARD_GOV'                                                                                        = \"MCOSTANDARD_GOV\"\n            'MCS - BizApps_Cloud for Sustainability_vTrial'                                                          = \"MCS_BizApps_Cloud_for_Sustainability_vTrial\"\n            'MDE_SecurityManagement'                                                                                 = \"Intune_Defender\"\n            'Meeting Room Managed Services'                                                                          = \"MMR_P1\"\n            'MFA_PREMIUM'                                                                                            = \"MFA_PREMIUM\"\n            'Microsoft 365 A1'                                                                                       = \"M365EDU_A1\"\n            'Microsoft 365 A3 - Unattended License for students use benefit'                                         = \"M365EDU_A3_STUUSEBNFT_RPA1\"\n            'Microsoft 365 A3 for Faculty'                                                                           = \"M365EDU_A3_FACULTY\"\n            'Microsoft 365 A3 for Students'                                                                          = \"M365EDU_A3_STUDENT\"\n            'Microsoft 365 A3 for students use benefit'                                                              = \"M365EDU_A3_STUUSEBNFT\"\n            'Microsoft 365 A3 Suite features for faculty'                                                            = \"Microsoft 365 A3 Suite features for faculty\"\n            'Microsoft 365 A5 for Faculty'                                                                           = \"M365EDU_A5_FACULTY\"\n            'Microsoft 365 A5 for Students'                                                                          = \"M365EDU_A5_STUDENT\"\n            'Microsoft 365 A5 for students use benefit'                                                              = \"M365EDU_A5_STUUSEBNFT\"\n            'Microsoft 365 A5 Suite features for faculty'                                                            = \"M365_A5_SUITE_COMPONENTS_FACULTY\"\n            'Microsoft 365 A5 without Audio Conferencing for students use benefit'                                   = \"M365EDU_A5_NOPSTNCONF_STUUSEBNFT\"\n            'Microsoft 365 Advanced Auditing'                                                                        = \"M365_ADVANCED_AUDITING\"\n            'Microsoft 365 Advanced Communications'                                                                  = \"TEAMS_ADVCOMMS\"\n            'Microsoft 365 Apps for Business'                                                                        = \"SMB_BUSINESS\"\n            'Microsoft 365 Apps for Enterprise'                                                                      = \"OFFICESUBSCRIPTION\"\n            'Microsoft 365 Apps for enterprise (device)'                                                             = \"OFFICE_PROPLUS_DEVICE1\"\n            'Microsoft 365 Apps for Enterprise (Unattended)'                                                         = \"OFFICESUBSCRIPTION_unattended\"\n            'Microsoft 365 Apps for enterprise G'                                                                    = \"OFFICESUBSCRIPTION_GOV\"\n            'Microsoft 365 Apps for Faculty'                                                                         = \"OFFICESUBSCRIPTION_FACULTY\"\n            'Microsoft 365 Apps for Students'                                                                        = \"OFFICESUBSCRIPTION_STUDENT\"\n            'Microsoft 365 Audio Conferencing'                                                                       = \"MCOMEETADV\"\n            'Microsoft 365 Audio Conferencing for GCC'                                                               = \"MCOMEETADV_GOV\"\n            'MICROSOFT 365 AUDIO CONFERENCING FOR GOVERNMENT'                                                        = \"MCOMEETADV_GOV\"\n            'Microsoft 365 Audio Conferencing Pay-Per-Minute'                                                        = \"MCOMEETACPEA\"\n            'Microsoft 365 Audio Conferencing Pay-Per-Minute - EA'                                                   = \"MCOMEETACPEA\"\n            'Microsoft 365 Audit Platform'                                                                           = \"M365_AUDIT_PLATFORM\"\n            'Microsoft 365 Business Basic'                                                                           = \"SMB_BUSINESS_ESSENTIALS\"\n            'Microsoft 365 Business Premium'                                                                         = \"SPB\"\n            'Microsoft 365 Business Standard'                                                                        = \"O365_BUSINESS_PREMIUM\"\n            'Microsoft 365 Business Standard - Prepaid Legacy'                                                       = \"SMB_BUSINESS_PREMIUM\"\n            'Microsoft 365 Communication Compliance'                                                                 = \"MICROSOFT_COMMUNICATION_COMPLIANCE\"\n            'Microsoft 365 Defender'                                                                                 = \"MTP\"\n            'Microsoft 365 Domestic Calling Plan'                                                                    = \"MCOPSTN1\"\n            'MICROSOFT 365 DOMESTIC CALLING PLAN (120 min)'                                                          = \"MCOPSTN5\"\n            'Microsoft 365 Domestic Calling Plan (120 min) at User Level'                                            = \"MCOPSTN8\"\n            'Microsoft 365 Domestic Calling Plan (120 Minutes)'                                                      = \"MCOPSTN_5\"\n            'Microsoft 365 Domestic Calling Plan for GCC'                                                            = \"MCOPSTN_1_GOV\"\n            'Microsoft 365 E3'                                                                                       = \"SPE_E3\"\n            'Microsoft 365 E3 - Unattended License'                                                                  = \"SPE_E3_RPA1\"\n            'Microsoft 365 E3 (500 seats min)_HUB'                                                                   = \"Microsoft_365_E3\"\n            'Microsoft 365 E3 Extra Features'                                                                        = \"Microsoft_365_E3_Extra_Features\"\n            'Microsoft 365 E3_USGOV_DOD'                                                                             = \"SPE_E3_USGOV_DOD\"\n            'Microsoft 365 E3_USGOV_GCCHIGH'                                                                         = \"SPE_E3_USGOV_GCCHIGH\"\n            'Microsoft 365 E5'                                                                                       = \"SPE_E5\"\n            'Microsoft 365 E5 (500 seats min)_HUB'                                                                   = \"Microsoft_365_E5\"\n            'Microsoft 365 E5 Compliance'                                                                            = \"INFORMATION_PROTECTION_COMPLIANCE\"\n            'Microsoft 365 E5 Developer (without Windows and Audio Conferencing)'                                    = \"DEVELOPERPACK_E5\"\n            'Microsoft 365 E5 Security'                                                                              = \"IDENTITY_THREAT_PROTECTION\"\n            'Microsoft 365 E5 Security for EMS E5'                                                                   = \"IDENTITY_THREAT_PROTECTION_FOR_EMS_E5\"\n            'Microsoft 365 E5 Suite features'                                                                        = \"M365_E5_SUITE_COMPONENTS\"\n            'Microsoft 365 E5 with Calling Minutes'                                                                  = \"SPE_E5_CALLINGMINUTES\"\n            'Microsoft 365 E5 without Audio Conferencing'                                                            = \"SPE_E5_NOPSTNCONF\"\n            'Microsoft 365 E5 without Audio Conferencing (500 seats min)_HUB'                                        = \"Microsoft_365_E5_without_Audio_Conferencing\"\n            'Microsoft 365 F1'                                                                                       = \"M365_F1_COMM\"\n            'Microsoft 365 F3'                                                                                       = \"SPE_F1\"\n            'Microsoft 365 F3 GCC'                                                                                   = \"M365_F1_GOV\"\n            'Microsoft 365 F5 Compliance Add-on'                                                                     = \"SPE_F5_COMP\"\n            'Microsoft 365 F5 Compliance Add-on AR (DOD)_USGOV_DOD'                                                  = \"SPE_F5_COMP_AR_D_USGOV_DOD\"\n            'Microsoft 365 F5 Compliance Add-on AR_USGOV_GCCHIGH'                                                    = \"SPE_F5_COMP_AR_USGOV_GCCHIGH\"\n            'Microsoft 365 F5 Compliance Add-on GCC'                                                                 = \"SPE_F5_COMP_GCC\"\n            'Microsoft 365 F5 Security + Compliance Add-on'                                                          = \"SPE_F5_SECCOMP\"\n            'Microsoft 365 F5 Security Add-on'                                                                       = \"SPE_F5_SEC\"\n            'Microsoft 365 G3 GCC'                                                                                   = \"M365_G3_GOV\"\n            'Microsoft 365 GCC G5'                                                                                   = \"M365_G5_GCC\"\n            'Microsoft 365 Lighthouse'                                                                               = \"Microsoft365_Lighthouse\"\n            'Microsoft 365 Lighthouse (Plan 1)'                                                                      = \"M365_LIGHTHOUSE_CUSTOMER_PLAN1\"\n            'Microsoft 365 Lighthouse (Plan 2)'                                                                      = \"M365_LIGHTHOUSE_PARTNER_PLAN1\"\n            'Microsoft 365 Phone Standard Resource Account'                                                          = \"MCOEV_VIRTUALUSER\"\n            'Microsoft 365 Phone Standard Resource Account for Government'                                           = \"MCOEV_VIRTUALUSER_GOV\"\n            'MICROSOFT 365 PHONE SYSTE'                                                                              = \"MCOEV\"\n            'Microsoft 365 Phone System'                                                                             = \"MCOEV\"\n            'Microsoft 365 Phone System for Government'                                                              = \"MCOEV_GOV\"\n            'Microsoft 365 Security and Compliance for Firstline Workers'                                            = \"M365_SECURITY_COMPLIANCE_FOR_FLW\"\n            'Microsoft Application Protection and Governance (A)'                                                    = \"MICROSOFT_APPLICATION_PROTECTION_AND_GOVERNANCE_A\"\n            'Microsoft Application Protection and Governance (D)'                                                    = \"MICROSOFT_APPLICATION_PROTECTION_AND_GOVERNANCE_D\"\n            'MICROSOFT AZURE ACTIVE DIRECTORY BASIC'                                                                 = \"AAD_BASIC\"\n            'MICROSOFT AZURE ACTIVE DIRECTORY RIGHTS'                                                                = \"RMS_S_PREMIUM\"\n            'Microsoft Azure Multi-Factor Authentication'                                                            = \"MFA_STANDALONE\"\n            'Microsoft Azure Rights Management Service'                                                              = \"RMS_S_BASIC\"\n            'Microsoft Bookings'                                                                                     = \"MICROSOFTBOOKINGS\"\n            'Microsoft Business Center'                                                                              = \"MICROSOFT_BUSINESS_CENTER\"\n            'Microsoft Cloud App Security'                                                                           = \"ADALLOM_STANDALONE\"\n            'Microsoft Cloud for Sustainability vTrial'                                                              = \"Microsoft_Cloud_for_Sustainability_vTrial\"\n            'Microsoft Communications Compliance'                                                                    = \"COMMUNICATIONS_COMPLIANCE\"\n            'Microsoft Communications DLP'                                                                           = \"COMMUNICATIONS_DLP\"\n            'Microsoft Customer Key'                                                                                 = \"CUSTOMER_KEY\"\n            'Microsoft Data Investigations'                                                                          = \"DATA_INVESTIGATIONS\"\n            'Microsoft Defender for Business'                                                                        = \"MDE_SMB\"\n            'Microsoft Defender for Cloud Apps'                                                                      = \"ADALLOM_S_STANDALONE\"\n            'Microsoft Defender for Cloud Apps Discovery'                                                            = \"ADALLOM_S_DISCOVERY\"\n            'Microsoft Defender for Cloud Apps for DOD'                                                              = \"ADALLOM_S_STANDALONE_DOD\"\n            'Microsoft Defender for Endpoint'                                                                        = \"WIN_DEF_ATP\"\n            'Microsoft Defender for Endpoint P1'                                                                     = \"DEFENDER_ENDPOINT_P1\"\n            'Microsoft Defender for Endpoint P1 for EDU'                                                             = \"DEFENDER_ENDPOINT_P1_EDU\"\n            'Microsoft Defender for Endpoint P2_XPLAT'                                                               = \"MDATP_XPLAT\"\n            'Microsoft Defender for Endpoint Plan 1'                                                                 = \"MDE_LITE\"\n            'Microsoft Defender for Endpoint Server'                                                                 = \"MDATP_Server\"\n            'Microsoft Defender for Identity'                                                                        = \"ATA\"\n            'Microsoft Defender for Office 365 (Plan 1)'                                                             = \"ATP_ENTERPRISE\"\n            'Microsoft Defender for Office 365 (Plan 1) Faculty'                                                     = \"ATP_ENTERPRISE_FACULTY\"\n            'Microsoft Defender for Office 365 (Plan 1) for Government'                                              = \"ATP_ENTERPRISE_GOV\"\n            'Microsoft Defender for Office 365 (Plan 1) GCC'                                                         = \"ATP_ENTERPRISE_GOV\"\n            'Microsoft Defender for Office 365 (Plan 2)'                                                             = \"THREAT_INTELLIGENCE\"\n            'Microsoft Defender for Office 365 (Plan 2) for Government'                                              = \"THREAT_INTELLIGENCE_GOV\"\n            'Microsoft Defender for Office 365 (Plan 2) GCC'                                                         = \"THREAT_INTELLIGENCE_GOV\"\n            'Microsoft Defender Vulnerability Management'                                                            = \"TVM_Premium_Standalone\"\n            'Microsoft Defender Vulnerability Management Add-on'                                                     = \"TVM_Premium_Add_on\"\n            'Microsoft Dynamics 365 Customer Voice Add-on'                                                           = \"Forms_Pro_AddOn\"\n            'Microsoft Dynamics 365 Customer Voice for Customer Engagement Plan'                                     = \"Forms_Pro_CE\"\n            'Microsoft Dynamics 365 Customer Voice for Customer Insights'                                            = \"Forms_Pro_Customer_Insights\"\n            'Microsoft Dynamics 365 Customer Voice for Customer Insights App'                                        = \"Customer_Voice_Customer_Insights\"\n            'Microsoft Dynamics 365 Customer Voice for Customer Service Enterprise'                                  = \"Forms_Pro_Service\"\n            'Microsoft Dynamics 365 Customer Voice for Field Service'                                                = \"Forms_Pro_FS\"\n            'Microsoft Dynamics 365 Customer Voice for Marketing'                                                    = \"Forms_Pro_Marketing\"\n            'Microsoft Dynamics 365 Customer Voice for Marketing Application'                                        = \"Forms_Pro_Marketing_App\"\n            'Microsoft Dynamics 365 Customer Voice for Relationship Sales'                                           = \"Forms_Pro_Relationship_Sales\"\n            'Microsoft Dynamics 365 Customer Voice for Sales Enterprise'                                             = \"Forms_Pro_SalesEnt\"\n            'Microsoft Dynamics 365 Customer Voice USL'                                                              = \"Forms_Pro_USL\"\n            'Microsoft Dynamics 365 for Finance'                                                                     = \"D365_Finance\"\n            'Microsoft Dynamics AX7 User Trial'                                                                      = \"AX7_USER_TRIAL\"\n            'Microsoft Dynamics CRM Online'                                                                          = \"CRMSTANDARD\"\n            'Microsoft Dynamics CRM Online - Portal Add-On'                                                          = \"CRM_ONLINE_PORTAL\"\n            'Microsoft Dynamics CRM Online Additional Test Instance'                                                 = \"CRMTESTINSTANCE\"\n            'Microsoft Dynamics CRM Online Basic'                                                                    = \"CRMPLAN2\"\n            'Microsoft Dynamics CRM Online Instance'                                                                 = \"CRMINSTANCE\"\n            'MICROSOFT DYNAMICS CRM ONLINE PROFESSIONA'                                                              = \"CRMSTANDARD\"\n            'Microsoft Dynamics CRM Online Storage Add-On'                                                           = \"CRMSTORAGE\"\n            'MICROSOFT DYNAMICS MARKETING SALES COLLABORATION - ELIGIBILITY CRITERIA APPLY'                          = \"MDM_SALES_COLLABORATION\"\n            'Microsoft eCDN'                                                                                         = \"MICROSOFT_ECDN\"\n            'Microsoft Endpoint DLP'                                                                                 = \"MICROSOFTENDPOINTDLP\"\n            'Microsoft Excel Advanced Analytics'                                                                     = \"EXCEL_PREMIUM\"\n            'Microsoft Fabric (Free)'                                                                                = \"POWER_BI_STANDARD\"\n            'Microsoft Fabric (Free) for faculty'                                                                    = \"POWER_BI_STANDARD_FACULTY\"\n            'Microsoft Fabric (Free) for student'                                                                    = \"POWER_BI_STANDARD_STUDENT\"\n            'Microsoft Forms (Plan 2)'                                                                               = \"OFFICE_FORMS_PLAN_2\"\n            'Microsoft Forms (Plan 3)'                                                                               = \"OFFICE_FORMS_PLAN_3\"\n            'MICROSOFT FORMS (PLAN E1)'                                                                              = \"FORMS_PLAN_E1\"\n            'Microsoft Forms (Plan E3)'                                                                              = \"FORMS_PLAN_E3\"\n            'Microsoft Forms (Plan E5)'                                                                              = \"FORMS_PLAN_E5\"\n            'Microsoft Forms (Plan F1)'                                                                              = \"FORMS_PLAN_K\"\n            'Microsoft Forms for Government (Plan E5)'                                                               = \"FORMS_GOV_E5\"\n            'Microsoft Imagine Academy'                                                                              = \"IT_ACADEMY_AD\"\n            'Microsoft Information Governance'                                                                       = \"INFO_GOVERNANCE\"\n            'Microsoft Insider Risk Management'                                                                      = \"INSIDER_RISK\"\n            'Microsoft Intune'                                                                                       = \"INTUNE_A\"\n            'Microsoft Intune Device'                                                                                = \"INTUNE_A_D\"\n            'Microsoft Intune Device for Government'                                                                 = \"INTUNE_A_D_GOV\"\n            'Microsoft Intune for Education'                                                                         = \"INTUNE_EDU\"\n            'Microsoft Intune Plan 1'                                                                                = \"INTUNE_A\"\n            'Microsoft Intune Plan 1 for Education'                                                                  = \"INTUNE_EDU\"\n            'Microsoft Intune SMB'                                                                                   = \"INTUNE_SMB\"\n            'Microsoft Intune Suite'                                                                                 = \"Microsoft_Intune_Suite\"\n            'Microsoft Invoicing'                                                                                    = \"DYN365BC_MS_INVOICING\"\n            'Microsoft Kaizala'                                                                                      = \"KAIZALA_STANDALONE\"\n            'Microsoft Kaizala Pro'                                                                                  = \"KAIZALA_O365_P3\"\n            'Microsoft Kaizala Pro Plan 1'                                                                           = \"KAIZALA_O365_P1\"\n            'Microsoft Kaizala Pro Plan 2'                                                                           = \"KAIZALA_O365_P2\"\n            'Microsoft Kaizala Pro Plan 3'                                                                           = \"KAIZALA_O365_P3\"\n            'Microsoft ML-Based Classification'                                                                      = \"ML_CLASSIFICATION\"\n            'Microsoft MyAnalytics (Full)'                                                                           = \"EXCHANGE_ANALYTICS\"\n            'Microsoft MyAnalytics for Government (Full)'                                                            = \"EXCHANGE_ANALYTICS_GOV\"\n            'MICROSOFT PLANNE'                                                                                       = \"PROJECTWORKMANAGEMENT\"\n            'Microsoft Planner'                                                                                      = \"PROJECTWORKMANAGEMENT\"\n            'Microsoft Power Apps for Developer'                                                                     = \"POWERAPPS_DEV\"\n            'Microsoft Power Apps Plan 2 (Qualified Offer)'                                                          = \"POWERFLOW_P2\"\n            'Microsoft Power Apps Plan 2 Trial'                                                                      = \"POWERAPPS_VIRAL\"\n            'Microsoft Power Automate Free'                                                                          = \"FLOW_FREE\"\n            'Microsoft Power Automate Plan 2'                                                                        = \"FLOW_P2\"\n            'MICROSOFT POWER BI INFORMATION SERVICES PLAN'                                                           = \"SQL_IS_SSIM\"\n            'Microsoft Power BI Information Services Plan 1'                                                         = \"SQL_IS_SSIM\"\n            'Microsoft Power BI Reporting and Analytics Plan 1'                                                      = \"BI_AZURE_P1\"\n            'MICROSOFT POWER VIDEOS BASIC'                                                                           = \"POWERVIDEOSFREE\"\n            'MICROSOFT POWERAPPS'                                                                                    = \"POWERAPPSFREE\"\n            'Microsoft Records Management'                                                                           = \"RECORDS_MANAGEMENT\"\n            'Microsoft Relationship Sales solution'                                                                  = \"DYN365_ ENTERPRISE _RELATIONSHIP_SALES\"\n            'Microsoft Remote Assist'                                                                                = \"MICROSOFT_REMOTE_ASSIST\"\n            'Microsoft Search'                                                                                       = \"MICROSOFT_SEARCH\"\n            'MICROSOFT SOCIAL ENGAGEMENT - SERVICE DISCONTINUATION'                                                  = \"DYN365_ENTERPRISE_CUSTOMER_SERVICE\"\n            'Microsoft Social Engagement Enterprise'                                                                 = \"NBENTERPRISE\"\n            'MICROSOFT SOCIAL ENGAGEMENT PROFESSIONAL - ELIGIBILITY CRITERIA APPLY'                                  = \"NBPROFESSIONALFORCRM\"\n            'Microsoft StaffHub'                                                                                     = \"Deskless\"\n            'Microsoft Stream'                                                                                       = \"STREAM\"\n            'MICROSOFT STREAM FOR O365 E1 SKU'                                                                       = \"STREAM_O365_E1\"\n            'Microsoft Stream for O365 E3 SKU'                                                                       = \"STREAM_O365_E3\"\n            'MICROSOFT STREAM FOR O365 E5 SKU'                                                                       = \"STREAM_O365_E5\"\n            'Microsoft Stream for O365 for Government (E1)'                                                          = \"STREAM_O365_E1_GOV\"\n            'MICROSOFT STREAM FOR O365 FOR GOVERNMENT (E3)'                                                          = \"STREAM_O365_E3_GOV\"\n            'Microsoft Stream for O365 for Government (F1)'                                                          = \"STREAM_O365_K_GOV\"\n            'Microsoft Stream for O365 K SKU'                                                                        = \"STREAM_O365_K\"\n            'Microsoft Stream for Office 365 E1'                                                                     = \"STREAM_O365_E1\"\n            'Microsoft Stream for Office 365 E3'                                                                     = \"STREAM_O365_E3\"\n            'Microsoft Stream for Office 365 E5'                                                                     = \"STREAM_O365_E5\"\n            'Microsoft Stream for Office 365 F3'                                                                     = \"STREAM_O365_K\"\n            'Microsoft Stream Plan 2'                                                                                = \"STREAM_P2\"\n            'Microsoft Stream Storage Add-On'                                                                        = \"STREAM_STORAGE\"\n            'Microsoft Stream Storage Add-On (500 GB)'                                                               = \"STREAM_STORAGE\"\n            'Microsoft Teams'                                                                                        = \"TEAMS1\"\n            'Microsoft Teams (Free)'                                                                                 = \"TEAMS_FREE\"\n            'Microsoft Teams Audio Conferencing with dial-out to select geographies'                                 = \"MCOMEETBASIC\"\n            'Microsoft Teams Audio Conferencing with dial-out to USA/CAN'                                            = \"Microsoft_Teams_Audio_Conferencing_select_dial_out\"\n            'Microsoft Teams Commercial Cloud'                                                                       = \"TEAMS_COMMERCIAL_TRIAL\"\n            'Microsoft Teams Essentials'                                                                             = \"Teams_Ess\"\n            'Microsoft Teams Essentials (AAD Identity)'                                                              = \"TEAMS_ESSENTIALS_AAD\"\n            'Microsoft Teams Exploratory'                                                                            = \"TEAMS_EXPLORATORY\"\n            'Microsoft Teams for DOD (AR)'                                                                           = \"TEAMS_AR_DOD\"\n            'Microsoft Teams for GCCHigh (AR)'                                                                       = \"TEAMS_AR_GCCHIGH\"\n            'Microsoft Teams for Government'                                                                         = \"TEAMS_GOV\"\n            'Microsoft Teams Phone Resource Account'                                                                 = \"PHONESYSTEM_VIRTUALUSER\"\n            'Microsoft Teams Phone Resource Account for GCC'                                                         = \"PHONESYSTEM_VIRTUALUSER_GOV\"\n            'Microsoft Teams Phone Standard'                                                                         = \"MCOEV\"\n            'Microsoft Teams Phone Standard for DOD'                                                                 = \"MCOEV_DOD\"\n            'Microsoft Teams Phone Standard for Faculty'                                                             = \"MCOEV_FACULTY\"\n            'Microsoft Teams Phone Standard for GCC'                                                                 = \"MCOEV_GOV\"\n            'Microsoft Teams Phone Standard for GCCHIGH'                                                             = \"MCOEV_GCCHIGH\"\n            'Microsoft Teams Phone Standard for Small and Medium Business'                                           = \"MCOEVSMB_1\"\n            'Microsoft Teams Phone Standard for Students'                                                            = \"MCOEV_STUDENT\"\n            'Microsoft Teams Phone Standard for TELSTRA'                                                             = \"MCOEV_TELSTRA\"\n            'Microsoft Teams Phone Standard_USGOV_DOD'                                                               = \"MCOEV_USGOV_DOD\"\n            'Microsoft Teams Phone Standard_USGOV_GCCHIGH'                                                           = \"MCOEV_USGOV_GCCHIGH\"\n            'Microsoft Teams Premium Intelligent'                                                                    = \"TEAMSPRO_MGMT\"\n            'Microsoft Teams Premium Introductory Pricing'                                                           = \"Microsoft_Teams_Premium\"\n            'Microsoft Teams Premium Personalized'                                                                   = \"TEAMSPRO_CUST\"\n            'Microsoft Teams Premium Secure'                                                                         = \"TEAMSPRO_PROTECTION\"\n            'Microsoft Teams Premium Virtual Appointment'                                                            = \"TEAMSPRO_VIRTUALAPPT\"\n            'Microsoft Teams Premium Virtual Appointments'                                                           = \"MCO_VIRTUAL_APPT\"\n            'Microsoft Teams Premium Webinar'                                                                        = \"TEAMSPRO_WEBINAR\"\n            'Microsoft Teams Rooms Basic'                                                                            = \"Microsoft_Teams_Rooms_Basic\"\n            'Microsoft Teams Rooms Basic for EDU'                                                                    = \"Microsoft_Teams_Rooms_Basic_FAC\"\n            'Microsoft Teams Rooms Basic without Audio Conferencing'                                                 = \"Microsoft_Teams_Rooms_Basic_without_Audio_Conferencing\"\n            'Microsoft Teams Rooms Pro'                                                                              = \"Microsoft_Teams_Rooms_Pro\"\n            'Microsoft Teams Rooms Pro for EDU'                                                                      = \"Microsoft_Teams_Rooms_Pro_FAC\"\n            'Microsoft Teams Rooms Pro Management'                                                                   = \"MTRProManagement\"\n            'Microsoft Teams Rooms Pro without Audio Conferencing'                                                   = \"Microsoft_Teams_Rooms_Pro_without_Audio_Conferencing\"\n            'Microsoft Teams Rooms Standard'                                                                         = \"MEETING_ROOM\"\n            'Microsoft Teams Rooms Standard without Audio Conferencing'                                              = \"MEETING_ROOM_NOAUDIOCONF\"\n            'Microsoft Teams Shared Devices'                                                                         = \"MCOCAP\"\n            'Microsoft Teams Shared Devices for GCC'                                                                 = \"MCOCAP_GOV\"\n            'Microsoft Teams Trial'                                                                                  = \"MS_TEAMS_IW\"\n            'Microsoft Threat Experts - Experts on Demand'                                                           = \"EXPERTS_ON_DEMAND\"\n            'Microsoft Tunnel for Mobile Application Management'                                                     = \"Intune-MAMTunnel\"\n            'Microsoft Viva Goals'                                                                                   = \"Microsoft_Viva_Goals\"\n            'Microsoft Viva Insights'                                                                                = \"WORKPLACE_ANALYTICS_INSIGHTS_USER\"\n            'Microsoft Viva Insights Backend'                                                                        = \"WORKPLACE_ANALYTICS_INSIGHTS_BACKEND\"\n            'Microsoft Viva Sales Premium & Trial'                                                                   = \"Microsoft_Viva_Sales_PremiumTrial\"\n            'Microsoft Viva Sales Premium with Power Automate'                                                       = \"Microsoft_Viva_Sales_PowerAutomate\"\n            'Microsoft Viva Suite'                                                                                   = \"VIVA\"\n            'Microsoft Viva Topics'                                                                                  = \"CORTEX\"\n            'Microsoft Workplace Analytics'                                                                          = \"WORKPLACE_ANALYTICS\"\n            'Microsoft Workplace Analytics Insights Backend'                                                         = \"WORKPLACE_ANALYTICS_INSIGHTS_BACKEND\"\n            'Microsoft Workplace Analytics Insights User'                                                            = \"WORKPLACE_ANALYTICS_INSIGHTS_USER\"\n            'MICROSOFT_COMMUNICATION_COMPLIANCE'                                                                     = \"MICROSOFT_COMMUNICATION_COMPLIANCE\"\n            'MICROSOFT_SEARCH'                                                                                       = \"MICROSOFT_SEARCH\"\n            'MICROSOFTBOOKINGS'                                                                                      = \"MICROSOFTBOOKINGS\"\n            'Minecraft Education'                                                                                    = \"MINECRAFT_EDUCATION_EDITION\"\n            'Minecraft Education Edition'                                                                            = \"MINECRAFT_EDUCATION_EDITION\"\n            'Minecraft Education Faculty'                                                                            = \"MEE_FACULTY\"\n            'Minecraft Education Student'                                                                            = \"MEE_STUDENT\"\n            'MIP_S_CLP1'                                                                                             = \"MIP_S_CLP1\"\n            'MIP_S_CLP2'                                                                                             = \"MIP_S_CLP2\"\n            'Mobile Device Management for Office 365'                                                                = \"INTUNE_O365\"\n            'MS IMAGINE ACADEMY'                                                                                     = \"IT_ACADEMY_AD\"\n            'MTP'                                                                                                    = \"MTP\"\n            'Multi-Geo Capabilities in Office 365'                                                                   = \"OFFICE365_MULTIGEO\"\n            'Nonprofit Portal'                                                                                       = \"NONPROFIT_PORTAL\"\n            'Nucleus'                                                                                                = \"Nucleus\"\n            'Office 365 A1 for faculty'                                                                              = \"STANDARDWOFFPACK_FACULTY\"\n            'Office 365 A1 for students'                                                                             = \"STANDARDWOFFPACK_STUDENT\"\n            'Office 365 A1 Plus for faculty'                                                                         = \"STANDARDWOFFPACK_IW_FACULTY\"\n            'Office 365 A1 Plus for students'                                                                        = \"STANDARDWOFFPACK_IW_STUDENT\"\n            'Office 365 A3 for faculty'                                                                              = \"ENTERPRISEPACKPLUS_FACULTY\"\n            'Office 365 A3 for students'                                                                             = \"ENTERPRISEPACKPLUS_STUDENT\"\n            'Office 365 A5 for faculty'                                                                              = \"ENTERPRISEPREMIUM_FACULTY\"\n            'Office 365 A5 for students'                                                                             = \"ENTERPRISEPREMIUM_STUDENT\"\n            'Office 365 Advanced Compliance'                                                                         = \"EQUIVIO_ANALYTICS\"\n            'Office 365 Advanced Compliance for GCC'                                                                 = \"EQUIVIO_ANALYTICS_GOV\"\n            'Office 365 Advanced eDiscovery'                                                                         = \"EQUIVIO_ANALYTICS\"\n            'Office 365 Advanced eDiscovery for Government'                                                          = \"EQUIVIO_ANALYTICS_GOV\"\n            'Office 365 Advanced Security Management'                                                                = \"ADALLOM_S_O365\"\n            'OFFICE 365 BUSINESS'                                                                                    = \"OFFICE_BUSINESS\"\n            'Office 365 Cloud App Security'                                                                          = \"ADALLOM_O365\"\n            'Office 365 E1'                                                                                          = \"STANDARDPACK\"\n            'Office 365 E2'                                                                                          = \"STANDARDWOFFPACK\"\n            'Office 365 E3'                                                                                          = \"ENTERPRISEPACK\"\n            'Office 365 E3 Developer'                                                                                = \"DEVELOPERPACK\"\n            'Office 365 E3_USGOV_DOD'                                                                                = \"ENTERPRISEPACK_USGOV_DOD\"\n            'Office 365 E3_USGOV_GCCHIGH'                                                                            = \"ENTERPRISEPACK_USGOV_GCCHIGH\"\n            'Office 365 E4'                                                                                          = \"ENTERPRISEWITHSCAL\"\n            'Office 365 E5'                                                                                          = \"ENTERPRISEPREMIUM\"\n            'Office 365 E5 Without Audio Conferencing'                                                               = \"ENTERPRISEPREMIUM_NOPSTNCONF\"\n            'Office 365 Extra File Storage'                                                                          = \"SHAREPOINTSTORAGE\"\n            'Office 365 Extra File Storage for GCC'                                                                  = \"SHAREPOINTSTORAGE_GOV\"\n            'Office 365 F3'                                                                                          = \"DESKLESSPACK\"\n            'Office 365 G1 GCC'                                                                                      = \"STANDARDPACK_GOV\"\n            'Office 365 G3 GCC'                                                                                      = \"ENTERPRISEPACK_GOV\"\n            'Office 365 G5 GCC'                                                                                      = \"ENTERPRISEPREMIUM_GOV\"\n            'Office 365 Midsize Business'                                                                            = \"MIDSIZEPACK\"\n            'Office 365 Planner for Government'                                                                      = \"PROJECTWORKMANAGEMENT_GOV\"\n            'Office 365 Privileged Access Management'                                                                = \"PAM_ENTERPRISE\"\n            'Office 365 ProPlus'                                                                                     = \"OFFICESUBSCRIPTION\"\n            'Office 365 SafeDocs'                                                                                    = \"SAFEDOCS\"\n            'Office 365 Small Business'                                                                              = \"LITEPACK\"\n            'Office 365 Small Business Premium'                                                                      = \"LITEPACK_P2\"\n            'OFFICE 365 SMALL BUSINESS SUBSCRIPTION'                                                                 = \"OFFICE_PRO_PLUS_SUBSCRIPTION_SMBIZ\"\n            'Office for the web'                                                                                     = \"SHAREPOINTWAC\"\n            'Office for the web (Education)'                                                                         = \"SHAREPOINTWAC_EDU\"\n            'OFFICE FOR THE WEB (GOVERNMENT)'                                                                        = \"SHAREPOINTWAC_GOV\"\n            'Office for the Web for Education'                                                                       = \"SHAREPOINTWAC_EDU\"\n            'Office for the Web for Government'                                                                      = \"SHAREPOINTWAC_GOV\"\n            'Office Mobile Apps for Office 365'                                                                      = \"OFFICEMOBILE_SUBSCRIPTION\"\n            'Office Mobile Apps for Office 365 for GCC'                                                              = \"OFFICEMOBILE_SUBSCRIPTION_GOV\"\n            'OFFICE ONLINE'                                                                                          = \"SHAREPOINTWAC\"\n            'OFFICE ONLINE FOR DEVELOPER'                                                                            = \"SHAREPOINTWAC_DEVELOPER\"\n            'Office Shared Computer Activation'                                                                      = \"OFFICE_SHARED_COMPUTER_ACTIVATION\"\n            'OFFICEMOBILE_SUBSCRIPTION'                                                                              = \"OFFICEMOBILE_SUBSCRIPTION\"\n            'OFFICESUBSCRIPTION'                                                                                     = \"OFFICESUBSCRIPTION\"\n            'OFFICESUBSCRIPTION_GOV'                                                                                 = \"OFFICESUBSCRIPTION_GOV\"\n            'OneDrive for Business (Basic 2)'                                                                        = \"ONEDRIVE_BASIC_P2\"\n            'OneDrive for Business (Basic)'                                                                          = \"ONEDRIVE_BASIC\"\n            'OneDrive for Business (Plan 1)'                                                                         = \"WACONEDRIVESTANDARD\"\n            'OneDrive for Business (Plan 2)'                                                                         = \"WACONEDRIVEENTERPRISE\"\n            'OneDrive for business Basic'                                                                            = \"ONEDRIVE_BASIC\"\n            'ONEDRIVE FOR BUSINESS BASIC FOR GOVERNMENT'                                                             = \"ONEDRIVE_BASIC_GOV\"\n            'ONEDRIVEENTERPRISE'                                                                                     = \"ONEDRIVEENTERPRISE\"\n            'ONEDRIVESTANDARD'                                                                                       = \"ONEDRIVESTANDARD\"\n            'OUTLOOK CUSTOMER MANAGER'                                                                               = \"O365_SB_Relationship_Management\"\n            'PAD for Windows'                                                                                        = \"POWERAUTOMATE_DESKTOP_FOR_WIN\"\n            'Power Apps (Plan 2)'                                                                                    = \"POWERAPPS_P2\"\n            'Power Apps and Logic Flows'                                                                             = \"POWERAPPS_INDIVIDUAL_USER\"\n            'Power Apps for Customer Service Pro'                                                                    = \"POWERAPPS_CUSTOMER_SERVICE_PRO\"\n            'Power Apps for Dynamics 365'                                                                            = \"POWERAPPS_DYN_TEAM\"\n            'Power Apps for Dynamics 365 vTrial'                                                                     = \"POWER_APPS_DYN365_VIRAL_TRIAL\"\n            'Power Apps for Guides'                                                                                  = \"POWERAPPS_GUIDES\"\n            'Power Apps for Office 365'                                                                              = \"POWERAPPS_O365_P2\"\n            'Power Apps for Office 365 (Plan 3)'                                                                     = \"POWERAPPS_O365_P3\"\n            'Power Apps for Office 365 F3'                                                                           = \"POWERAPPS_O365_S1\"\n            'Power Apps for Office 365 F3 for Government'                                                            = \"POWERAPPS_O365_S1_GOV\"\n            'Power Apps for Office 365 for Government'                                                               = \"POWERAPPS_O365_P3_GOV\"\n            'Power Apps for Sales Pro'                                                                               = \"POWERAPPS_SALES_PRO\"\n            'Power Apps per app'                                                                                     = \"POWERAPPS_PER_APP_NEW\"\n            'Power Apps per app plan'                                                                                = \"POWERAPPS_PER_APP\"\n            'Power Apps per app plan (1 app or portal)'                                                              = \"POWERAPPS_PER_APP_NEW\"\n            'Power Apps per user plan'                                                                               = \"POWERAPPS_PER_USER\"\n            'Power Apps per user plan for Government'                                                                = \"POWERAPPS_PER_USER_GCC\"\n            'Power Apps Portals Login Capacity Add-On'                                                               = \"POWERAPPS_PORTALS_LOGIN\"\n            'Power Apps Portals Login Capacity Add-On for Government'                                                = \"POWERAPPS_PORTALS_LOGIN_GCC\"\n            'Power Apps Portals login capacity add-on Tier 2 (10 unit min)'                                          = \"POWERAPPS_PORTALS_LOGIN_T2\"\n            'Power Apps Portals login capacity add-on Tier 2 (10 unit min) for Government'                           = \"POWERAPPS_PORTALS_LOGIN_T2_GCC\"\n            'Power Apps Portals login capacity add-on Tier 3 (50 unit min)'                                          = \"POWERAPPS_PORTALS_LOGIN_T3\"\n            'Power Apps Portals page view capacity add-on'                                                           = \"POWERAPPS_PORTALS_PAGEVIEW\"\n            'Power Apps Portals page view capacity add-on for Government'                                            = \"POWERAPPS_PORTALS_PAGEVIEW_GCC\"\n            'Power Automate (Plan 1) for Government'                                                                 = \"FLOW_P1_GOV\"\n            'Power Automate (Plan 2)'                                                                                = \"FLOW_P2\"\n            'Power Automate for Customer Service Pro'                                                                = \"FLOW_CUSTOMER_SERVICE_PRO\"\n            'Power Automate for Dynamics 365'                                                                        = \"FLOW_DYN_TEAM\"\n            'Power Automate for Dynamics 365 Customer Voice'                                                         = \"FLOW_FORMS_PRO\"\n            'Power Automate for Dynamics 365 vTrial'                                                                 = \"POWER_AUTOMATE_DYN365_VIRAL_TRIAL\"\n            'Power Automate for Office 365'                                                                          = \"FLOW_O365_P2\"\n            'Power Automate for Office 365 F3'                                                                       = \"FLOW_O365_S1\"\n            'Power Automate for Office 365 F3 for Government'                                                        = \"FLOW_O365_S1_GOV\"\n            'Power Automate for Office 365 for Government'                                                           = \"FLOW_O365_P3_GOV\"\n            'Power Automate for Power Apps per App Plan'                                                             = \"Flow_Per_APP\"\n            'Power Automate for Power Apps per User Plan'                                                            = \"Flow_PowerApps_PerUser\"\n            'Power Automate for Power Apps per User Plan for GCC'                                                    = \"Flow_PowerApps_PerUser_GCC\"\n            'Power Automate for Project'                                                                             = \"FLOW_FOR_PROJECT\"\n            'POWER AUTOMATE FOR PROJECT P1'                                                                          = \"Power_Automate_For_Project_P1\"\n            'Power Automate for Virtual Agent'                                                                       = \"FLOW_VIRTUAL_AGENT_BASE\"\n            'Power Automate per flow plan'                                                                           = \"FLOW_BUSINESS_PROCESS\"\n            'Power Automate per user plan'                                                                           = \"FLOW_PER_USER\"\n            'Power Automate per user plan dept'                                                                      = \"FLOW_PER_USER_DEPT\"\n            'Power Automate per user plan for Government'                                                            = \"FLOW_PER_USER_GCC\"\n            'Power Automate per user with attended RPA plan'                                                         = \"POWERAUTOMATE_ATTENDED_RPA\"\n            'Power Automate RPA Attended'                                                                            = \"POWER_AUTOMATE_ATTENDED_RPA\"\n            'Power Automate unattended RPA add-on'                                                                   = \"POWERAUTOMATE_UNATTENDED_RPA\"\n            'Power BI'                                                                                               = \"POWER_BI_INDIVIDUAL_USER\"\n            'Power BI (free)'                                                                                        = \"POWER_BI_STANDARD\"\n            'Power BI for Office 365 Add-On'                                                                         = \"POWER_BI_ADDON\"\n            'Power BI Premium P'                                                                                     = \"PBI_PREMIUM_P1_ADDON\"\n            'Power BI Premium P1'                                                                                    = \"PBI_PREMIUM_P1_ADDON\"\n            'Power BI Premium Per User'                                                                              = \"PBI_PREMIUM_PER_USER\"\n            'Power BI Premium Per User Add-On'                                                                       = \"PBI_PREMIUM_PER_USER_ADDON\"\n            'Power BI Premium Per User Dept'                                                                         = \"PBI_PREMIUM_PER_USER_DEPT\"\n            'Power BI Premium Per User for Faculty'                                                                  = \"PBI_PREMIUM_PER_USER_FACULTY\"\n            'Power BI Pro'                                                                                           = \"POWER_BI_PRO\"\n            'Power BI Pro CE'                                                                                        = \"POWER_BI_PRO_CE\"\n            'Power BI Pro Dept'                                                                                      = \"POWER_BI_PRO_DEPT\"\n            'Power BI Pro for Faculty'                                                                               = \"POWER_BI_PRO_FACULTY\"\n            'Power BI Pro for GCC'                                                                                   = \"POWERBI_PRO_GOV\"\n            'Power BI Pro for Government'                                                                            = \"BI_AZURE_P_2_GOV\"\n            'Power Pages Internal User'                                                                              = \"Power_Pages_Internal_User\"\n            'Power Pages vTrial for Makers'                                                                          = \"Power_Pages_vTrial_for_Makers\"\n            'Power Virtual Agent'                                                                                    = \"VIRTUAL_AGENT_BASE\"\n            'Power Virtual Agent User License'                                                                       = \"VIRTUAL_AGENT_USL\"\n            'Power Virtual Agents for Chat'                                                                          = \"POWER_VIRTUAL_AGENTS_D365_CS_CHAT\"\n            'Power Virtual Agents for Customer Service Voice'                                                        = \"POWER_VIRTUAL_AGENTS_D365_CS_VOICE\"\n            'Power Virtual Agents for Digital Messaging'                                                             = \"POWER_VIRTUAL_AGENTS_D365_CS_MESSAGING\"\n            'Power Virtual Agents for Office 365'                                                                    = \"POWER_VIRTUAL_AGENTS_O365_P2\"\n            'Power Virtual Agents for Office 365 F1'                                                                 = \"POWER_VIRTUAL_AGENTS_O365_F1\"\n            'POWER VIRTUAL AGENTS FOR OFFICE 365 P1'                                                                 = \"POWER_VIRTUAL_AGENTS_O365_P1\"\n            'Power Virtual Agents for Office 365 P2'                                                                 = \"POWER_VIRTUAL_AGENTS_O365_P2\"\n            'Power Virtual Agents for Office 365 P3'                                                                 = \"POWER_VIRTUAL_AGENTS_O365_P3\"\n            'Power Virtual Agents Viral Trial'                                                                       = \"CCIBOTS_PRIVPREV_VIRAL\"\n            'PowerApps for Developer'                                                                                = \"POWERAPPS_DEV_VIRAL\"\n            'PowerApps for Dynamics 365'                                                                             = \"POWERAPPS_DYN_APPS\"\n            'POWERAPPS FOR OFFICE 36'                                                                                = \"POWERAPPS_O365_P2\"\n            'POWERAPPS FOR OFFICE 365'                                                                               = \"POWERAPPS_O365_P1\"\n            'PowerApps for Office 365 Plan 3'                                                                        = \"POWERAPPS_O365_P3\"\n            'PowerApps per app baseline access'                                                                      = \"POWERAPPS_PER_APP_IW\"\n            'PowerApps Plan 1 for Government'                                                                        = \"POWERAPPS_P1_GOV\"\n            'PowerApps Trial'                                                                                        = \"POWERAPPS_P2_VIRAL\"\n            'POWERAPPS_O365_P3_GOV'                                                                                  = \"POWERAPPS_O365_P3_GOV\"\n            'Premium Encryption in Office 365'                                                                       = \"PREMIUM_ENCRYPTION\"\n            'PREMIUM_ENCRYPTION'                                                                                     = \"PREMIUM_ENCRYPTION\"\n            'Priva - Risk'                                                                                           = \"PRIVACY_MANGEMENT_RISK\"\n            'Priva - Risk (Exchange)'                                                                                = \"PRIVACY_MANGEMENT_RISK_EXCHANGE\"\n            'Privacy Management � risk'                                                                              = \"PRIVACY_MANAGEMENT_RISK\"\n            'Privacy Management - risk for EDU'                                                                      = \"PRIVACY_MANAGEMENT_RISK_EDU\"\n            'Privacy Management - risk GCC'                                                                          = \"PRIVACY_MANAGEMENT_RISK_GCC\"\n            'Privacy Management - risk_USGOV_DOD'                                                                    = \"PRIVACY_MANAGEMENT_RISK_USGOV_DOD\"\n            'Privacy Management - risk_USGOV_GCCHIGH'                                                                = \"PRIVACY_MANAGEMENT_RISK_USGOV_GCCHIGH\"\n            'Privacy Management - Subject Rights Request'                                                            = \"PRIVACY_MANGEMENT_DSR\"\n            'Privacy Management - Subject Rights Request (1 - Exchange)'                                             = \"PRIVACY_MANGEMENT_DSR_1\"\n            'Privacy Management - subject rights request (1)'                                                        = \"PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_1_V2\"\n            'Privacy Management - subject rights request (1) for EDU'                                                = \"PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_1_EDU_V2\"\n            'Privacy Management - subject rights request (1) GCC'                                                    = \"PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_1_V2_GCC\"\n            'Privacy Management - subject rights request (1) USGOV_DOD'                                              = \"PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_1_V2_USGOV_DOD\"\n            'Privacy Management - subject rights request (1) USGOV_GCCHIGH'                                          = \"PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_1_V2_USGOV_GCCHIGH\"\n            'Privacy Management - Subject Rights Request (10 - Exchange)'                                            = \"PRIVACY_MANGEMENT_DSR_EXCHANGE_10\"\n            'Privacy Management - subject rights request (10)'                                                       = \"PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_10_V2\"\n            'Privacy Management - subject rights request (10) for EDU'                                               = \"PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_10_EDU_V2\"\n            'Privacy Management - subject rights request (10) GCC'                                                   = \"PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_10_V2_GCC\"\n            'Privacy Management - subject rights request (10) USGOV_DOD'                                             = \"PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_10_V2_USGOV_DOD\"\n            'Privacy Management - subject rights request (10) USGOV_GCCHIGH'                                         = \"PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_10_V2_USGOV_GCCHIGH\"\n            'Privacy Management - Subject Rights Request (100 - Exchange)'                                           = \"PRIVACY_MANGEMENT_DSR_EXCHANGE_100\"\n            'Privacy Management - subject rights request (100)'                                                      = \"PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_100_V2\"\n            'Privacy Management - subject rights request (100) for EDU'                                              = \"PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_100_EDU_V2\"\n            'Privacy Management - subject rights request (100) GCC'                                                  = \"PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_100_V2_GCC\"\n            'Privacy Management - subject rights request (100) USGOV_DOD'                                            = \"PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_100_V2_USGOV_DOD\"\n            'Privacy Management - subject rights request (100) USGOV_GCCHIGH'                                        = \"PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_100_V2_USGOV_GCCHIGH\"\n            'Privacy Management - subject rights request (50)'                                                       = \"PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_50_V2\"\n            'Privacy Management - subject rights request (50) for EDU'                                               = \"PRIVACY_MANAGEMENT_SUB_RIGHTS_REQ_50_EDU_V2\"\n            'Privacy Management - Subject Rights Request (Exchange)'                                                 = \"PRIVACY_MANGEMENT_DSR_EXCHANGE\"\n            'Project for Office (Plan E1)'                                                                           = \"PROJECT_O365_P1\"\n            'Project for Office (Plan E3)'                                                                           = \"PROJECT_O365_P2\"\n            'Project for Office (Plan E5)'                                                                           = \"PROJECT_O365_P3\"\n            'Project for Office (Plan F)'                                                                            = \"PROJECT_O365_F3\"\n            'Project for Office 365'                                                                                 = \"PROJECTCLIENT\"\n            'Project for Project Operations'                                                                         = \"PROJECT_FOR_PROJECT_OPERATIONS\"\n            'Project Online Desktop Client'                                                                          = \"PROJECT_CLIENT_SUBSCRIPTION\"\n            'Project Online Desktop Client for Government'                                                           = \"PROJECT_CLIENT_SUBSCRIPTION_GOV\"\n            'Project Online Essentials'                                                                              = \"PROJECTESSENTIALS\"\n            'Project Online Essentials for Faculty'                                                                  = \"PROJECTESSENTIALS_FACULTY\"\n            'Project Online Essentials for GCC'                                                                      = \"PROJECTESSENTIALS_GOV\"\n            'Project Online Essentials for Government'                                                               = \"PROJECT_ESSENTIALS_GOV\"\n            'Project Online Premium'                                                                                 = \"PROJECTPREMIUM\"\n            'Project Online Premium Without Project Client'                                                          = \"PROJECTONLINE_PLAN_1\"\n            'Project Online Service'                                                                                 = \"SHAREPOINT_PROJECT\"\n            'Project Online Service for Education'                                                                   = \"SHAREPOINT_PROJECT_EDU\"\n            'Project Online Service for Government'                                                                  = \"SHAREPOINT_PROJECT_GOV\"\n            'Project Online With Project for Office 365'                                                             = \"PROJECTONLINE_PLAN_2\"\n            'PROJECT P1'                                                                                             = \"PROJECT_P1\"\n            'Project P3'                                                                                             = \"PROJECT_PROFESSIONAL\"\n            'Project P3 for Faculty'                                                                                 = \"PROJECT_PROFESSIONAL_FACULTY\"\n            'Project Plan 1'                                                                                         = \"PROJECT_P1\"\n            'Project Plan 1 (for Department)'                                                                        = \"PROJECT_PLAN1_DEPT\"\n            'Project Plan 3'                                                                                         = \"PROJECTPROFESSIONAL\"\n            'Project Plan 3 (for Department)'                                                                        = \"PROJECT_PLAN3_DEPT\"\n            'Project Plan 3 for Faculty'                                                                             = \"PROJECTPROFESSIONAL_FACULTY\"\n            'Project Plan 3 for GCC'                                                                                 = \"PROJECTPROFESSIONAL_GOV\"\n            'Project Plan 5 for GCC'                                                                                 = \"PROJECTPREMIUM_GOV\"\n            'Project Plan 5 without Project Client for Faculty'                                                      = \"PROJECTONLINE_PLAN_1_FACULTY\"\n            'PROJECTWORKMANAGEMENT'                                                                                  = \"PROJECTWORKMANAGEMENT\"\n            'PROJECTWORKMANAGEMENT_GOV'                                                                              = \"PROJECTWORKMANAGEMENT_GOV\"\n            'RECORDS_MANAGEMENT'                                                                                     = \"RECORDS_MANAGEMENT\"\n            'Remote help'                                                                                            = \"REMOTE_HELP\"\n            'RETIRED - Field Service � Automated Routing Engine Add-On'                                              = \"CRM_AUTO_ROUTING_ADDON\"\n            'RETIRED - Microsoft Communications Compliance'                                                          = \"COMMUNICATIONS_COMPLIANCE\"\n            'RETIRED - Microsoft Insider Risk Management'                                                            = \"INSIDER_RISK_MANAGEMENT\"\n            'Retired - Microsoft Social Engagement'                                                                  = \"NBENTERPRISE\"\n            'RETIRED - Outlook Customer Manager'                                                                     = \"O365_SB_Relationship_Management\"\n            'Rights Management Adhoc'                                                                                = \"RIGHTSMANAGEMENT_ADHOC\"\n            'Rights Management Service Basic Content Protection'                                                     = \"RMSBASIC\"\n            'RMS_S_ENTERPRISE'                                                                                       = \"RMS_S_ENTERPRISE\"\n            'RMS_S_ENTERPRISE_GOV'                                                                                   = \"RMS_S_ENTERPRISE_GOV\"\n            'RMS_S_PREMIUM'                                                                                          = \"RMS_S_PREMIUM\"\n            'School Data Sync (Plan 1)'                                                                              = \"SCHOOL_DATA_SYNC_P1\"\n            'School Data Sync (Plan 2)'                                                                              = \"SCHOOL_DATA_SYNC_P2\"\n            'SecOps Investigation for MDI'                                                                           = \"ADALLOM_FOR_AATP\"\n            'Sensor Data Intelligence Additional Machines Add-in for Dynamics 365 Supply Chain Management'           = \"DYN365_IOT_INTELLIGENCE_ADDL_MACHINES\"\n            'Sensor Data Intelligence Scenario Add-in for Dynamics 365 Supply Chain Management'                      = \"DYN365_IOT_INTELLIGENCE_SCENARIO\"\n            'SHAREPOINT'                                                                                             = \"SHAREPOINTSTANDARD\"\n            'SharePoint (Plan 1)'                                                                                    = \"SHAREPOINTSTANDARD\"\n            'SharePoint (Plan 1) for Education'                                                                      = \"SHAREPOINTSTANDARD_EDU\"\n            'SharePoint (Plan 2)'                                                                                    = \"SHAREPOINTENTERPRISE\"\n            'SharePoint (Plan 2) for Education'                                                                      = \"SHAREPOINTENTERPRISE_EDU\"\n            'SharePoint (Plan 2)Dynamics 365 for Sales Pro Attach'                                                   = \"SHAREPOINTENTERPRISE\"\n            'SHAREPOINT FOR DEVELOPER'                                                                               = \"SHAREPOINT_S_DEVELOPER\"\n            'SharePoint Kiosk'                                                                                       = \"SHAREPOINTDESKLESS\"\n            'SharePoint KioskG'                                                                                      = \"SHAREPOINTDESKLESS_GOV\"\n            'SharePoint Multi-Geo'                                                                                   = \"SHAREPOINTONLINE_MULTIGEO\"\n            'SharePoint Online (Plan 1)'                                                                             = \"SHAREPOINTSTANDARD\"\n            'SharePoint Online (Plan 2)'                                                                             = \"SHAREPOINTENTERPRISE\"\n            'SharePoint Online Kiosk'                                                                                = \"SHAREPOINTDESKLESS\"\n            'SHAREPOINT PLAN 1'                                                                                      = \"SHAREPOINTENTERPRISE_MIDMARKET\"\n            'SharePoint Plan 1G'                                                                                     = \"SharePoint Plan 1G\"\n            'SharePoint Plan 2 for EDU'                                                                              = \"SHAREPOINTENTERPRISE_EDU\"\n            'SharePoint Plan 2G'                                                                                     = \"SHAREPOINTENTERPRISE_GOV\"\n            'SHAREPOINT STANDARD'                                                                                    = \"SHAREPOINTSTANDARD\"\n            'SharePoint Syntex'                                                                                      = \"Intelligent_Content_Services\"\n            'SharePoint Syntex - SPO type'                                                                           = \"Intelligent_Content_Services_SPO_type\"\n            'SHAREPOINT_PROJECT'                                                                                     = \"SHAREPOINT_PROJECT\"\n            'SHAREPOINTDESKLESS'                                                                                     = \"SHAREPOINTDESKLESS\"\n            'SHAREPOINTENTERPRISE_GOV'                                                                               = \"SHAREPOINTENTERPRISE_GOV\"\n            'SHAREPOINTLITE'                                                                                         = \"SHAREPOINTLITE\"\n            'SHAREPOINTSTANDARD'                                                                                     = \"SHAREPOINTSTANDARD\"\n            'SHAREPOINTSTORAGE_GOV'                                                                                  = \"SHAREPOINTSTORAGE_GOV\"\n            'SHAREPOINTWAC_GOV'                                                                                      = \"SHAREPOINTWAC_GOV\"\n            'SKYPE FOR BUSINESS CLOUD PBX FOR SMALL AND MEDIUM BUSINESS'                                             = \"MCOEVSMB\"\n            'Skype for Business Online (Plan 1)'                                                                     = \"MCOIMP\"\n            'Skype for Business Online (Plan 1) for Government'                                                      = \"MCOIMP_GOV\"\n            'Skype for Business Online (Plan 2)'                                                                     = \"MCOSTANDARD\"\n            'Skype for Business Online (Plan 2) for Government'                                                      = \"MCOSTANDARD_GOV\"\n            'SKYPE FOR BUSINESS ONLINE (PLAN 2) FOR MIDSIZ'                                                          = \"MCOSTANDARD_MIDMARKET\"\n            'SKYPE FOR BUSINESS ONLINE (PLAN 3)'                                                                     = \"MCOVOICECONF\"\n            'SKYPE FOR BUSINESS ONLINE (PLAN P1)'                                                                    = \"MCOLITE\"\n            'Skype for Business PSTN Domestic and International Calling'                                             = \"MCOPSTN2\"\n            'Skype for Business PSTN Domestic Calling'                                                               = \"MCOPSTN1\"\n            'Skype for Business PSTN Domestic Calling (120 Minutes)'                                                 = \"MCOPSTN5\"\n            'Skype for Business PSTN Usage Calling Plan'                                                             = \"MCOPSTNPP\"\n            'Stream for Office 365'                                                                                  = \"STREAM_O365_SMB\"\n            'Stream for Office 365 for Government (E5)'                                                              = \"STREAM_O365_E5_GOV\"\n            'STREAM_O365_E5_GOV'                                                                                     = \"STREAM_O365_E5_GOV\"\n            'STREAM_O365_K'                                                                                          = \"STREAM_O365_K\"\n            'Sway'                                                                                                   = \"SWAY\"\n            'TEAMS FREE SERVICE'                                                                                     = \"TEAMS_FREE_SERVICE\"\n            'Teams Multi-Geo'                                                                                        = \"TEAMSMULTIGEO\"\n            'Teams Phone with Calling Plan'                                                                          = \"MCOTEAMS_ESSENTIALS\"\n            'Teams Room Basic'                                                                                       = \"Teams_Room_Basic\"\n            'Teams Room Pro'                                                                                         = \"Teams_Room_Pro\"\n            'Teams Room Standard'                                                                                    = \"Teams_Room_Standard\"\n            'Teams Rooms Premium'                                                                                    = \"MTR_PREM\"\n            'Teams Rooms Test 1'                                                                                     = \"Teams_Room_Basic\"\n            'Teams Rooms Test 2'                                                                                     = \"Teams_Room_Pro\"\n            'TEAMS_GOV'                                                                                              = \"TEAMS_GOV\"\n            'TEAMS1'                                                                                                 = \"TEAMS1\"\n            'TELSTRA Calling for O365'                                                                               = \"MCOPSTNEAU2\"\n            'THREAT_INTELLIGENCE_GOV'                                                                                = \"THREAT_INTELLIGENCE_GOV\"\n            'To-Do (Firstline)'                                                                                      = \"BPOS_S_TODO_FIRSTLINE\"\n            'To-Do (Plan 1)'                                                                                         = \"BPOS_S_TODO_1\"\n            'To-Do (Plan 2)'                                                                                         = \"BPOS_S_TODO_2\"\n            'To-Do (Plan 3)'                                                                                         = \"BPOS_S_TODO_3\"\n            'Universal Print'                                                                                        = \"UNIVERSAL_PRINT\"\n            'Universal Print Without Seeding'                                                                        = \"UNIVERSAL_PRINT_NO_SEEDING\"\n            'Virtual Agent'                                                                                          = \"VIRTUAL_AGENT_USL\"\n            'Virtual Agent Base'                                                                                     = \"VIRTUAL_AGENT_BASE\"\n            'Visio Desktop App'                                                                                      = \"VISIO_CLIENT_SUBSCRIPTION\"\n            'VISIO DESKTOP APP FOR Government'                                                                       = \"VISIO_CLIENT_SUBSCRIPTION_GOV\"\n            'Visio Online Plan 1'                                                                                    = \"VISIOONLINE_PLAN1\"\n            'Visio Online Plan 2'                                                                                    = \"VISIOCLIENT\"\n            'Visio Plan 1'                                                                                           = \"VISIO_PLAN1_DEPT\"\n            'Visio Plan 2'                                                                                           = \"VISIO_PLAN2_DEPT\"\n            'Visio Plan 2 for Faculty'                                                                               = \"VISIOCLIENT_FACULTY\"\n            'Visio Plan 2 for GCC'                                                                                   = \"VISIOCLIENT_GOV\"\n            'Visio web app'                                                                                          = \"VISIOONLINE\"\n            'VISIO WEB APP FOR GOVERNMENT'                                                                           = \"VISIOONLINE_GOV\"\n            'Viva Engage Communities and Communications'                                                             = \"VIVAENGAGE_COMMUNITIES_AND_COMMUNICATIONS\"\n            'Viva Engage Core'                                                                                       = \"VIVAENGAGE_CORE\"\n            'Viva Engage Knowledge'                                                                                  = \"VIVAENGAGE_KNOWLEDGE\"\n            'Viva Goals'                                                                                             = \"Viva_Goals_Premium\"\n            'Viva Learning'                                                                                          = \"VIVA_LEARNING_PREMIUM\"\n            'Viva Learning Seeded'                                                                                   = \"VIVA_LEARNING_SEEDED\"\n            'Viva Topics'                                                                                            = \"TOPIC_EXPERIENCES\"\n            'Whiteboard (Firstline)'                                                                                 = \"WHITEBOARD_FIRSTLINE1\"\n            'Whiteboard (Plan 1)'                                                                                    = \"WHITEBOARD_PLAN1\"\n            'Whiteboard (Plan 2)'                                                                                    = \"WHITEBOARD_PLAN2\"\n            'Whiteboard (Plan 3)'                                                                                    = \"WHITEBOARD_PLAN3\"\n            'WINDOWS 10 ENTERPRISE'                                                                                  = \"WIN10_PRO_ENT_SUB\"\n            'Windows 10 Enterprise (New)'                                                                            = \"Virtualization \tRights \tfor \tWindows \t10 \t(E3/E5+VDA)\"\n            'Windows 10 Enterprise E3 (Local Only)'                                                                  = \"WIN10_ENT_LOC_F1\"\n            'Windows 10/11 Business'                                                                                 = \"WINBIZ\"\n            'Windows 10/11 Enterprise'                                                                               = \"Virtualization Rights for Windows 10 (E3/E5+VDA)\"\n            'Windows 10/11 Enterprise (Original)'                                                                    = \"WIN10_PRO_ENT_SUB\"\n            'Windows 10/11 Enterprise A3 for faculty'                                                                = \"WIN10_ENT_A3_FAC\"\n            'Windows 10/11 Enterprise A3 for students'                                                               = \"WIN10_ENT_A3_STU\"\n            'Windows 10/11 Enterprise A5 for faculty'                                                                = \"WIN10_ENT_A5_FAC\"\n            'Windows 10/11 Enterprise E3'                                                                            = \"WIN10_VDA_E3\"\n            'Windows 10/11 Enterprise E3 VDA'                                                                        = \"E3_VDA_only\"\n            'Windows 10/11 Enterprise E5'                                                                            = \"WIN10_VDA_E5\"\n            'Windows 10/11 Enterprise E5 (Original)'                                                                 = \"WIN_ENT_E5\"\n            'Windows 10/11 Enterprise E5 Commercial (GCC Compatible)'                                                = \"WINE5_GCC_COMPAT\"\n            'Windows 365 Business 1 vCPU 2 GB 64 GB'                                                                 = \"CPC_B_1C_2RAM_64GB\"\n            'Windows 365 Business 2 vCPU 4 GB 128 GB'                                                                = \"CPC_B_2C_4RAM_128GB\"\n            'Windows 365 Business 2 vCPU 4 GB 256 GB'                                                                = \"CPC_B_2C_4RAM_256GB\"\n            'Windows 365 Business 2 vCPU 4 GB 64 GB'                                                                 = \"CPC_B_2C_4RAM_64GB\"\n            'Windows 365 Business 2 vCPU 8 GB 128 GB'                                                                = \"CPC_B_2C_8RAM_128GB\"\n            'Windows 365 Business 2 vCPU 8 GB 256 GB'                                                                = \"CPC_B_2C_8RAM_256GB\"\n            'Windows 365 Business 2 vCPU, 8 GB, 128 GB'                                                              = \"CPC_SS_2\"\n            'Windows 365 Business 4 vCPU 16 GB 128 GB'                                                               = \"CPC_B_4C_16RAM_128GB\"\n            'Windows 365 Business 4 vCPU 16 GB 128 GB (with Windows Hybrid Benefit)'                                 = \"CPC_B_4C_16RAM_128GB_WHB\"\n            'Windows 365 Business 4 vCPU 16 GB 256 GB'                                                               = \"CPC_B_4C_16RAM_256GB\"\n            'Windows 365 Business 4 vCPU 16 GB 512 GB'                                                               = \"CPC_B_4C_16RAM_512GB\"\n            'Windows 365 Business 8 vCPU 32 GB 128 GB'                                                               = \"CPC_B_8C_32RAM_128GB\"\n            'Windows 365 Business 8 vCPU 32 GB 256 GB'                                                               = \"CPC_B_8C_32RAM_256GB\"\n            'Windows 365 Business 8 vCPU 32 GB 512 GB'                                                               = \"CPC_B_8C_32RAM_512GB\"\n            'Windows 365 Enterprise 1 vCPU 2 GB 64 GB'                                                               = \"CPC_E_1C_2GB_64GB\"\n            'Windows 365 Enterprise 2 vCPU 4 GB 128 GB'                                                              = \"CPC_E_2C_4GB_128GB\"\n            'Windows 365 Enterprise 2 vCPU 4 GB 128 GB (Preview)'                                                    = \"CPC_LVL_1\"\n            'Windows 365 Enterprise 2 vCPU 4 GB 256 GB'                                                              = \"CPC_E_2C_4GB_256GB\"\n            'Windows 365 Enterprise 2 vCPU 4 GB 64 GB'                                                               = \"CPC_E_2C_4GB_64GB\"\n            'Windows 365 Enterprise 2 vCPU 8 GB 128 GB'                                                              = \"CPC_E_2C_8GB_128GB\"\n            'Windows 365 Enterprise 2 vCPU 8 GB 128 GB (Preview)'                                                    = \"CPC_LVL_2\"\n            'Windows 365 Enterprise 2 vCPU 8 GB 256 GB'                                                              = \"CPC_E_2C_8GB_256GB\"\n            'Windows 365 Enterprise 4 vCPU 16 GB 128 GB'                                                             = \"CPC_E_4C_16GB_128GB\"\n            'Windows 365 Enterprise 4 vCPU 16 GB 256 GB'                                                             = \"CPC_E_4C_16GB_256GB\"\n            'Windows 365 Enterprise 4 vCPU 16 GB 256 GB (Preview)'                                                   = \"CPC_LVL_3\"\n            'Windows 365 Enterprise 4 vCPU 16 GB 512 GB'                                                             = \"CPC_E_4C_16GB_512GB\"\n            'Windows 365 Enterprise 8 vCPU 32 GB 128 GB'                                                             = \"CPC_E_8C_32GB_128GB\"\n            'Windows 365 Enterprise 8 vCPU 32 GB 256 GB'                                                             = \"CPC_E_8C_32GB_256GB\"\n            'Windows 365 Enterprise 8 vCPU 32 GB 512 GB'                                                             = \"CPC_E_8C_32GB_512GB\"\n            'Windows 365 Shared Use 2 vCPU 4 GB 128 GB'                                                              = \"Windows_365_S_2vCPU_4GB_128GB\"\n            'Windows 365 Shared Use 2 vCPU 4 GB 256 GB'                                                              = \"Windows_365_S_2vCPU_4GB_256GB\"\n            'Windows 365 Shared Use 2 vCPU 4 GB 64 GB'                                                               = \"Windows_365_S_2vCPU_4GB_64GB\"\n            'Windows 365 Shared Use 2 vCPU 8 GB 128 GB'                                                              = \"Windows_365_S_2vCPU_8GB_128GB\"\n            'Windows 365 Shared Use 2 vCPU 8 GB 256 GB'                                                              = \"Windows_365_S_2vCPU_8GB_256GB\"\n            'Windows 365 Shared Use 4 vCPU 16 GB 128 GB'                                                             = \"Windows_365_S_4vCPU_16GB_128GB\"\n            'Windows 365 Shared Use 4 vCPU 16 GB 256 GB'                                                             = \"Windows_365_S_4vCPU_16GB_256GB\"\n            'Windows 365 Shared Use 4 vCPU 16 GB 512 GB'                                                             = \"Windows_365_S_4vCPU_16GB_512GB\"\n            'Windows 365 Shared Use 8 vCPU 32 GB 128 GB'                                                             = \"Windows_365_S_8vCPU_32GB_128GB\"\n            'Windows 365 Shared Use 8 vCPU 32 GB 256 GB'                                                             = \"Windows_365_S_8vCPU_32GB_256GB\"\n            'Windows 365 Shared Use 8 vCPU 32 GB 512 GB'                                                             = \"Windows_365_S_8vCPU_32GB_512GB\"\n            'Windows Autopatch'                                                                                      = \"Windows_Autopatch\"\n            'Windows Store for Business'                                                                             = \"WINDOWS_STORE\"\n            'Windows Store for Business EDU Faculty'                                                                 = \"WSFB_EDU_FACULTY\"\n            'Windows Store for Business EDU Store_faculty'                                                           = \"Windows Store for Business EDU Store_faculty\"\n            'Windows Store Service'                                                                                  = \"WINDOWS_STORE\"\n            'Windows Update for Business Deployment Service'                                                         = \"WINDOWSUPDATEFORBUSINESS_DEPLOYMENTSERVICE\"\n            'YAMMER ENTERPRIS'                                                                                       = \"YAMMER_ENTERPRISE\"\n            'Yammer Enterprise'                                                                                      = \"YAMMER_ENTERPRISE\"\n            'Yammer for Academic'                                                                                    = \"YAMMER_EDU\"\n            'YAMMER MIDSIZE'                                                                                         = \"YAMMER_MIDSIZE\"\n            'YAMMER_ENTERPRISE'                                                                                      = \"YAMMER_ENTERPRISE\"\n            'YAMMER_MIDSIZE'                                                                                         = \"YAMMER_MIDSIZE\"\n        }\n    }\n    Process {\n        if (-not $ToSku) {\n            $ConvertedLicenses = foreach ($LicenseToProcess in $License) {\n                if ($LicenseToProcess -is [string]) {\n                    $L = $LicenseToProcess\n                } elseif ($LicenseToProcess -is [Microsoft.Online.Administration.UserLicense]) {\n                    $L = $LicenseToProcess.AccountSkuId\n                } else {\n                    continue\n                }\n                # Remove tenant from SKU\n                #if ($L -match ':') {\n                #    $Split = $L -split ':'\n                #    $L = $Split[-1]\n                #}\n\n                # Removes : from tenant:VisioClient\n                $L = $L -replace '.*(:)'\n\n                $Conversion = $O365SKU[$L]\n                if ($null -eq $Conversion) {\n                    $L\n                } else {\n                    $Conversion\n                }\n            }\n        } else {\n            $ConvertedLicenses = :Outer foreach ($L in $License) {\n                # $Conversion = foreach ($_ in $O365SKU.GetEnumerator()) {\n                #     if ($_.Value -eq $L) {\n                #         $_.Name\n                #         continue Outer\n                #     }\n                # }\n                $Conversion = $SKUO365[$L]\n                if ($null -eq $Conversion) {\n                    $L\n                } else {\n                    $Conversion\n                }\n            }\n        }\n        if ($ReturnArray) {\n            $ConvertedLicenses\n        } else {\n            $ConvertedLicenses -join $Separator\n        }\n    }\n    End {}\n}\n\n# automated way to convert licenses to their names from the CSV\n# https://learn.microsoft.com/en-us/azure/active-directory/enterprise-users/licensing-service-plan-reference\n<#\n$Data = Invoke-WebRequest -Uri 'https://download.microsoft.com/download/e/3/e/e3e9faf2-f28b-490a-9ada-c6089a1fc5b0/Product%20names%20and%20service%20plan%20identifiers%20for%20licensing.csv' -OutFile \"C:\\Temp\\licensing.csv\"\n$CSV = Import-Csv -Path \"C:\\Temp\\licensing.csv\" -Delimiter ',' -Encoding UTF8\n$CSVHashReverted = [ordered] @{}\n$CSVHash = [ordered] @{}\nforeach ($C in $CSV) {\n    $CSVHash[$C.String_ID] = $C.Product_Display_Name\n    if (-not $CSVHash[$C.Service_Plan_Name]) {\n        $CSVHash[$C.Service_Plan_Name] = $C.Service_Plans_Included_Friendly_Names\n    }\n    $CSVHashReverted[$C.Product_Display_Name] = $C.String_ID\n    if (-not $CSVHashReverted[$C.Service_Plans_Included_Friendly_Names]) {\n        $CSVHashReverted[$C.Service_Plans_Included_Friendly_Names] = $C.Service_Plan_Name\n    }\n}\n$CSVServiceHash = [ordered] @{}\nforeach ($C in $CSV) {\n    $CSVServiceHash[$C.Service_Plan_Name] = $C.Service_Plans_Included_Friendly_Names\n}\n$Output = @(\n    \"[ordered] @{\"\n    foreach ($License in $CSVHash.Keys | Sort-Object) {\n        $LicenseName = $CSVHash[$License]\n        \"   '$($License)' = `\"$($LicenseName)`\"\"\n    }\n    \"}\"\n)\n$Output -Join \"`r`n\" | Set-Clipboard\n\n$OutputReverted = @(\n    \"[ordered] @{\"\n    foreach ($License in $CSVHashReverted.Keys | Sort-Object) {\n        $LicenseName = $CSVHashReverted[$License]\n        \"   '$($License)' = `\"$($LicenseName)`\"\"\n    }\n    \"}\"\n)\n$OutputReverted -Join \"`r`n\" | Set-Clipboard\n#>"
  },
  {
    "path": "Public/Converts/Convert-Size.ps1",
    "content": "function Convert-Size {\n    <#\n    .SYNOPSIS\n    Converts a value from one size unit to another.\n\n    .DESCRIPTION\n    This function converts a value from one size unit (Bytes, KB, MB, GB, TB) to another size unit based on the specified conversion. It provides flexibility to handle different size units and precision of the conversion.\n\n    .PARAMETER From\n    Specifies the original size unit of the input value.\n\n    .PARAMETER To\n    Specifies the target size unit to convert the input value to.\n\n    .PARAMETER Value\n    Specifies the numerical value to be converted.\n\n    .PARAMETER Precision\n    Specifies the number of decimal places to round the converted value to. Default is 4.\n\n    .PARAMETER Display\n    Indicates whether to display the converted value with the target size unit.\n\n    .EXAMPLE\n    Convert-Size -From 'KB' -To 'MB' -Value 2048\n    # Converts 2048 Kilobytes to Megabytes.\n\n    .EXAMPLE\n    Convert-Size -From 'GB' -To 'TB' -Value 2.5 -Precision 2 -Display\n    # Converts 2.5 Gigabytes to Terabytes with a precision of 2 decimal places and displays the result.\n\n    #>\n    # Original - https://techibee.com/powershell/convert-from-any-to-any-bytes-kb-mb-gb-tb-using-powershell/2376\n    #\n    # Changelog - Modified 30.03.2018 - przemyslaw.klys at evotec.pl\n    # - Added $Display Switch\n    [cmdletbinding()]\n    param(\n        [validateset(\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\")]\n        [string]$From,\n        [validateset(\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\")]\n        [string]$To,\n        [Parameter(Mandatory = $true)]\n        [double]$Value,\n        [int]$Precision = 4,\n        [switch]$Display\n    )\n    switch ($From) {\n        \"Bytes\" {$value = $Value }\n        \"KB\" {$value = $Value * 1024 }\n        \"MB\" {$value = $Value * 1024 * 1024}\n        \"GB\" {$value = $Value * 1024 * 1024 * 1024}\n        \"TB\" {$value = $Value * 1024 * 1024 * 1024 * 1024}\n    }\n\n    switch ($To) {\n        \"Bytes\" {return $value}\n        \"KB\" {$Value = $Value / 1KB}\n        \"MB\" {$Value = $Value / 1MB}\n        \"GB\" {$Value = $Value / 1GB}\n        \"TB\" {$Value = $Value / 1TB}\n\n    }\n    if ($Display) {\n        return \"$([Math]::Round($value,$Precision,[MidPointRounding]::AwayFromZero)) $To\"\n    } else {\n        return [Math]::Round($value, $Precision, [MidPointRounding]::AwayFromZero)\n    }\n\n}"
  },
  {
    "path": "Public/Converts/Convert-TimeToDays.ps1",
    "content": "function Convert-TimeToDays {\n    <#\n    .SYNOPSIS\n    Converts the time span between two dates into the number of days.\n\n    .DESCRIPTION\n    This function calculates the number of days between two given dates. It allows for flexibility in handling different date formats and provides an option to ignore specific dates.\n\n    .PARAMETER StartTime\n    Specifies the start date and time of the time span.\n\n    .PARAMETER EndTime\n    Specifies the end date and time of the time span.\n\n    .PARAMETER Ignore\n    Specifies a pattern to ignore specific dates. Default is '*1601*'.\n\n    .EXAMPLE\n    Convert-TimeToDays -StartTime (Get-Date).AddDays(-5) -EndTime (Get-Date)\n    # Calculates the number of days between 5 days ago and today.\n\n    .EXAMPLE\n    Convert-TimeToDays -StartTime '2022-01-01' -EndTime '2022-01-10' -Ignore '*2022*'\n    # Calculates the number of days between January 1, 2022, and January 10, 2022, ignoring any dates containing '2022'.\n\n    #>\n    [CmdletBinding()]\n    param (\n        $StartTime,\n        $EndTime,\n        #[nullable[DateTime]] $StartTime, # can't use this just yet, some old code uses strings in StartTime/EndTime.\n        #[nullable[DateTime]] $EndTime, # After that's fixed will change this.\n        [string] $Ignore = '*1601*'\n    )\n    if ($null -ne $StartTime -and $null -ne $EndTime) {\n        try {\n            if ($StartTime -notlike $Ignore -and $EndTime -notlike $Ignore) {\n                $Days = (NEW-TIMESPAN -Start $StartTime -End $EndTime).Days\n            }\n        } catch {}\n    } elseif ($null -ne $EndTime) {\n        if ($StartTime -notlike $Ignore -and $EndTime -notlike $Ignore) {\n            $Days = (NEW-TIMESPAN -Start (Get-Date) -End ($EndTime)).Days\n        }\n    } elseif ($null -ne $StartTime) {\n        if ($StartTime -notlike $Ignore -and $EndTime -notlike $Ignore) {\n            $Days = (NEW-TIMESPAN -Start $StartTime -End (Get-Date)).Days\n        }\n    }\n    return $Days\n}"
  },
  {
    "path": "Public/Converts/Convert-ToDateTime.ps1",
    "content": "function Convert-ToDateTime {\n    <#\n    .SYNOPSIS\n    Converts a file time string to a DateTime object.\n\n    .DESCRIPTION\n    This function converts a file time string to a DateTime object. It handles the conversion and provides flexibility to ignore specific file time strings.\n\n    .PARAMETER Timestring\n    Specifies the file time string to convert to a DateTime object.\n\n    .PARAMETER Ignore\n    Specifies a pattern to ignore specific file time strings. Default is '*1601*'.\n\n    .EXAMPLE\n    Convert-ToDateTime -Timestring '132479040000000000'\n    # Converts the file time string '132479040000000000' to a DateTime object.\n\n    .EXAMPLE\n    Convert-ToDateTime -Timestring '132479040000000000' -Ignore '*1601*'\n    # Converts the file time string '132479040000000000' to a DateTime object, ignoring any file time strings containing '1601'.\n\n    #>\n    [CmdletBinding()]\n    param (\n        [string] $Timestring,\n        [string] $Ignore = '*1601*'\n    )\n    Try {\n        $DateTime = ([datetime]::FromFileTime($Timestring))\n    } catch {\n        $DateTime = $null\n    }\n    if ($null -eq $DateTime -or $Timestring -like $Ignore) {\n        return $null\n    } else {\n        return $DateTime\n    }\n}"
  },
  {
    "path": "Public/Converts/Convert-ToTimeSpan.ps1",
    "content": "function Convert-ToTimeSpan {\n    <#\n    .SYNOPSIS\n    Calculates the time span between two given DateTime values.\n\n    .DESCRIPTION\n    This function calculates the time span between two specified DateTime values. It takes a start time and an end time as input parameters and returns the TimeSpan object representing the duration between them.\n\n    .PARAMETER StartTime\n    Specifies the start DateTime value. If not provided, the current date and time will be used as the default.\n\n    .PARAMETER EndTime\n    Specifies the end DateTime value.\n\n    .EXAMPLE\n    Convert-ToTimeSpan -StartTime (Get-Date).AddDays(-5) -EndTime (Get-Date)\n    # Calculates the time span between 5 days ago and today.\n\n    .EXAMPLE\n    Convert-ToTimeSpan -StartTime '2022-01-01' -EndTime '2022-01-10'\n    # Calculates the time span between January 1, 2022, and January 10, 2022.\n\n    #>\n    [CmdletBinding()]\n    param (\n        [DateTime] $StartTime = (Get-Date),\n        [DateTime] $EndTime\n    )\n    if ($StartTime -and $EndTime) {\n        try {\n            $TimeSpan = (New-TimeSpan -Start $StartTime -End $EndTime)\n        } catch {\n            $TimeSpan = $null\n        }\n    }\n    if ($null -ne $TimeSpan) {\n        return $TimeSpan\n    } else {\n        return $null\n    }\n}"
  },
  {
    "path": "Public/Converts/Convert-TwoArraysIntoOne.ps1",
    "content": "## This methods converts 2 Arrays into 1 Array\n## Administrators  + 0 = Administrators (0)\nfunction Convert-TwoArraysIntoOne {\n    <#\n    .SYNOPSIS\n    Combines two arrays into a single array by pairing elements from each array.\n\n    .DESCRIPTION\n    This function takes two arrays as input and combines them into a single array by pairing elements from each array. It creates a new array where each element is a combination of an element from the first array and the corresponding element from the second array.\n\n    .PARAMETER Object\n    Specifies the first array containing elements to be combined.\n\n    .PARAMETER ObjectToAdd\n    Specifies the second array containing elements to be paired with elements from the first array.\n\n    .EXAMPLE\n    Convert-TwoArraysIntoOne -Object @(\"A\", \"B\", \"C\") -ObjectToAdd @(1, 2, 3)\n    # Combines the arrays [\"A\", \"B\", \"C\"] and [1, 2, 3] into a single array: [\"A (1)\", \"B (2)\", \"C (3)\"].\n\n    .EXAMPLE\n    $Array1 = @(\"Apple\", \"Banana\", \"Cherry\")\n    $Array2 = @(5, 10, 15)\n    Convert-TwoArraysIntoOne -Object $Array1 -ObjectToAdd $Array2\n    # Combines the arrays $Array1 and $Array2 into a single array where each element pairs an item from $Array1 with the corresponding item from $Array2.\n\n    #>\n    [CmdletBinding()]\n    param (\n        $Object,\n        $ObjectToAdd\n    )\n\n    $Value = for ($i = 0; $i -lt $Object.Count; $i++) {\n        \"$($Object[$i]) ($($ObjectToAdd[$i]))\"\n    }\n    return $Value\n}"
  },
  {
    "path": "Public/Converts/Convert-UAC.ps1",
    "content": "Function Convert-UAC {\n    <#\n    .SYNOPSIS\n        Converts values from Events into proper format\n\n    .DESCRIPTION\n        Converts values from Events into proper format\n\n    .PARAMETER UAC\n        Parameter description\n\n    .EXAMPLE\n        Convert-UAC -UAC '%%1793'\n        Convert-UAC -UAC '1793'\n        Output: TEMP_DUPLICATE_ACCOUNT, NORMAL_ACCOUNT, RESERVED\n\n        Convert-UAC -UAC '1793', '1794'\n\n        Convert-UAC -UAC '121793'\n        Output: PASSWD_CANT_CHANGE, ENCRYPTED_TEXT_PWD_ALLOWED, TEMP_DUPLICATE_ACCOUNT, NORMAL_ACCOUNT, INTERDOMAIN_TRUST_ACCOUNT, WORKSTATION_TRUST_ACCOUNT, RESERVED, RESERVED, DONT_EXPIRE_PASSWORD\n\n        Convert-UAC -UAC 'C:\\Onet33'\n        Output: Same input as output\n\n        Convert-UAC -UAC '121793' -OutputPerLine\n        Output: One entry per line\n            PASSWD_CANT_CHANGE\n            ENCRYPTED_TEXT_PWD_ALLOWED\n            TEMP_DUPLICATE_ACCOUNT\n            NORMAL_ACCOUNT\n            INTERDOMAIN_TRUST_ACCOUNT\n            WORKSTATION_TRUST_ACCOUNT\n            RESERVED\n            RESERVED\n            DONT_EXPIRE_PASSWORD\n\n    .NOTES\n    General notes\n    #>\n    [CmdletBinding()]\n    param(\n        [string[]] $UAC,\n        [string] $Separator\n    )\n    $Output = foreach ($String in $UAC) {\n        $NumberAsString = $String.Replace('%', '') -as [int]\n        if ($null -eq $NumberAsString) {\n            return $UAC\n        }\n\n        $PropertyFlags = @(\n            \"SCRIPT\",\n            \"ACCOUNTDISABLE\",\n            \"RESERVED\",\n            \"HOMEDIR_REQUIRED\",\n            \"LOCKOUT\",\n            \"PASSWD_NOTREQD\",\n            \"PASSWD_CANT_CHANGE\",\n            \"ENCRYPTED_TEXT_PWD_ALLOWED\",\n            \"TEMP_DUPLICATE_ACCOUNT\",\n            \"NORMAL_ACCOUNT\",\n            \"RESERVED\",\n            \"INTERDOMAIN_TRUST_ACCOUNT\",\n            \"WORKSTATION_TRUST_ACCOUNT\",\n            \"SERVER_TRUST_ACCOUNT\",\n            \"RESERVED\",\n            \"RESERVED\",\n            \"DONT_EXPIRE_PASSWORD\",\n            \"MNS_LOGON_ACCOUNT\",\n            \"SMARTCARD_REQUIRED\",\n            \"TRUSTED_FOR_DELEGATION\",\n            \"NOT_DELEGATED\",\n            \"USE_DES_KEY_ONLY\",\n            \"DONT_REQ_PREAUTH\",\n            \"PASSWORD_EXPIRED\",\n            \"TRUSTED_TO_AUTH_FOR_DELEGATION\",\n            \"RESERVED\",\n            \"PARTIAL_SECRETS_ACCOUNT\"\n            \"RESERVED\"\n            \"RESERVED\"\n            \"RESERVED\"\n            \"RESERVED\"\n            \"RESERVED\"\n        )\n        1..($PropertyFlags.Length) | Where-Object { $NumberAsString -bAnd [math]::Pow(2, $_)} | ForEach-Object {$PropertyFlags[$_]}\n    }\n    if ($Separator -eq '') {\n        $Output\n    } else {\n        $Output -join $Separator\n    }\n}"
  },
  {
    "path": "Public/Converts/Convert-UserAccountControl.ps1",
    "content": "﻿function Convert-UserAccountControl {\n    <#\n    .SYNOPSIS\n    Converts the UserAccountControl flags to their corresponding names.\n\n    .DESCRIPTION\n    This function takes a UserAccountControl value and converts it into a human-readable format by matching the flags to their corresponding names.\n\n    .PARAMETER UserAccountControl\n    Specifies the UserAccountControl value to be converted.\n\n    .PARAMETER Separator\n    Specifies the separator to use when joining the converted flags. If not provided, the flags will be returned as a list.\n\n    .EXAMPLE\n    Convert-UserAccountControl -UserAccountControl 66048\n    Outputs: \"DONT_EXPIRE_PASSWORD, PASSWORD_EXPIRED\"\n\n    .EXAMPLE\n    Convert-UserAccountControl -UserAccountControl 512 -Separator ', '\n    Outputs: \"NORMAL_ACCOUNT\"\n\n    #>\n    [cmdletBinding()]\n    param(\n        [alias('UAC')][int] $UserAccountControl,\n        [string] $Separator\n    )\n    $UserAccount = [ordered] @{\n        \"SCRIPT\"                         = 1\n        \"ACCOUNTDISABLE\"                 = 2\n        \"HOMEDIR_REQUIRED\"               = 8\n        \"LOCKOUT\"                        = 16\n        \"PASSWD_NOTREQD\"                 = 32\n        \"ENCRYPTED_TEXT_PWD_ALLOWED\"     = 128\n        \"TEMP_DUPLICATE_ACCOUNT\"         = 256\n        \"NORMAL_ACCOUNT\"                 = 512\n        \"INTERDOMAIN_TRUST_ACCOUNT\"      = 2048\n        \"WORKSTATION_TRUST_ACCOUNT\"      = 4096\n        \"SERVER_TRUST_ACCOUNT\"           = 8192\n        \"DONT_EXPIRE_PASSWORD\"           = 65536\n        \"MNS_LOGON_ACCOUNT\"              = 131072\n        \"SMARTCARD_REQUIRED\"             = 262144\n        \"TRUSTED_FOR_DELEGATION\"         = 524288\n        \"NOT_DELEGATED\"                  = 1048576\n        \"USE_DES_KEY_ONLY\"               = 2097152\n        \"DONT_REQ_PREAUTH\"               = 4194304\n        \"PASSWORD_EXPIRED\"               = 8388608\n        \"TRUSTED_TO_AUTH_FOR_DELEGATION\" = 16777216\n        \"PARTIAL_SECRETS_ACCOUNT\"        = 67108864\n    }\n    $Output = foreach ($_ in $UserAccount.Keys) {\n        $binaryAnd = $UserAccount[$_] -band $UserAccountControl\n        if ($binaryAnd -ne \"0\") {\n            $_\n        }\n    }\n    if ($Separator) {\n        $Output -join $Separator\n    } else {\n        $Output\n    }\n}"
  },
  {
    "path": "Public/Converts/ConvertFrom-DistinguishedName.ps1",
    "content": "﻿function ConvertFrom-DistinguishedName {\n    <#\n    .SYNOPSIS\n    Converts a Distinguished Name to CN, OU, Multiple OUs, DC or Container\n\n    .DESCRIPTION\n    Converts a Distinguished Name to CN, OU, Multiple OUs, DC or Container\n\n    .PARAMETER DistinguishedName\n    Distinguished Name to convert\n\n    .PARAMETER ToOrganizationalUnit\n    Converts DistinguishedName to Organizational Unit\n\n    .PARAMETER ToMultipleOrganizationalUnit\n    Converts DistinguishedName to Multiple Organizational Units\n\n    .PARAMETER ToDC\n    Converts DistinguishedName to DC\n\n    .PARAMETER ToDomainCN\n    Converts DistinguishedName to Domain Canonical Name (CN)\n\n    .PARAMETER ToCanonicalName\n    Converts DistinguishedName to Canonical Name\n\n    .PARAMETER ToLastName\n    Converts DistinguishedName to the last CN or OU part\n\n    .PARAMETER ToContainer\n    Converts DistinguishedName to its parent container\n\n    .PARAMETER ToFQDN\n    Converts DistinguishedName to Fully Qualified Domain Name (FQDN)\n    This will only work for very specific cases, and will not really convert all Distinguished Names to FQDN\n\n    .EXAMPLE\n    $DistinguishedName = 'CN=Przemyslaw Klys,OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz'\n    ConvertFrom-DistinguishedName -DistinguishedName $DistinguishedName -ToOrganizationalUnit\n\n    Output:\n    OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz\n\n    .EXAMPLE\n    $DistinguishedName = 'CN=Przemyslaw Klys,OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz'\n    ConvertFrom-DistinguishedName -DistinguishedName $DistinguishedName\n\n    Output:\n    Przemyslaw Klys\n\n    .EXAMPLE\n    ConvertFrom-DistinguishedName -DistinguishedName 'OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz' -ToMultipleOrganizationalUnit -IncludeParent\n\n    Output:\n    OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz\n    OU=Production,DC=ad,DC=evotec,DC=xyz\n\n    .EXAMPLE\n    ConvertFrom-DistinguishedName -DistinguishedName 'OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz' -ToMultipleOrganizationalUnit\n\n    Output:\n    OU=Production,DC=ad,DC=evotec,DC=xyz\n\n    .EXAMPLE\n    $Con = @(\n        'CN=Windows Authorization Access Group,CN=Builtin,DC=ad,DC=evotec,DC=xyz'\n        'CN=Mmm,DC=elo,CN=nee,DC=RootDNSServers,CN=MicrosoftDNS,CN=System,DC=ad,DC=evotec,DC=xyz'\n        'CN=e6d5fd00-385d-4e65-b02d-9da3493ed850,CN=Operations,CN=DomainUpdates,CN=System,DC=ad,DC=evotec,DC=xyz'\n        'OU=Domain Controllers,DC=ad,DC=evotec,DC=pl'\n        'OU=Microsoft Exchange Security Groups,DC=ad,DC=evotec,DC=xyz'\n    )\n\n    ConvertFrom-DistinguishedName -DistinguishedName $Con -ToLastName\n\n    Output:\n    Windows Authorization Access Group\n    Mmm\n    e6d5fd00-385d-4e65-b02d-9da3493ed850\n    Domain Controllers\n    Microsoft Exchange Security Groups\n\n    .EXAMPLE\n    ConvertFrom-DistinguishedName -DistinguishedName 'DC=ad,DC=evotec,DC=xyz' -ToCanonicalName\n    ConvertFrom-DistinguishedName -DistinguishedName 'OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz' -ToCanonicalName\n    ConvertFrom-DistinguishedName -DistinguishedName 'CN=test,OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz' -ToCanonicalName\n\n    Output:\n    ad.evotec.xyz\n    ad.evotec.xyz\\Production\\Users\n    ad.evotec.xyz\\Production\\Users\\test\n\n    .EXAMPLE\n    ConvertFrom-DistinguishedName -DistinguishedName 'CN=Users,DC=ad,DC=evotec,DC=xyz' -ToContainer\n    ConvertFrom-DistinguishedName -DistinguishedName 'CN=Group Policy Creator Owners,CN=Users,DC=ad,DC=evotec,DC=xyz' -ToContainer\n    ConvertFrom-DistinguishedName -DistinguishedName 'CN=Admin,OU=Servers,DC=ad,DC=evotec,DC=xyz' -ToContainer\n    ConvertFrom-DistinguishedName -DistinguishedName 'OU=Servers,DC=ad,DC=evotec,DC=xyz' -ToContainer\n\n    Output:\n    CN=Users,DC=ad,DC=evotec,DC=xyz\n    CN=Users,DC=ad,DC=evotec,DC=xyz\n    OU=Servers,DC=ad,DC=evotec,DC=xyz\n    OU=Servers,DC=ad,DC=evotec,DC=xyz\n\n    .NOTES\n    General notes\n    #>\n    [CmdletBinding(DefaultParameterSetName = 'Default')]\n    param(\n        [Parameter(ParameterSetName = 'ToOrganizationalUnit')]\n        [Parameter(ParameterSetName = 'ToMultipleOrganizationalUnit')]\n        [Parameter(ParameterSetName = 'ToDC')]\n        [Parameter(ParameterSetName = 'ToDomainCN')]\n        [Parameter(ParameterSetName = 'Default')]\n        [Parameter(ParameterSetName = 'ToLastName')]\n        [Parameter(ParameterSetName = 'ToCanonicalName')]\n        [Parameter(ParameterSetName = 'ToFQDN')]\n        [Parameter(ParameterSetName = 'ToContainer')]\n        [alias('Identity', 'DN')][Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName, Position = 0)][string[]] $DistinguishedName,\n        [Parameter(ParameterSetName = 'ToOrganizationalUnit')][switch] $ToOrganizationalUnit,\n        [Parameter(ParameterSetName = 'ToMultipleOrganizationalUnit')][alias('ToMultipleOU')][switch] $ToMultipleOrganizationalUnit,\n        [Parameter(ParameterSetName = 'ToMultipleOrganizationalUnit')][switch] $IncludeParent,\n        [Parameter(ParameterSetName = 'ToDC')][switch] $ToDC,\n        [Parameter(ParameterSetName = 'ToDomainCN')][switch] $ToDomainCN,\n        [Parameter(ParameterSetName = 'ToLastName')][switch] $ToLastName,\n        [Parameter(ParameterSetName = 'ToCanonicalName')][switch] $ToCanonicalName,\n        [Parameter(ParameterSetName = 'ToContainer')][switch] $ToContainer,\n        [Parameter(ParameterSetName = 'ToFQDN')][switch] $ToFQDN\n    )\n    process {\n        foreach ($Distinguished in $DistinguishedName) {\n            if ($ToDomainCN) {\n                $DN = $Distinguished -replace '.*?((DC=[^=]+,)+DC=[^=]+)$', '$1'\n                $CN = $DN -replace ',DC=', '.' -replace \"DC=\"\n                if ($CN) {\n                    $CN\n                }\n            } elseif ($ToOrganizationalUnit) {\n                <#\n                .SYNOPSIS\n                Extracts the organizational unit part from a Distinguished Name.\n\n                .DESCRIPTION\n                For objects with OU in the path, finds and returns the first OU and everything after it.\n                For objects with only CN parts, returns everything after the first CN.\n                For objects that are already OUs, returns the original DN.\n                #>\n                if ($Distinguished -match '.*?(OU=.+)$') {\n                    # If the DN contains an OU part, return that part (first OU and everything after)\n                    $matches[1]\n                } elseif ($Distinguished -match '^CN=[^,\\\\]+(?:\\\\,[^,\\\\]+)*,(.+)$') {\n                    # No OU found, but DN starts with CN - return everything after first CN\n                    $matches[1]\n                } elseif ($Distinguished -match '^(OU=|CN=)') {\n                    # Return full string if it starts with OU= or if nothing else matched\n                    $Distinguished\n                }\n            } elseif ($ToMultipleOrganizationalUnit) {\n                <#\n                .SYNOPSIS\n                Extracts multiple organizational unit paths from a Distinguished Name.\n\n                .DESCRIPTION\n                Returns an array of organizational unit paths representing each level in the distinguished name.\n                - Without IncludeParent: Skips the parent OU level if the input is already an OU\n                - With IncludeParent: Includes the original DN as the first element\n                Focuses only on OU parts, ignoring CN containers (unless part of the parent DN).\n                #>\n                # Split the DN by unescaped commas\n                $Parts = $Distinguished -split '(?<!\\\\),'\n\n                # Create results collection\n                $Results = [System.Collections.ArrayList]::new()\n\n                # Add parent if requested\n                if ($IncludeParent) {\n                    $null = $Results.Add($Distinguished)\n                }\n\n                # Find the first DC part\n                $DCIndex = $Parts.Count - 1\n                for ($i = 0; $i -lt $Parts.Count; $i++) {\n                    if ($Parts[$i] -match '^DC=') {\n                        $DCIndex = $i\n                        break\n                    }\n                }\n\n                # Determine starting index for processing\n                # If input starts with OU= and -IncludeParent isn't specified, skip the first OU\n                $StartIndex = if ($Parts[0] -match '^OU=' -and -not $IncludeParent) {\n                    1  # Skip first OU part without IncludeParent\n                } else {\n                    if ($Parts[0] -match '^CN=') {\n                        0  # For CN objects, process all parts\n                    } else {\n                        1  # Default starting index\n                    }\n                }\n\n                # Extract all OU paths by joining from each OU part to the end\n                # Skip the parts we've determined should be skipped\n                for ($i = $StartIndex; $i -lt $DCIndex; $i++) {\n                    # Only process if this part is an OU\n                    if ($Parts[$i] -match '^OU=') {\n                        $null = $Results.Add(($Parts[$i..$Parts.Count]) -join ',')\n                    }\n                }\n\n                # Return all results that start with OU=\n                $Results | Where-Object { $_ -match '^OU=' }\n            } elseif ($ToDC) {\n                $Value = $Distinguished -replace '.*?((DC=[^=]+,)+DC=[^=]+)$', '$1'\n                if ($Value) {\n                    $Value\n                }\n            } elseif ($ToLastName) {\n                $NewDN = $Distinguished -split \",DC=\"\n                if ($NewDN[0].Contains(\",OU=\")) {\n                    [Array] $ChangedDN = $NewDN[0] -split \",OU=\"\n                } elseif ($NewDN[0].Contains(\",CN=\")) {\n                    [Array] $ChangedDN = $NewDN[0] -split \",CN=\"\n                } else {\n                    [Array] $ChangedDN = $NewDN[0]\n                }\n                if ($ChangedDN[0].StartsWith('CN=')) {\n                    $ChangedDN[0] -replace 'CN=', ''\n                } else {\n                    $ChangedDN[0] -replace 'OU=', ''\n                }\n            } elseif ($ToCanonicalName) {\n                $Domain = $null\n                $Rest = $null\n                foreach ($O in $Distinguished -split '(?<!\\\\),') {\n                    if ($O -match '^DC=') {\n                        $Domain += $O.Substring(3) + '.'\n                    } else {\n                        $Rest = $O.Substring(3) + '\\' + $Rest\n                    }\n                }\n                if ($Domain -and $Rest) {\n                    $Domain.Trim('.') + '\\' + ($Rest.TrimEnd('\\') -replace '\\\\,', ',')\n                } elseif ($Domain) {\n                    $Domain.Trim('.')\n                } elseif ($Rest) {\n                    $Rest.TrimEnd('\\') -replace '\\\\,', ','\n                }\n            } elseif ($ToContainer) {\n                <#\n                .SYNOPSIS\n                Extracts the parent container from a Distinguished Name.\n\n                .DESCRIPTION\n                For objects within containers (like \"CN=Object,CN=Container,...\"), returns the container part.\n                For objects within OU containers (like \"CN=Object,OU=Container,...\"), returns the OU container.\n                For container objects directly under the domain (like \"CN=Users,DC=...\"), returns the full DN.\n                For organizational units (like \"OU=Container,DC=...\"), returns the OU itself.\n                #>\n                if ($Distinguished -match '^(?:CN|OU)=[^,\\\\]+(?:\\\\,[^,\\\\]+)*,(((?:CN|OU)=[^,\\\\]+(?:\\\\,[^,\\\\]+)*,)+(?:DC=.+))$') {\n                    # This is an object within a container, return the parent container part\n                    $matches[1]\n                } else {\n                    # Either this is already a container directly under domain or another type\n                    # Return the original DN\n                    $Distinguished\n                }\n            } elseif ($ToFQDN) {\n                if ($Distinguished -match '^CN=(.+?),(?:(?:OU|CN).+,)*((?:DC=.+,?)+)$') {\n                    $cnPart = $matches[1] -replace '\\\\,', ','\n                    $dcPart = $matches[2] -replace 'DC=', '' -replace ',', '.'\n                    \"$cnPart.$dcPart\"\n                } elseif ($Distinguished -match '^CN=(.+?),((?:DC=.+,?)+)$') {\n                    $cnPart = $matches[1] -replace '\\\\,', ','\n                    $dcPart = $matches[2] -replace 'DC=', '' -replace ',', '.'\n                    \"$cnPart.$dcPart\"\n                }\n            } else {\n                $Regex = '^CN=(?<cn>.+?)(?<!\\\\),(?<ou>(?:(?:OU|CN).+?(?<!\\\\),)+(?<dc>DC.+?))$'\n                $Found = $Distinguished -match $Regex\n                if ($Found) {\n                    $Matches.cn\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "Public/Converts/ConvertFrom-ErrorRecord.ps1",
    "content": "#\n# https://community.idera.com/database-tools/powershell/powertips/b/tips/posts/making-error-records-more-readable\n\nfunction ConvertFrom-ErrorRecord {\n    <#\n    .SYNOPSIS\n    Converts error records into a custom object with selected properties.\n\n    .DESCRIPTION\n    This function takes error records as input and converts them into a custom object with selected properties, making error records more readable.\n\n    .PARAMETER ErrorRecord\n    The error record(s) to convert. This parameter is mandatory when the input is an error record.\n\n    .PARAMETER Exception\n    The special stop exception raised by cmdlets with -ErrorAction Stop. This parameter is mandatory when the input is a stop exception.\n\n    .EXAMPLE\n    Get-ChildItem -Path 'C:\\NonExistentFolder' -ErrorAction Stop | ConvertFrom-ErrorRecord\n\n    This example will convert the error record generated by attempting to access a non-existent folder into a custom object with properties like Exception message, Reason, Target, Script name, Line number, and Column offset.\n\n    .EXAMPLE\n    $error[0] | ConvertFrom-ErrorRecord\n\n    This example will convert the first error record in the $error automatic variable into a custom object with selected properties.\n\n    #>\n    param (\n        # we receive either a legit error record...\n        [Management.Automation.ErrorRecord[]]\n        [Parameter(Mandatory,ValueFromPipeline,ParameterSetName='ErrorRecord')]\n        $ErrorRecord,\n\n        # ...or a special stop exception which is raised by\n        # cmdlets with -ErrorAction Stop\n        [Management.Automation.ActionPreferenceStopException[]]\n        [Parameter(Mandatory,ValueFromPipeline,ParameterSetName='StopException')]\n        $Exception\n    )\n\n    process {\n        # if we received a stop exception in $Exception,\n        # the error record is to be found inside of it\n        # in all other cases, $ErrorRecord was received\n        # directly\n        if ($PSCmdlet.ParameterSetName -eq 'StopException') {\n            $ErrorRecord = $Exception.ErrorRecord\n        }\n\n        # compose a new object out of the interesting properties\n        # found in the error record object\n        $ErrorRecord | ForEach-Object {\n            [PSCustomObject]@{\n                Exception = $_.Exception.Message\n                Reason    = $_.CategoryInfo.Reason\n                Target    = $_.CategoryInfo.TargetName\n                Script    = $_.InvocationInfo.ScriptName\n                Line      = $_.InvocationInfo.ScriptLineNumber\n                Column    = $_.InvocationInfo.OffsetInLine\n            }\n        }\n    }\n}"
  },
  {
    "path": "Public/Converts/ConvertFrom-LanguageCode.ps1",
    "content": "﻿function ConvertFrom-LanguageCode {\n    <#\n    .SYNOPSIS\n    Converts a language code to its corresponding language name.\n\n    .DESCRIPTION\n    This function takes a language code as input and returns the corresponding language name.\n\n    .PARAMETER LanguageCode\n    The language code to convert to a language name.\n\n    .EXAMPLE\n    ConvertFrom-LanguageCode -LanguageCode 1033\n    Returns: \"English (United States)\"\n\n    .EXAMPLE\n    ConvertFrom-LanguageCode -LanguageCode 1041\n    Returns: \"Japanese\"\n    #>\n    [cmdletBinding()]\n    param(\n        [string] $LanguageCode\n    )\n    $LanguageCodeDictionary = @{\n        '1'     = \"Arabic\"\n        '4'     = \"Chinese (Simplified)?? China\"\n        '9'     = \"English\"\n        '1025'  = \"Arabic (Saudi Arabia)\"\n        '1026'  = \"Bulgarian\"\n        '1027'  = \"Catalan\"\n        '1028'  = \"Chinese (Traditional) Taiwan\"\n        '1029'  = \"Czech\"\n        '1030'  = \"Danish\"\n        '1031'  = \"German (Germany)\"\n        '1032'  = \"Greek\"\n        '1033'  = \"English (United States)\"\n        '1034'  = \"Spanish (Traditional Sort)\"\n        '1035'  = \"Finnish\"\n        '1036'  = \"French (France)\"\n        '1037'  = \"Hebrew\"\n        '1038'  = \"Hungarian\"\n        '1039'  = \"Icelandic\"\n        '1040'  = \"Italian (Italy)\"\n        '1041'  = \"Japanese\"\n        '1042'  = \"Korean\"\n        '1043'  = \"Dutch (Netherlands)\"\n        '1044'  = \"Norwegian (Bokmal)\"\n        '1045'  = \"Polish\"\n        '1046'  = \"Portuguese (Brazil)\"\n        '1047'  = \"Rhaeto-Romanic\"\n        '1048'  = \"Romanian\"\n        '1049'  = \"Russian\"\n        '1050'  = \"Croatian\"\n        '1051'  = \"Slovak\"\n        '1052'  = \"Albanian\"\n        '1053'  = \"Swedish\"\n        '1054'  = \"Thai\"\n        '1055'  = \"Turkish\"\n        '1056'  = \"Urdu\"\n        '1057'  = \"Indonesian\"\n        '1058'  = \"Ukrainian\"\n        '1059'  = \"Belarusian\"\n        '1060'  = \"Slovenian\"\n        '1061'  = \"Estonian\"\n        '1062'  = \"Latvian\"\n        '1063'  = \"Lithuanian\"\n        '1065'  = \"Persian\"\n        '1066'  = \"Vietnamese\"\n        '1069'  = \"Basque (Basque)\"\n        '1070'  = \"Serbian\"\n        '1071'  = \"Macedonian (FYROM)\"\n        '1072'  = \"Sutu\"\n        '1073'  = \"Tsonga\"\n        '1074'  = \"Tswana\"\n        '1076'  = \"Xhosa\"\n        '1077'  = \"Zulu\"\n        '1078'  = \"Afrikaans\"\n        '1080'  = \"Faeroese\"\n        '1081'  = \"Hindi\"\n        '1082'  = \"Maltese\"\n        '1084'  = \"Scottish Gaelic (United Kingdom)\"\n        '1085'  = \"Yiddish\"\n        '1086'  = \"Malay (Malaysia)\"\n        '2049'  = \"Arabic (Iraq)\"\n        '2052'  = \"Chinese (Simplified) PRC\"\n        '2055'  = \"German (Switzerland)\"\n        '2057'  = \"English (United Kingdom)\"\n        '2058'  = \"Spanish (Mexico)\"\n        '2060'  = \"French (Belgium)\"\n        '2064'  = \"Italian (Switzerland)\"\n        '2067'  = \"Dutch (Belgium)\"\n        '2068'  = \"Norwegian (Nynorsk)\"\n        '2070'  = \"Portuguese (Portugal)\"\n        '2072'  = \"Romanian (Moldova)\"\n        '2073'  = \"Russian (Moldova)\"\n        '2074'  = \"Serbian (Latin)\"\n        '2077'  = \"Swedish (Finland)\"\n        '3073'  = \"Arabic (Egypt)\"\n        '3076'  = \"Chinese Traditional (Hong Kong SAR)\"\n        '3079'  = \"German (Austria)\"\n        '3081'  = \"English (Australia)\"\n        '3082'  = \"Spanish (International Sort)\"\n        '3084'  = \"French (Canada)\"\n        '3098'  = \"Serbian (Cyrillic)\"\n        '4097'  = \"Arabic (Libya)\"\n        '4100'  = \"Chinese Simplified (Singapore)\"\n        '4103'  = \"German (Luxembourg)\"\n        '4105'  = \"English (Canada)\"\n        '4106'  = \"Spanish (Guatemala)\"\n        '4108'  = \"French (Switzerland)\"\n        '5121'  = \"Arabic (Algeria)\"\n        '5127'  = \"German (Liechtenstein)\"\n        '5129'  = \"English (New Zealand)\"\n        '5130'  = \"Spanish (Costa Rica)\"\n        '5132'  = \"French (Luxembourg)\"\n        '6145'  = \"Arabic (Morocco)\"\n        '6153'  = \"English (Ireland)\"\n        '6154'  = \"Spanish (Panama)\"\n        '7169'  = \"Arabic (Tunisia)\"\n        '7177'  = \"English (South Africa)\"\n        '7178'  = \"Spanish (Dominican Republic)\"\n        '8193'  = \"Arabic (Oman)\"\n        '8201'  = \"English (Jamaica)\"\n        '8202'  = \"Spanish (Venezuela)\"\n        '9217'  = \"Arabic (Yemen)\"\n        '9226'  = \"Spanish (Colombia)\"\n        '10241' = \"Arabic (Syria)\"\n        '10249' = \"English (Belize)\"\n        '10250' = \"Spanish (Peru)\"\n        '11265' = \"Arabic (Jordan)\"\n        '11273' = \"English (Trinidad)\"\n        '11274' = \"Spanish (Argentina)\"\n        '12289' = \"Arabic (Lebanon)\"\n        '12298' = \"Spanish (Ecuador)\"\n        '13313' = \"Arabic (Kuwait)\"\n        '13322' = \"Spanish (Chile)\"\n        '14337' = \"Arabic (U.A.E.)\"\n        '14346' = \"Spanish (Uruguay)\"\n        '15361' = \"Arabic (Bahrain)\"\n        '15370' = \"Spanish (Paraguay)\"\n        '16385' = \"Arabic (Qatar)\"\n        '16394' = \"Spanish (Bolivia)\"\n        '17418' = \"Spanish (El Salvador)\"\n        '18442' = \"Spanish (Honduras)\"\n        '19466' = \"Spanish (Nicaragua)\"\n        '20490' = \"Spanish (Puerto Rico)\"\n    }\n    $Output = $LanguageCodeDictionary[$LanguageCode]\n    if ($Output) {\n        $Output\n    } else {\n        \"Unknown (Undocumented)\"\n    }\n}"
  },
  {
    "path": "Public/Converts/ConvertFrom-NetbiosName.ps1",
    "content": "﻿function ConvertFrom-NetbiosName {\n    <#\n    .SYNOPSIS\n    Converts a NetBIOS name to its corresponding domain name and object name.\n\n    .DESCRIPTION\n    This function takes a NetBIOS name in the format 'Domain\\Object' and converts it to the corresponding domain name and object name.\n\n    .PARAMETER Identity\n    Specifies the NetBIOS name(s) to convert.\n\n    .EXAMPLE\n    'TEST\\Domain Admins', 'EVOTEC\\Domain Admins', 'EVOTECPL\\Domain Admins' | ConvertFrom-NetbiosName\n    Converts the NetBIOS names 'TEST\\Domain Admins', 'EVOTEC\\Domain Admins', and 'EVOTECPL\\Domain Admins' to their corresponding domain names and object names.\n\n    .EXAMPLE\n    ConvertFrom-NetbiosName -Identity 'TEST\\Domain Admins', 'EVOTEC\\Domain Admins', 'EVOTECPL\\Domain Admins'\n    Converts the NetBIOS names 'TEST\\Domain Admins', 'EVOTEC\\Domain Admins', and 'EVOTECPL\\Domain Admins' to their corresponding domain names and object names.\n\n    #>\n    [cmdletBinding()]\n    param(\n        [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName, Position = 0)]\n        [string[]] $Identity\n    )\n    process {\n        foreach ($Ident in $Identity) {\n            if ($Ident -like '*\\*') {\n                $NetbiosWithObject = $Ident -split \"\\\\\"\n                if ($NetbiosWithObject.Count -eq 2) {\n                    $LDAPQuery = ([ADSI]\"LDAP://$($NetbiosWithObject[0])\")\n                    $DomainName = ConvertFrom-DistinguishedName -DistinguishedName $LDAPQuery.distinguishedName -ToDomainCN\n                    [PSCustomObject] @{\n                        DomainName = $DomainName\n                        Name       = $NetbiosWithObject[1]\n                    }\n                } else {\n                    # we can't be sure what we got so lets push back what we got\n                    [PSCustomObject] @{\n                        DomainName = ''\n                        Name       = $Ident\n                    }\n                }\n            } else {\n                # we can't be sure what we got so lets push back what we got\n                [PSCustomObject] @{\n                    DomainName = ''\n                    Name       = $Ident\n                }\n            }\n        }\n    }\n}\n<#\n'TEST\\Domain Admins', 'EVOTEC\\Domain Admins', 'EVOTECPL\\Domain Admins' | ConvertFrom-NetbiosName\nConvertFrom-NetbiosName -Identity 'TEST\\Domain Admins', 'EVOTEC\\Domain Admins', 'EVOTECPL\\Domain Admins'\n#>"
  },
  {
    "path": "Public/Converts/ConvertFrom-ObjectToString.ps1",
    "content": "﻿function ConvertFrom-ObjectToString {\n    <#\n    .SYNOPSIS\n    Helps with converting given objects to their string representation.\n\n    .DESCRIPTION\n     Helps with converting given objects to their string representation.\n\n    .PARAMETER Objects\n    Objects to convert to string representation.\n\n    .PARAMETER IncludeProperties\n    Properties to include in the string representation.\n\n    .PARAMETER ExcludeProperties\n    Properties to exclude from the string representation.\n\n    .PARAMETER OutputType\n    Type of the output object. Options are: Hashtable, Ordered, PSCustomObject. If not specified, the output type is hashtable (string)\n\n    .PARAMETER NumbersAsString\n    If specified, numbers are converted to strings. Default is number are presented in their (unquoted) numerica form\n\n    .PARAMETER QuotePropertyNames\n    If specified, all property names are quoted. Default: property names are quoted only if they contain spaces.\n\n    .PARAMETER DateTimeFormat\n    Format for DateTime values. Default: 'yyyy-MM-dd HH:mm:ss'\n\n    .EXAMPLE\n    Get-Process -Name \"PowerShell\" | ConvertFrom-ObjectToString -IncludeProperties 'ProcessName', 'Id', 'Handles'\n\n    OUTPUT:\n    @{\n        'Handles' = '543'\n        'Id' = '8092'\n        'ProcessName' = 'powershell'\n    }\n\n    @{\n        'Handles' = '636'\n        'Id' = '11360'\n        'ProcessName' = 'powershell'\n    }\n\n    .NOTES\n    General notes\n    #>\n    [CmdletBinding()]\n    param(\n        [parameter(ValueFromPipeline, ValueFromPipelineByPropertyName, Mandatory)][Array] $Objects,\n        [string[]] $IncludeProperties,\n        [string[]] $ExcludeProperties,\n        [ValidateSet('Hashtable', 'Ordered', 'PSCustomObject')][string] $OutputType = 'Hashtable',\n        [switch] $NumbersAsString,\n        [switch] $QuotePropertyNames,\n        [string] $DateTimeFormat = 'yyyy-MM-dd HH:mm:ss'\n    )\n    begin {\n        if ($OutputType -eq 'Hashtable') {\n            $Type = ''\n        } elseif ($OutputType -eq 'Ordered') {\n            $Type = '[Ordered] '\n        } else {\n            $Type = '[PSCustomObject] '\n        }\n    }\n    process {\n        filter IsNumeric() {\n            return $_ -is [byte] -or $_ -is [int16] -or $_ -is [int32] -or $_ -is [int64]  `\n                -or $_ -is [sbyte] -or $_ -is [uint16] -or $_ -is [uint32] -or $_ -is [uint64] `\n                -or $_ -is [float] -or $_ -is [double] -or $_ -is [decimal]\n        }\n        function GetFormattedPair () {\n            # returns 'key' = <valuestring> or just <valuestring> if key is empty\n            # valuestring is either $null, '<string>', or number\n            param (\n                [string] $Key,\n                [object] $Value\n            )\n            if ($key -eq '') {\n                $left = ''\n            } elseif ($key -match '\\s' -or $QuotePropertyNames) {\n                $left = \"'$Key' = \"\n            } else {\n                $left = \"$Key = \"\n            }\n            if ($null -eq $value) {\n                \"$left`$null\"\n            } elseif ($Value -is [System.Collections.IList]) {\n                $arrayStrings = foreach ($element in $Object.$Key) {\n                    GetFormattedPair -Key '' -Value $element\n                }\n                \"$left@(\" + ($arrayStrings -join ', ') + \")\"\n            } elseif ($Value -is [System.Collections.IDictionary]) {\n                if ($IncludeProperties -and $Key -notin $IncludeProperties) {\n                    return\n                }\n                if ($Key -in $ExcludeProperties) {\n                    return\n                }\n                $propertyString = foreach ($Key in $Value.Keys) {\n                    GetFormattedPair -Key $key -Value $Value[$key]\n                }\n                \"$left@{\" + ($propertyString -join '; ') + \"}\"\n            } elseif ($value -is [DateTime]) {\n                \"$left'$($Value.ToString($DateTimeFormat))'\"\n            } elseif (($value | IsNumeric) -and -not $NumbersAsString) {\n                \"$left$($Value)\"\n            } else {\n                \"$left'$($Value)'\"\n            }\n        }\n\n        foreach ($Object in $Objects) {\n            if ($Object -is [System.Collections.IDictionary]) {\n                Write-Host\n                Write-Host -Object \"$Type@{\"\n                foreach ($Key in $Object.Keys) {\n                    if ($IncludeProperties -and $Key -notin $IncludeProperties) {\n                        continue\n                    }\n                    if ($Key -in $ExcludeProperties) {\n                        continue\n                    }\n                    Write-Host -Object \"    $(GetFormattedPair -Key $Key -Value $Object.$Key)\" -ForegroundColor Cyan\n                }\n                Write-Host -Object \"}\"\n            } elseif ($Object -is [Object]) {\n                Write-Host\n                Write-Host -Object \"$Type@{\"\n                foreach ($Key in $Object.PSObject.Properties.Name) {\n                    if ($IncludeProperties -and $Key -notin $IncludeProperties) {\n                        continue\n                    }\n                    if ($Key -in $ExcludeProperties) {\n                        continue\n                    }\n                    Write-Host -Object \"    $(GetFormattedPair -Key $Key -Value $Object.$Key)\" -ForegroundColor Cyan\n                }\n                Write-Host -Object \"}\"\n            } else {\n                Write-Host -Object $Object\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "Public/Converts/ConvertFrom-OperationType.ps1",
    "content": "Function ConvertFrom-OperationType {\n    <#\n    .SYNOPSIS\n    Converts operation type codes to human-readable descriptions.\n\n    .DESCRIPTION\n    This function takes an operation type code and returns the corresponding human-readable description.\n\n    .PARAMETER OperationType\n    The operation type code to be converted.\n\n    .EXAMPLE\n    ConvertFrom-OperationType -OperationType '%%14674'\n    Output: 'Value Added'\n\n    .EXAMPLE\n    ConvertFrom-OperationType -OperationType '%%14675'\n    Output: 'Value Deleted'\n\n    .EXAMPLE\n    ConvertFrom-OperationType -OperationType '%%14676'\n    Output: 'Unknown'\n    #>\n    param (\n        [string] $OperationType\n    )\n    $Known = @{\n        '%%14674' = 'Value Added'\n        '%%14675' = 'Value Deleted'\n        '%%14676' = 'Unknown'\n    }\n    foreach ($id in $OperationType) {\n        if ($name = $Known[$id]) { return $name }\n    }\n    return $OperationType\n}"
  },
  {
    "path": "Public/Converts/ConvertFrom-SID.ps1",
    "content": "function ConvertFrom-SID {\n    <#\n    .SYNOPSIS\n    Small command that can resolve SID values\n\n    .DESCRIPTION\n    Small command that can resolve SID values\n\n    .PARAMETER SID\n    Value to resolve\n\n    .PARAMETER OnlyWellKnown\n    Only resolve SID when it's well know SID. Otherwise return $null\n\n    .PARAMETER OnlyWellKnownAdministrative\n    Only resolve SID when it's administrative well know SID. Otherwise return $null\n\n    .PARAMETER DoNotResolve\n    Uses only dicrionary values without querying AD\n\n    .EXAMPLE\n    ConvertFrom-SID -SID 'S-1-5-8', 'S-1-5-9', 'S-1-5-11', 'S-1-5-18', 'S-1-1-0' -DoNotResolve\n\n    .NOTES\n    General notes\n    #>\n    [cmdletbinding(DefaultParameterSetName = 'Standard')]\n    param(\n        [Parameter(ParameterSetName = 'Standard')]\n        [Parameter(ParameterSetName = 'OnlyWellKnown')]\n        [Parameter(ParameterSetName = 'OnlyWellKnownAdministrative')]\n        [string[]] $SID,\n        [Parameter(ParameterSetName = 'OnlyWellKnown')][switch] $OnlyWellKnown,\n        [Parameter(ParameterSetName = 'OnlyWellKnownAdministrative')][switch] $OnlyWellKnownAdministrative,\n        [Parameter(ParameterSetName = 'Standard')][switch] $DoNotResolve\n    )\n    # https://support.microsoft.com/en-au/help/243330/well-known-security-identifiers-in-windows-operating-systems\n    $WellKnownAdministrative = @{\n        'S-1-5-18'     = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\SYSTEM'\n            SID        = 'S-1-5-18'\n            DomainName = ''\n            Type       = 'WellKnownAdministrative'\n            Error      = ''\n        }\n        'S-1-5-32-544' = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Administrators'\n            SID        = 'S-1-5-32-544'\n            DomainName = ''\n            Type       = 'WellKnownAdministrative'\n            Error      = ''\n        }\n    }\n    $wellKnownSIDs = @{\n        'S-1-0'                                                           = [PSCustomObject] @{\n            Name       = 'Null AUTHORITY'\n            SID        = 'S-1-0'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-0-0'                                                         = [PSCustomObject] @{\n            Name       = 'NULL SID'\n            SID        = 'S-1-0-0'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-1'                                                           = [PSCustomObject] @{\n            Name       = 'WORLD AUTHORITY'\n            SID        = 'S-1-1'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-1-0'                                                         = [PSCustomObject] @{\n            Name       = 'Everyone'\n            SID        = 'S-1-1-0'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-2'                                                           = [PSCustomObject] @{\n            Name       = 'LOCAL AUTHORITY'\n            SID        = 'S-1-2'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-2-0'                                                         = [PSCustomObject] @{\n            Name       = 'LOCAL'\n            SID        = 'S-1-2-0'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-2-1'                                                         = [PSCustomObject] @{\n            Name       = 'CONSOLE LOGON'\n            SID        = 'S-1-2-1'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-3'                                                           = [PSCustomObject] @{\n            Name       = 'CREATOR AUTHORITY'\n            SID        = 'S-1-3'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-3-0'                                                         = [PSCustomObject] @{\n            Name       = 'CREATOR OWNER'\n            SID        = 'S-1-3-0'\n            DomainName = ''\n            Type       = 'WellKnownAdministrative'\n            Error      = ''\n        }\n        'S-1-3-1'                                                         = [PSCustomObject] @{\n            Name       = 'CREATOR GROUP'\n            SID        = 'S-1-3-1'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-3-2'                                                         = [PSCustomObject] @{\n            Name       = 'CREATOR OWNER SERVER'\n            SID        = 'S-1-3-2'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-3-3'                                                         = [PSCustomObject] @{\n            Name       = 'CREATOR GROUP SERVER'\n            SID        = 'S-1-3-3'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-3-4'                                                         = [PSCustomObject] @{\n            Name       = 'OWNER RIGHTS'\n            SID        = 'S-1-3-4'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-80-0'                                                      = [PSCustomObject] @{\n            Name       = 'NT SERVICE\\ALL SERVICES'\n            SID        = 'S-1-5-80-0'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-4'                                                           = [PSCustomObject] @{\n            Name       = 'Non-unique Authority'\n            SID        = 'S-1-4'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5'                                                           = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY'\n            SID        = 'S-1-5'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-1'                                                         = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\DIALUP'\n            SID        = 'S-1-5-1'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-2'                                                         = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\NETWORK'\n            SID        = 'S-1-5-2'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-3'                                                         = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\BATCH'\n            SID        = 'S-1-5-3'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-4'                                                         = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\INTERACTIVE'\n            SID        = 'S-1-5-4'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-6'                                                         = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\SERVICE'\n            SID        = 'S-1-5-6'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-7'                                                         = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\ANONYMOUS LOGON'\n            SID        = 'S-1-5-7'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-8'                                                         = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\PROXY'\n            SID        = 'S-1-5-8'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-9'                                                         = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\ENTERPRISE DOMAIN CONTROLLERS'\n            SID        = 'S-1-5-9'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-10'                                                        = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\SELF'\n            SID        = 'S-1-5-10'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-11'                                                        = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\Authenticated Users'\n            SID        = 'S-1-5-11'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-12'                                                        = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\RESTRICTED'\n            SID        = 'S-1-5-12'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-13'                                                        = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\TERMINAL SERVER USER'\n            SID        = 'S-1-5-13'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-14'                                                        = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\REMOTE INTERACTIVE LOGON'\n            SID        = 'S-1-5-14'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-15'                                                        = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\This Organization'\n            SID        = 'S-1-5-15'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-17'                                                        = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\IUSR'\n            SID        = 'S-1-5-17'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-18'                                                        = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\SYSTEM'\n            SID        = 'S-1-5-18'\n            DomainName = ''\n            Type       = 'WellKnownAdministrative'\n            Error      = ''\n        }\n        'S-1-5-19'                                                        = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\LOCAL SERVICE'\n            SID        = 'S-1-5-19'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-20'                                                        = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\NETWORK SERVICE'\n            SID        = 'S-1-5-20'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-544'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Administrators'\n            SID        = 'S-1-5-32-544'\n            DomainName = ''\n            Type       = 'WellKnownAdministrative'\n            Error      = ''\n        }\n        'S-1-5-32-545'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Users'\n            SID        = 'S-1-5-32-545'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-546'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Guests'\n            SID        = 'S-1-5-32-546'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-547'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Power Users'\n            SID        = 'S-1-5-32-547'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-548'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Account Operators'\n            SID        = 'S-1-5-32-548'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-549'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Server Operators'\n            SID        = 'S-1-5-32-549'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-550'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Print Operators'\n            SID        = 'S-1-5-32-550'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-551'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Backup Operators'\n            SID        = 'S-1-5-32-551'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-552'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Replicators'\n            SID        = 'S-1-5-32-552'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-64-10'                                                     = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\NTLM Authentication'\n            SID        = 'S-1-5-64-10'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-64-14'                                                     = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\SChannel Authentication'\n            SID        = 'S-1-5-64-14'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-64-21'                                                     = [PSCustomObject] @{\n            Name       = 'NT AUTHORITY\\Digest Authentication'\n            SID        = 'S-1-5-64-21'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-80'                                                        = [PSCustomObject] @{\n            Name       = 'NT SERVICE'\n            SID        = 'S-1-5-80'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-83-0'                                                      = [PSCustomObject] @{\n            Name       = 'NT VIRTUAL MACHINE\\Virtual Machines'\n            SID        = 'S-1-5-83-0'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-16-0'                                                        = [PSCustomObject] @{\n            Name       = 'Untrusted Mandatory Level'\n            SID        = 'S-1-16-0'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-16-4096'                                                     = [PSCustomObject] @{\n            Name       = 'Low Mandatory Level'\n            SID        = 'S-1-16-4096'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-16-8192'                                                     = [PSCustomObject] @{\n            Name       = 'Medium Mandatory Level'\n            SID        = 'S-1-16-8192'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-16-8448'                                                     = [PSCustomObject] @{\n            Name       = 'Medium Plus Mandatory Level'\n            SID        = 'S-1-16-8448'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-16-12288'                                                    = [PSCustomObject] @{\n            Name       = 'High Mandatory Level'\n            SID        = 'S-1-16-12288'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-16-16384'                                                    = [PSCustomObject] @{\n            Name       = 'System Mandatory Level'\n            SID        = 'S-1-16-16384'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-16-20480'                                                    = [PSCustomObject] @{\n            Name       = 'Protected Process Mandatory Level'\n            SID        = 'S-1-16-20480'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-16-28672'                                                    = [PSCustomObject] @{\n            Name       = 'Secure Process Mandatory Level'\n            SID        = 'S-1-16-28672'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-554'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Pre-Windows 2000 Compatible Access'\n            SID        = 'S-1-5-32-554'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-555'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Remote Desktop Users'\n            SID        = 'S-1-5-32-555'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-556'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Network Configuration Operators'\n            SID        = 'S-1-5-32-556'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-557'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Incoming Forest Trust Builders'\n            SID        = 'S-1-5-32-557'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-558'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Performance Monitor Users'\n            SID        = 'S-1-5-32-558'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-559'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Performance Log Users'\n            SID        = 'S-1-5-32-559'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-560'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Windows Authorization Access Group'\n            SID        = 'S-1-5-32-560'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-561'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Terminal Server License Servers'\n            SID        = 'S-1-5-32-561'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-562'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Distributed COM Users'\n            SID        = 'S-1-5-32-562'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-568'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\IIS_IUSRS'\n            SID        = 'S-1-5-32-568'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-569'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Cryptographic Operators'\n            SID        = 'S-1-5-32-569'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-573'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Event Log Readers'\n            SID        = 'S-1-5-32-573'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-574'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Certificate Service DCOM Access'\n            SID        = 'S-1-5-32-574'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-575'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\RDS Remote Access Servers'\n            SID        = 'S-1-5-32-575'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-576'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\RDS Endpoint Servers'\n            SID        = 'S-1-5-32-576'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-577'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\RDS Management Servers'\n            SID        = 'S-1-5-32-577'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-578'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Hyper-V Administrators'\n            SID        = 'S-1-5-32-578'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-579'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Access Control Assistance Operators'\n            SID        = 'S-1-5-32-579'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-32-580'                                                    = [PSCustomObject] @{\n            Name       = 'BUILTIN\\Remote Management Users'\n            SID        = 'S-1-5-32-580'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-90-0'                                                      = [PSCustomObject] @{\n            Name       = 'Window Manager\\Window Manager Group'\n            SID        = 'S-1-5-90-0'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-80-3139157870-2983391045-3678747466-658725712-1809340420'  = [PSCustomObject] @{\n            Name       = 'NT SERVICE\\WdiServiceHost'\n            SID        = 'S-1-5-80-3139157870-2983391045-3678747466-658725712-1809340420'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-80-3880718306-3832830129-1677859214-2598158968-1052248003' = [PSCustomObject] @{\n            Name       = 'NT SERVICE\\MSSQLSERVER'\n            SID        = 'S-1-5-80-3139157870-2983391045-3678747466-658725712-1809340420'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-80-344959196-2060754871-2302487193-2804545603-1466107430'  = [PSCustomObject] @{\n            Name       = 'NT SERVICE\\SQLSERVERAGENT'\n            SID        = 'S-1-5-80-344959196-2060754871-2302487193-2804545603-1466107430'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-80-2652535364-2169709536-2857650723-2622804123-1107741775' = [PSCustomObject] @{\n            Name       = 'NT SERVICE\\SQLTELEMETRY'\n            SID        = 'S-1-5-80-2652535364-2169709536-2857650723-2622804123-1107741775'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-80-3245704983-3664226991-764670653-2504430226-901976451'   = [PSCustomObject] @{\n            Name       = 'NT SERVICE\\ADSync'\n            SID        = 'S-1-5-80-3245704983-3664226991-764670653-2504430226-901976451'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n        'S-1-5-80-4215458991-2034252225-2287069555-1155419622-2701885083' = [PSCustomObject] @{\n            Name       = 'NT Service\\himds'\n            SID        = 'S-1-5-80-4215458991-2034252225-2287069555-1155419622-2701885083'\n            DomainName = ''\n            Type       = 'WellKnownGroup'\n            Error      = ''\n        }\n\n        # 'S-1-5-113'                                                      = [PSCustomObject] @{\n        #     Name       = 'NT AUTHORITY\\Local account'\n        #     SID        = 'S - 1 - 5 - 113'\n        #     DomainName = ''\n        #     Type       = 'WellKnownGroup'\n        #     Error      = ''\n        # }\n        # 'S-1-5-114'                                                      = [PSCustomObject] @{\n        #     Name       = 'NT AUTHORITY\\Local account and member of Administrators group'\n        #     SID        = 'S - 1 - 5 - 114'\n        #     DomainName = ''\n        #     Type       = 'WellKnownGroup'\n        #     Error      = ''\n        # }\n    }\n    foreach ($S in $SID) {\n        if ($OnlyWellKnownAdministrative) {\n            # In this case we only return very few high permissions, otherwise nothing\n            if ($WellKnownAdministrative[$S]) {\n                $WellKnownAdministrative[$S]\n            }\n        } elseif ($OnlyWellKnown) {\n            # In this case we only return well known cases, otherwise nothing\n            if ($wellKnownSIDs[$S]) {\n                $wellKnownSIDs[$S]\n            }\n        } else {\n            # In this case we return WellKnown, or try to resolve stuff\n            if ($wellKnownSIDs[$S]) {\n                $wellKnownSIDs[$S]\n            } else {\n                if ($DoNotResolve) {\n                    if ($S -like \"S-1-5-21-*-519\" -or $S -like \"S-1-5-21-*-512\" -or $S -like \"S-1-5-21-*-518\") {\n                        # Domain Admins / Enterprise Admins / Schema Admins\n                        [PSCustomObject] @{\n                            Name       = $S\n                            SID        = $S\n                            DomainName = '' # we don't know from SID which domain it is, without checking LDAP\n                            Type       = 'Administrative'\n                            Error      = ''\n                        }\n                    } else {\n                        # Return unchanged object\n                        [PSCustomObject] @{\n                            Name       = $S\n                            SID        = $S\n                            DomainName = ''\n                            Error      = ''\n                            Type       = 'NotAdministrative'\n                        }\n                    }\n                } else {\n                    if (-not $Script:LocalComputerSID) {\n                        $Script:LocalComputerSID = Get-LocalComputerSid\n                    }\n                    try {\n                        if ($S.Length -le 18) {\n                            $Type = 'NotAdministrative'\n                            $Name = (([System.Security.Principal.SecurityIdentifier]::new($S)).Translate([System.Security.Principal.NTAccount])).Value\n                            [PSCustomObject] @{\n                                Name       = $Name\n                                SID        = $S\n                                DomainName = ''\n                                Type       = $Type\n                                Error      = ''\n                            }\n                        } else {\n                            if ($S -like \"S-1-5-21-*-519\" -or $S -like \"S-1-5-21-*-512\" -or $S -like \"S-1-5-21-*-518\") {\n                                $Type = 'Administrative'\n                            } else {\n                                $Type = 'NotAdministrative'\n                            }\n                            $Name = (([System.Security.Principal.SecurityIdentifier]::new($S)).Translate([System.Security.Principal.NTAccount])).Value\n                            [PSCustomObject] @{\n                                Name       = $Name\n                                SID        = $S\n                                DomainName = if ($S -like \"$Script:LocalComputerSID*\") { '' } else { (ConvertFrom-NetbiosName -Identity $Name).DomainName }\n                                Type       = $Type\n                                Error      = ''\n                            }\n                        }\n                    } catch {\n                        # Return unchanged object\n                        [PSCustomObject] @{\n                            Name       = $S\n                            SID        = $S\n                            DomainName = ''\n                            Error      = $_.Exception.Message -replace [environment]::NewLine, ' '\n                            Type       = 'Unknown'\n                        }\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "Public/Converts/ConvertFrom-ScriptBlock.ps1",
    "content": "﻿function ConvertFrom-ScriptBlock {\n    <#\n    .SYNOPSIS\n    Converts a ScriptBlock into an array of strings, each representing a line of the script block.\n\n    .DESCRIPTION\n    This function takes a ScriptBlock as input and converts it into an array of strings, where each string represents a line of the script block.\n\n    .PARAMETER ScriptBlock\n    The ScriptBlock to be converted into an array of strings.\n\n    .EXAMPLE\n    ConvertFrom-ScriptBlock -ScriptBlock {\n        $Variable1 = \"Value1\"\n        $Variable2 = \"Value2\"\n        Write-Host \"Hello, World!\"\n    }\n\n    This example will output an array containing the following strings:\n    $Variable1 = \"Value1\"\n    $Variable2 = \"Value2\"\n    Write-Host \"Hello, World!\"\n\n    .NOTES\n    General notes\n    #>\n    [CmdletBinding()]\n    param(\n        [ScriptBlock] $ScriptBlock\n    )\n    [Array] $Output = foreach ($Line in $ScriptBlock.Ast.EndBlock.Statements.Extent) {\n        [string] $Line + [System.Environment]::NewLine\n    }\n    return $Output\n}"
  },
  {
    "path": "Public/Converts/ConvertFrom-X500Address.ps1",
    "content": "function ConvertFrom-X500Address {\n    <#\n    .SYNOPSIS\n    Converts an X500 address to a readable email address.\n\n    .DESCRIPTION\n    This function converts an X500 address to a readable email address by removing unnecessary characters and formatting it properly.\n\n    .PARAMETER IMCEAEXString\n    The X500 address string to be converted.\n\n    .PARAMETER Full\n    Indicates whether to return the full email address or just the username part.\n\n    .EXAMPLE\n    By default returns string without @evotec.pl in the end. This is because the string from NDR needs domain name removed to be able to add it back to Exchange\n    ConvertFrom-X500Address -IMCEAEXString 'IMCEAEX-_o=AD_ou=Exchange+20Administrative+20Group+20+28FYDIBOHF23SPDLT+29_cn=Recipients_cn=5209048016da47689b4421790ad1763f-EVOTEC+20PL+20Recepcja+20G@evotec.pl'\n    ConvertFrom-X500Address -IMCEAEXString 'IMCEAEX-_o=AD_ou=Exchange+20Administrative+20Group+20+28FYDIBOHF23SPDLT+29_cn=Recipients_cn=8bcad655e07c46788fe1f796162cd87f-EVOTEC+20PL+20Recepcja+20G@evotec.pl'\n    ConvertFrom-X500Address -IMCEAEXString 'IMCEAEX-_o=AD_ou=Exchange+20Administrative+20Group+20+28FYDIBOHF23SPDLT+29_cn=Recipients_cn=0d4540e9a8f845d798625c9c0ad753bf-Test-All-Group@evotec.pl'\n    ConvertFrom-X500Address -IMCEAEXString 'IMCEAEX-_o=AD_ou=Exchange+20Administrative+20Group+20+28FYDIBOHF23SPDLT+29_cn=Recipients_cn=0d4540e9a8f845d798625c9c0ad753bf-Test-All-Group@evotec.pl'\n\n    .EXAMPLE\n    ConvertFrom-X500Address -IMCEAEXString 'IMCEAEX-_o=AD_ou=Exchange+20Administrative+20Group+20+28FYDIBOHF23SPDLT+29_cn=Recipients_cn=5209048016da47689b4421790ad1763f-EVOTEC+20PL+20Recepcja+20G@evotec.pl' -Full\n    ConvertFrom-X500Address -IMCEAEXString 'IMCEAEX-_o=AD_ou=Exchange+20Administrative+20Group+20+28FYDIBOHF23SPDLT+29_cn=Recipients_cn=8bcad655e07c46788fe1f796162cd87f-EVOTEC+20PL+20Recepcja+20G@evotec.pl' -Full\n    ConvertFrom-X500Address -IMCEAEXString 'IMCEAEX-_o=AD_ou=Exchange+20Administrative+20Group+20+28FYDIBOHF23SPDLT+29_cn=Recipients_cn=0d4540e9a8f845d798625c9c0ad753bf-Test-All-Group@evotec.pl' -Full\n    ConvertFrom-X500Address -IMCEAEXString 'IMCEAEX-_o=AD_ou=Exchange+20Administrative+20Group+20+28FYDIBOHF23SPDLT+29_cn=Recipients_cn=0d4540e9a8f845d798625c9c0ad753bf-Test-All-Group@evotec.pl' -Full\n    #>\n    param(\n        [string] $IMCEAEXString,\n        [switch] $Full\n    )\n    $Final = $IMCEAEXString.Replace(\"IMCEAEX-\", \"\").Replace(\"_\", \"/\").Replace(\"+20\", \" \").Replace(\"+28\", \"(\").Replace(\"+29\", \")\").Replace(\"+2E\", \".\").Replace(\"+2C\", \",\").Replace(\"+5F\", \"_\")\n    if ($Full) {\n        return $Final\n    } else {\n        return ($Final -split '@')[0]\n    }\n}"
  },
  {
    "path": "Public/Converts/ConvertTo-DistinguishedName.ps1",
    "content": "﻿function ConvertTo-DistinguishedName {\n    <#\n    .SYNOPSIS\n    Converts CanonicalName to DistinguishedName\n\n    .DESCRIPTION\n    Converts CanonicalName to DistinguishedName for 3 different options\n\n    .PARAMETER CanonicalName\n    One or multiple canonical names\n\n    .PARAMETER ToOU\n    Converts CanonicalName to OrganizationalUnit DistinguishedName\n\n    .PARAMETER ToObject\n    Converts CanonicalName to Full Object DistinguishedName\n\n    .PARAMETER ToDomain\n    Converts CanonicalName to Domain DistinguishedName\n\n    .EXAMPLE\n\n    $CanonicalObjects = @(\n    'ad.evotec.xyz/Production/Groups/Security/ITR03_AD Admins'\n    'ad.evotec.xyz/Production/Accounts/Special/SADM Testing 2'\n    )\n    $CanonicalOU = @(\n        'ad.evotec.xyz/Production/Groups/Security/NetworkAdministration'\n        'ad.evotec.xyz/Production'\n    )\n\n    $CanonicalDomain = @(\n        'ad.evotec.xyz/Production/Groups/Security/ITR03_AD Admins'\n        'ad.evotec.pl'\n        'ad.evotec.xyz'\n        'test.evotec.pl'\n        'ad.evotec.xyz/Production'\n    )\n    $CanonicalObjects | ConvertTo-DistinguishedName -ToObject\n    $CanonicalOU | ConvertTo-DistinguishedName -ToOU\n    $CanonicalDomain | ConvertTo-DistinguishedName -ToDomain\n\n    Output:\n    CN=ITR03_AD Admins,OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz\n    CN=SADM Testing 2,OU=Special,OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz\n    Output2:\n    OU=NetworkAdministration,OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz\n    OU=Production,DC=ad,DC=evotec,DC=xyz\n    Output3:\n    DC=ad,DC=evotec,DC=xyz\n    DC=ad,DC=evotec,DC=pl\n    DC=ad,DC=evotec,DC=xyz\n    DC=test,DC=evotec,DC=pl\n    DC=ad,DC=evotec,DC=xyz\n\n    .NOTES\n    General notes\n    #>\n    [cmdletBinding(DefaultParameterSetName = 'ToDomain')]\n    param(\n        [Parameter(ParameterSetName = 'ToOU')]\n        [Parameter(ParameterSetName = 'ToObject')]\n        [Parameter(ParameterSetName = 'ToDomain')]\n        [alias('Identity', 'CN')][Parameter(ValueFromPipeline, Mandatory, ValueFromPipelineByPropertyName, Position = 0)][string[]] $CanonicalName,\n        [Parameter(ParameterSetName = 'ToOU')][switch] $ToOU,\n        [Parameter(ParameterSetName = 'ToObject')][switch] $ToObject,\n        [Parameter(ParameterSetName = 'ToDomain')][switch] $ToDomain\n    )\n    Process {\n        foreach ($CN in $CanonicalName) {\n            if ($ToObject) {\n                $ADObject = $CN.Replace(',', '\\,').Split('/')\n                [string]$DN = \"CN=\" + $ADObject[$ADObject.count - 1]\n                for ($i = $ADObject.count - 2; $i -ge 1; $i--) {\n                    $DN += \",OU=\" + $ADObject[$i]\n                }\n                $ADObject[0].split(\".\") | ForEach-Object {\n                    $DN += \",DC=\" + $_\n                }\n            } elseif ($ToOU) {\n                $ADObject = $CN.Replace(',', '\\,').Split('/')\n                [string]$DN = \"OU=\" + $ADObject[$ADObject.count - 1]\n                for ($i = $ADObject.count - 2; $i -ge 1; $i--) {\n                    $DN += \",OU=\" + $ADObject[$i]\n                }\n                $ADObject[0].split(\".\") | ForEach-Object {\n                    $DN += \",DC=\" + $_\n                }\n            } else {\n                $ADObject = $CN.Replace(',', '\\,').Split('/')\n                # Assemble the DN by replacing\n                $DN = 'DC=' + $ADObject[0].Replace('.', ',DC=')\n            }\n            $DN\n        }\n    }\n}"
  },
  {
    "path": "Public/Converts/ConvertTo-FlatHashTable.ps1",
    "content": "﻿function ConvertTo-FlatHashtable {\n    <#\n    .SYNOPSIS\n    Converts nested hashtable into flat hashtable using delimiter\n\n    .DESCRIPTION\n    Converts nested hashtable into flat hashtable using delimiter\n\n    .PARAMETER InputObject\n    Ordered Dictionary or Hashtable\n\n    .PARAMETER Delimiter\n    Delimiter for key name when merging nested hashtables. By default colon is used\n\n    .EXAMPLE\n    ConvertTo-FlatHashTable -InputObject ([ordered] @{\n        RootEntry       = 'OK1'\n        Parent          = @{\n            Child1 = 'OK2'\n            Child2 = 'Ok3'\n        }\n        ParentDifferent = @{\n            Child7 = 'NotOk'\n            Child8 = @{\n                Child10 = 'OKLetsSee'\n                Child11 = @{\n                    SpecialCase = 'Oooop'\n                }\n            }\n        }\n    }) | Format-Table *\n\n    .NOTES\n    General notes\n    #>\n    [CmdletBinding()]\n    param(\n        [System.Collections.IDictionary] $InputObject,\n        [string] $Delimiter = ':',\n        [Parameter(DontShow)][string] $Name\n    )\n    Begin {\n        $Output = [ordered] @{}\n    }\n    Process {\n        foreach ($Key in $InputObject.Keys) {\n            if ($Name) {\n                $MergedName = \"$Name$($Delimiter)$Key\"\n            } else {\n                $MergedName = $Key\n            }\n            if ($InputObject[$Key] -is [System.Collections.IDictionary]) {\n\n                $Found = ConvertTo-FlatHashtable -InputObject $InputObject[$Key] -Name $MergedName\n                $Output = $Output + $Found\n            } else {\n                $Output[$MergedName] = $InputObject[$Key]\n            }\n        }\n    }\n    End {\n        $Output\n    }\n}"
  },
  {
    "path": "Public/Converts/ConvertTo-FlatObject.ps1",
    "content": "﻿Function ConvertTo-FlatObject {\n    <#\n    .SYNOPSIS\n    Flattends a nested object into a single level object.\n\n    .DESCRIPTION\n    Flattends a nested object into a single level object.\n\n    .PARAMETER Objects\n    The object (or objects) to be flatten.\n\n    .PARAMETER Separator\n    The separator used between the recursive property names\n\n    .PARAMETER Base\n    The first index name of an embedded array:\n    - 1, arrays will be 1 based: <Parent>.1, <Parent>.2, <Parent>.3, …\n    - 0, arrays will be 0 based: <Parent>.0, <Parent>.1, <Parent>.2, …\n    - \"\", the first item in an array will be unnamed and than followed with 1: <Parent>, <Parent>.1, <Parent>.2, …\n\n    .PARAMETER Depth\n    The maximal depth of flattening a recursive property. Any negative value will result in an unlimited depth and could cause a infinitive loop.\n\n    .PARAMETER Uncut\n    The maximal depth of flattening a recursive property. Any negative value will result in an unlimited depth and could cause a infinitive loop.\n\n    .PARAMETER ExcludeProperty\n    The propertys to be excluded from the output.\n\n    .EXAMPLE\n    $Object3 = [PSCustomObject] @{\n        \"Name\"    = \"Przemyslaw Klys\"\n        \"Age\"     = \"30\"\n        \"Address\" = @{\n            \"Street\"  = \"Kwiatowa\"\n            \"City\"    = \"Warszawa\"\n\n            \"Country\" = [ordered] @{\n                \"Name\" = \"Poland\"\n            }\n            List      = @(\n                [PSCustomObject] @{\n                    \"Name\" = \"Adam Klys\"\n                    \"Age\"  = \"32\"\n                }\n                [PSCustomObject] @{\n                    \"Name\" = \"Justyna Klys\"\n                    \"Age\"  = \"33\"\n                }\n                [PSCustomObject] @{\n                    \"Name\" = \"Justyna Klys\"\n                    \"Age\"  = 30\n                }\n                [PSCustomObject] @{\n                    \"Name\" = \"Justyna Klys\"\n                    \"Age\"  = $null\n                }\n            )\n        }\n        ListTest  = @(\n            [PSCustomObject] @{\n                \"Name\" = \"Sława Klys\"\n                \"Age\"  = \"33\"\n            }\n        )\n    }\n\n    $Object3 | ConvertTo-FlatObject\n\n    .NOTES\n    Based on https://powersnippets.com/convertto-flatobject/\n    #>\n    [CmdletBinding()]\n    Param (\n        [Parameter(ValueFromPipeLine)][Object[]]$Objects,\n        [String]$Separator = \".\",\n        [ValidateSet(\"\", 0, 1)]$Base = 1,\n        [int]$Depth = 5,\n        [string[]] $ExcludeProperty,\n        [Parameter(DontShow)][String[]]$Path,\n        [Parameter(DontShow)][System.Collections.IDictionary] $OutputObject\n    )\n    Begin {\n        $InputObjects = [System.Collections.Generic.List[Object]]::new()\n    }\n    Process {\n        foreach ($O in $Objects) {\n            if ($null -ne $O) {\n                $InputObjects.Add($O)\n            }\n        }\n    }\n    End {\n        If ($PSBoundParameters.ContainsKey(\"OutputObject\")) {\n            $Object = $InputObjects[0]\n            $Iterate = [ordered] @{}\n            if ($null -eq $Object) {\n                #Write-Verbose -Message \"ConvertTo-FlatObject - Object is null\"\n            } elseif ($Object.GetType().Name -in 'String', 'DateTime', 'TimeSpan', 'Version', 'Enum') {\n                $Object = $Object.ToString()\n            } elseif ($Depth) {\n                $Depth--\n                If ($Object -is [System.Collections.IDictionary]) {\n                    $Iterate = $Object\n                } elseif ($Object -is [Array] -or $Object -is [System.Collections.IEnumerable]) {\n                    $i = $Base\n                    foreach ($Item in $Object.GetEnumerator()) {\n                        $NewObject = [ordered] @{}\n                        If ($Item -is [System.Collections.IDictionary]) {\n                            foreach ($Key in $Item.Keys) {\n                                if ($Key -notin $ExcludeProperty) {\n                                    $NewObject[$Key] = $Item[$Key]\n                                }\n                            }\n                        } elseif ($Item -isnot [Array] -and $Item -isnot [System.Collections.IEnumerable]) {\n                            foreach ($Prop in $Item.PSObject.Properties) {\n                                if ($Prop.IsGettable -and $Prop.Name -notin $ExcludeProperty) {\n                                    $NewObject[\"$($Prop.Name)\"] = $Item.$($Prop.Name)\n                                }\n                            }\n                        } else {\n                            $NewObject = $Item\n                        }\n                        $Iterate[\"$i\"] = $NewObject\n                        $i += 1\n                    }\n                } else {\n                    foreach ($Prop in $Object.PSObject.Properties) {\n                        if ($Prop.IsGettable -and $Prop.Name -notin $ExcludeProperty) {\n                            $Iterate[\"$($Prop.Name)\"] = $Object.$($Prop.Name)\n                        }\n                    }\n                }\n            }\n            If ($Iterate.Keys.Count) {\n                foreach ($Key in $Iterate.Keys) {\n                    if ($Key -notin $ExcludeProperty) {\n                        ConvertTo-FlatObject -Objects @(, $Iterate[\"$Key\"]) -Separator $Separator -Base $Base -Depth $Depth -Path ($Path + $Key) -OutputObject $OutputObject -ExcludeProperty $ExcludeProperty\n                    }\n                }\n            } else {\n                $Property = $Path -Join $Separator\n                if ($Property) {\n                    # We only care if property is not empty\n                    if ($Object -is [System.Collections.IDictionary] -and $Object.Keys.Count -eq 0) {\n                        $OutputObject[$Property] = $null\n                    } else {\n                        $OutputObject[$Property] = $Object\n                    }\n                }\n            }\n        } elseif ($InputObjects.Count -gt 0) {\n            foreach ($ItemObject in $InputObjects) {\n                $OutputObject = [ordered]@{}\n                ConvertTo-FlatObject -Objects @(, $ItemObject) -Separator $Separator -Base $Base -Depth $Depth -Path $Path -OutputObject $OutputObject -ExcludeProperty $ExcludeProperty\n                [PSCustomObject] $OutputObject\n            }\n        }\n    }\n}"
  },
  {
    "path": "Public/Converts/ConvertTo-Identity.ps1",
    "content": "﻿function ConvertTo-Identity {\n    <#\n    .SYNOPSIS\n    Converts an identity to its corresponding information.\n\n    .DESCRIPTION\n    This function converts an identity to its corresponding information, such as Name, SID, Type, and Class. It retrieves information from Active Directory based on the provided identity.\n\n    .PARAMETER Identity\n    Specifies the identity to convert.\n\n    .PARAMETER ADAdministrativeGroups\n    Specifies the Active Directory administrative groups.\n\n    .PARAMETER Forest\n    Specifies the forest name.\n\n    .PARAMETER ExcludeDomains\n    Specifies the domains to exclude.\n\n    .PARAMETER IncludeDomains\n    Specifies the domains to include.\n\n    .PARAMETER ExtendedForestInformation\n    Specifies additional information about the forest.\n\n    .EXAMPLE\n    ConvertTo-Identity -Identity \"JohnDoe\" -Forest \"example.com\" -IncludeDomains \"domain1\", \"domain2\" -ExcludeDomains \"domain3\" -ADAdministrativeGroups $ADGroups -ExtendedForestInformation $ExtendedInfo\n    Converts the identity \"JohnDoe\" in the forest \"example.com\", including domains \"domain1\" and \"domain2\" while excluding \"domain3\", using the specified administrative groups and extended forest information.\n\n    .NOTES\n    File Name      : ConvertTo-Identity.ps1\n    Prerequisite   : This function requires Active Directory PowerShell module.\n    #>\n    [cmdletBinding()]\n    param(\n        [string] $Identity,\n        [System.Collections.IDictionary] $ADAdministrativeGroups,\n\n        [alias('ForestName')][string] $Forest,\n        [string[]] $ExcludeDomains,\n        [alias('Domain', 'Domains')][string[]] $IncludeDomains,\n        [System.Collections.IDictionary] $ExtendedForestInformation\n    )\n    Begin {\n        if (-not $ExtendedForestInformation) {\n            $ForestInformation = Get-WinADForestDetails -Extended -Forest $Forest -IncludeDomains $IncludeDomains -ExcludeDomains $ExcludeDomains -ExtendedForestInformation $ExtendedForestInformation\n        } else {\n            $ForestInformation = $ExtendedForestInformation\n        }\n        if (-not $ADAdministrativeGroups) {\n            $ADAdministrativeGroups = Get-ADADministrativeGroups -Type DomainAdmins, EnterpriseAdmins -Forest $Forest -IncludeDomains $IncludeDomains -ExcludeDomains $ExcludeDomains -ExtendedForestInformation $ExtendedForestInformation\n        }\n        if (-not $Script:GlobalCacheIdentity) {\n            $Script:GlobalCacheIdentity = @{ }\n        }\n    }\n    Process {\n        $AdministrativeGroup = $ADAdministrativeGroups['ByNetBIOS'][\"$($Identity)\"]\n        if ($AdministrativeGroup) {\n            [PSCustomObject] @{\n                Name  = $Identity\n                SID   = $AdministrativeGroup.SID.Value\n                Type  = 'Administrative'\n                Class = $AdministrativeGroup.ObjectClass\n                Error = ''\n            }\n        } else {\n            if ($Identity -like '*@*') {\n                Write-Warning \"ConvertTo-Identity - Not implemented.\"\n                #if ($Script:GlobalCacheIdentity[$Identity]) {\n                #    $Script:GlobalCacheIdentity[$Identity]\n                # } else {\n                #\n                #    $ADObject = Get-ADObject -Filter \"SamAccountName -eq '$($MyIdentity[1])'\" -Server $QueryServer -Properties AdminCount, CanonicalName, Name, sAMAccountName, DisplayName, DistinguishedName, ObjectClass, objectSid\n                #}\n            } elseif ($Identity -like '*\\*') {\n                if ($Script:GlobalCacheIdentity[$Identity]) {\n                    $Script:GlobalCacheIdentity[$Identity]\n                } else {\n                    $MyIdentity = $Identity.Split(\"\\\")\n                    $DNSRoot = $ForestInformation['DomainsExtendedNetBIOS'][$($MyIdentity[0])]['DNSRoot']\n                    $QueryServer = $ForestInformation['QueryServers'][$DNSRoot]['HostName'][0]\n                    $ADObject = Get-ADObject -Filter \"SamAccountName -eq '$($MyIdentity[1])'\" -Server $QueryServer -Properties AdminCount, CanonicalName, Name, sAMAccountName, DisplayName, DistinguishedName, ObjectClass, objectSid\n                    <#\n                    AdminCount        : 1\n                    CanonicalName     : ad.evotec.xyz/Production/Users/Przemysław Kłys\n                    DisplayName       : Przemysław Kłys\n                    DistinguishedName : CN=Przemysław Kłys,OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz\n                    Name              : Przemysław Kłys\n                    ObjectClass       : user\n                    ObjectGUID        : b328932a-857f-4af1-b9d0-35578aa20d22\n                    objectSid         : S-1-5-21-853615985-2870445339-3163598659-1105\n                    sAMAccountName    : przemyslaw.klys\n                    #>\n\n                    if ($ADObject) {\n                        $Script:GlobalCacheIdentity[$Identity] = [PSCustomObject] @{\n                            Name  = $Identity\n                            SID   = $ADObject.objectSid.Value\n                            Type  = 'NotAdministrative'\n                            Class = $AdObject.ObjectClass\n                            Error = ''\n                        }\n                        $Script:GlobalCacheIdentity[$Identity]\n                    } else {\n                        [PSCustomObject] @{\n                            Name  = $Identity\n                            SID   = $Identity\n                            Type  = 'Unknown'\n                            Class = 'unknown'\n                            Error = 'Object not found.'\n                        }\n                    }\n                }\n                #\n            } elseif ($Identity -like '*-*-*-*') {\n                $Data = ConvertFrom-SID -sid $Identity\n                if ($Data) {\n                    if ($Data.Error) {\n                        [PSCustomObject] @{\n                            Name  = $Data.Name\n                            SID   = $Data.Sid\n                            Type  = $Data.Type\n                            Class = 'unknown'\n                            Error = $Data.Error\n                        }\n                    } else {\n                        # If it's not an error we still need to check whether translated SID is administrative or not\n                        $AdministrativeGroup = $ADAdministrativeGroups['ByNetBIOS'][\"$($Data.Name)\"]\n                        if ($AdministrativeGroup) {\n                            [PSCustomObject] @{\n                                Name  = $Data.Name\n                                SID   = $AdministrativeGroup.SID.Value\n                                Type  = 'Administrative'\n                                Class = $AdministrativeGroup.ObjectClass\n                                Error = ''\n                            }\n                        } else {\n                            [PSCustomObject] @{\n                                Name  = $Data.Name\n                                SID   = $Data.Sid\n                                Type  = $Data.Type\n                                Class = ''\n                                Error = $Data.Error\n                            }\n                        }\n                    }\n                } else {\n                    [PSCustomObject] @{\n                        Name  = $Identity\n                        SID   = $Identity\n                        Type  = 'Unknown'\n                        Class = 'unknown'\n                        Error = 'SID not found'\n                    }\n                }\n                <#\n                Name  SID   Error                                                                                          Type\n                ----  ---   -----                                                                                          ----\n                1-2-3 1-2-3 Exception calling \".ctor\" with \"1\" argument(s): \"Value was invalid....                         Unknown\n                #>\n            } else {\n                [PSCustomObject] @{\n                    Name  = $Identity\n                    SID   = $Identity\n                    Type  = 'Unknown'\n                    Class = 'unknown'\n                    Error = 'Identity unknown'\n                }\n            }\n        }\n    }\n    End {\n\n    }\n}"
  },
  {
    "path": "Public/Converts/ConvertTo-ImmutableID.ps1",
    "content": "function ConvertTo-ImmutableID {\n    <#\n    .SYNOPSIS\n    Converts an Active Directory user's ObjectGUID to an ImmutableID.\n\n    .DESCRIPTION\n    This function takes an Active Directory user object or a GUID as input and converts the ObjectGUID to an ImmutableID, which is commonly used in Azure AD.\n\n    .PARAMETER User\n    Specifies the Active Directory user object to convert. This parameter is mutually exclusive with the 'ObjectGUID' parameter.\n\n    .PARAMETER ObjectGUID\n    Specifies the GUID to convert to ImmutableID. This parameter is mutually exclusive with the 'User' parameter.\n\n    .EXAMPLE\n    ConvertTo-ImmutableID -User $ADUser\n    Converts the ObjectGUID of the specified Active Directory user to an ImmutableID.\n\n    .EXAMPLE\n    ConvertTo-ImmutableID -ObjectGUID \"12345678-1234-1234-1234-1234567890AB\"\n    Converts the specified GUID to an ImmutableID.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [Parameter(Mandatory = $false, ParameterSetName = 'User')]\n        [alias('ADuser')]\n        [Microsoft.ActiveDirectory.Management.ADAccount] $User,\n\n        [Parameter(Mandatory = $false, ParameterSetName = 'Guid')]\n        [alias('GUID')]\n        [string] $ObjectGUID\n    )\n    if ($User) {\n        if ($User.ObjectGUID) {\n            $ObjectGUID = $User.ObjectGuid\n        }\n    }\n    if ($ObjectGUID) {\n        $ImmutableID = [System.Convert]::ToBase64String(($User.ObjectGUID).ToByteArray())\n        return $ImmutableID\n    }\n    return\n}"
  },
  {
    "path": "Public/Converts/ConvertTo-JsonLiteral.ps1",
    "content": "﻿function ConvertTo-JsonLiteral {\n    <#\n    .SYNOPSIS\n    Converts an object to a JSON-formatted string.\n\n    .DESCRIPTION\n    The ConvertTo-Json cmdlet converts any object to a string in JavaScript Object Notation (JSON) format. The properties are converted to field names, the field values are converted to property values, and the methods are removed.\n\n    .PARAMETER Object\n    Specifies the objects to convert to JSON format. Enter a variable that contains the objects, or type a command or expression that gets the objects. You can also pipe an object to ConvertTo-JsonLiteral\n\n    .PARAMETER Depth\n    Specifies how many levels of contained objects are included in the JSON representation. The default value is 0.\n\n    .PARAMETER AsArray\n    Outputs the object in array brackets, even if the input is a single object.\n\n    .PARAMETER DateTimeFormat\n    Changes DateTime string format. Default \"yyyy-MM-dd HH:mm:ss\"\n\n    .PARAMETER NumberAsString\n    Provides an alternative serialization option that converts all numbers to their string representation.\n\n    .PARAMETER BoolAsString\n    Provides an alternative serialization option that converts all bool to their string representation.\n\n    .PARAMETER PropertyName\n    Uses PropertyNames provided by user (only works with Force)\n\n    .PARAMETER NewLineFormat\n    Provides a way to configure how new lines are converted for property names\n\n    .PARAMETER NewLineFormatProperty\n    Provides a way to configure how new lines are converted for values\n\n    .PARAMETER PropertyName\n    Allows passing property names to be used for custom objects (hashtables and alike are unaffected)\n\n    .PARAMETER ArrayJoin\n    Forces any array to be a string regardless of depth level\n\n    .PARAMETER ArrayJoinString\n    Uses defined string or char for array join. By default it uses comma with a space when used.\n\n    .PARAMETER Force\n    Forces using property names from first object or given thru PropertyName parameter\n\n    .EXAMPLE\n    Get-Process | Select-Object -First 2 | ConvertTo-JsonLiteral\n\n    .EXAMPLE\n    Get-Process | Select-Object -First 2 | ConvertTo-JsonLiteral -Depth 3\n\n    .EXAMPLE\n    Get-Process | Select-Object -First 2 | ConvertTo-JsonLiteral -NewLineFormat $NewLineFormat = @{\n        NewLineCarriage = '\\r\\n'\n        NewLine         = \"\\n\"\n        Carriage        = \"\\r\"\n    } -NumberAsString -BoolAsString\n\n    .EXAMPLE\n    Get-Process | Select-Object -First 2 | ConvertTo-JsonLiteral -NumberAsString -BoolAsString -DateTimeFormat \"yyyy-MM-dd HH:mm:ss\"\n\n    .EXAMPLE\n    # Keep in mind this advanced replace will break ConvertFrom-Json, but it's sometimes useful for projects like PSWriteHTML\n    Get-Process | Select-Object -First 2 | ConvertTo-JsonLiteral -NewLineFormat $NewLineFormat = @{\n        NewLineCarriage = '\\r\\n'\n        NewLine         = \"\\n\"\n        Carriage        = \"\\r\"\n    } -NumberAsString -BoolAsString -AdvancedReplace @{ '.' = '\\.'; '$' = '\\$' }\n\n    .NOTES\n    General notes\n    #>\n    [cmdletBinding()]\n    param(\n        [alias('InputObject')][Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName, Position = 0, Mandatory)][Array] $Object,\n        [int] $Depth,\n        [switch] $AsArray,\n        [string] $DateTimeFormat = \"yyyy-MM-dd HH:mm:ss\",\n        [switch] $NumberAsString,\n        [switch] $BoolAsString,\n        [System.Collections.IDictionary] $NewLineFormat = @{\n            NewLineCarriage = '\\r\\n'\n            NewLine         = \"\\n\"\n            Carriage        = \"\\r\"\n        },\n        [System.Collections.IDictionary] $NewLineFormatProperty = @{\n            NewLineCarriage = '\\r\\n'\n            NewLine         = \"\\n\"\n            Carriage        = \"\\r\"\n        },\n        [System.Collections.IDictionary] $AdvancedReplace,\n        [string] $ArrayJoinString,\n        [switch] $ArrayJoin,\n        [string[]]$PropertyName,\n        [switch] $Force\n    )\n    Begin {\n        $TextBuilder = [System.Text.StringBuilder]::new()\n        $CountObjects = 0\n        filter IsNumeric() {\n            return $_ -is [byte] -or $_ -is [int16] -or $_ -is [int32] -or $_ -is [int64]  `\n                -or $_ -is [sbyte] -or $_ -is [uint16] -or $_ -is [uint32] -or $_ -is [uint64] `\n                -or $_ -is [float] -or $_ -is [double] -or $_ -is [decimal]\n        }\n        filter IsOfType() {\n            return $_ -is [bool] -or $_ -is [char] -or $_ -is [datetime] -or $_ -is [string] `\n                -or $_ -is [timespan] -or $_ -is [URI] `\n                -or $_ -is [byte] -or $_ -is [int16] -or $_ -is [int32] -or $_ -is [int64] `\n                -or $_ -is [sbyte] -or $_ -is [uint16] -or $_ -is [uint32] -or $_ -is [uint64] `\n                -or $_ -is [float] -or $_ -is [double] -or $_ -is [decimal]\n        }\n        [int] $MaxDepth = $Depth\n        [int] $InitialDepth = 0\n    }\n    Process {\n        for ($a = 0; $a -lt $Object.Count; $a++) {\n            $CountObjects++\n            if ($CountObjects -gt 1) {\n                $null = $TextBuilder.Append(',')\n            }\n            if ($Object[$a] -is [System.Collections.IDictionary]) {\n                # Push to TEXT the same as [PSCustomObject]\n                $null = $TextBuilder.AppendLine(\"{\")\n                for ($i = 0; $i -lt ($Object[$a].Keys).Count; $i++) {\n                    $Property = ([string[]]$Object[$a].Keys)[$i] #.Replace('\\', \"\\\\\").Replace('\"', '\\\"')\n                    $DisplayProperty = $Property.Replace('\\', \"\\\\\").Replace('\"', '\\\"').Replace([System.Environment]::NewLine, $NewLineFormatProperty.NewLineCarriage).Replace(\"`n\", $NewLineFormatProperty.NewLine).Replace(\"`r\", $NewLineFormatProperty.Carriage)\n                    $null = $TextBuilder.Append(\"`\"$DisplayProperty`\":\")\n                    $Value = ConvertTo-StringByType -Value $Object[$a][$Property] -DateTimeFormat $DateTimeFormat -NumberAsString:$NumberAsString -BoolAsString:$BoolAsString -Depth $InitialDepth -MaxDepth $MaxDepth -TextBuilder $TextBuilder -NewLineFormat $NewLineFormat -NewLineFormatProperty $NewLineFormatProperty -Force:$Force -ArrayJoin:$ArrayJoin -ArrayJoinString $ArrayJoinString -AdvancedReplace $AdvancedReplace\n                    $null = $TextBuilder.Append(\"$Value\")\n                    if ($i -ne ($Object[$a].Keys).Count - 1) {\n                        $null = $TextBuilder.AppendLine(',')\n                    }\n                }\n                $null = $TextBuilder.Append(\"}\")\n            } elseif ($Object[$a] | IsOfType) {\n                $Value = ConvertTo-StringByType -Value $Object[$a] -DateTimeFormat $DateTimeFormat -NumberAsString:$NumberAsString -BoolAsString:$BoolAsString -Depth $InitialDepth -MaxDepth $MaxDepth -TextBuilder $TextBuilder -NewLineFormat $NewLineFormat -NewLineFormatProperty $NewLineFormatProperty -Force:$Force -ArrayJoin:$ArrayJoin -ArrayJoinString $ArrayJoinString -AdvancedReplace $AdvancedReplace\n                $null = $TextBuilder.Append($Value)\n            } else {\n                $null = $TextBuilder.AppendLine(\"{\")\n                if ($Force -and -not $PropertyName) {\n                    $PropertyName = $Object[0].PSObject.Properties.Name\n                } elseif ($Force -and $PropertyName) {\n\n                } else {\n                    $PropertyName = $Object[$a].PSObject.Properties.Name\n                }\n                $PropertyCount = 0\n                foreach ($Property in $PropertyName) {\n                    $PropertyCount++\n                    $DisplayProperty = $Property.Replace('\\', \"\\\\\").Replace('\"', '\\\"').Replace([System.Environment]::NewLine, $NewLineFormatProperty.NewLineCarriage).Replace(\"`n\", $NewLineFormatProperty.NewLine).Replace(\"`r\", $NewLineFormatProperty.Carriage)\n                    $null = $TextBuilder.Append(\"`\"$DisplayProperty`\":\")\n                    $Value = ConvertTo-StringByType -Value $Object[$a].$Property -DateTimeFormat $DateTimeFormat -NumberAsString:$NumberAsString -BoolAsString:$BoolAsString -Depth $InitialDepth -MaxDepth $MaxDepth -TextBuilder $TextBuilder -NewLineFormat $NewLineFormat -NewLineFormatProperty $NewLineFormatProperty -Force:$Force -ArrayJoin:$ArrayJoin -ArrayJoinString $ArrayJoinString -AdvancedReplace $AdvancedReplace\n                    # Push to Text\n                    $null = $TextBuilder.Append(\"$Value\")\n                    if ($PropertyCount -ne $PropertyName.Count) {\n                        $null = $TextBuilder.AppendLine(',')\n                    }\n                }\n                $null = $TextBuilder.Append(\"}\")\n            }\n            $InitialDepth = 0\n        }\n    }\n    End {\n        if ($CountObjects -gt 1 -or $AsArray) {\n            \"[$($TextBuilder.ToString())]\"\n        } else {\n            $TextBuilder.ToString()\n        }\n    }\n}"
  },
  {
    "path": "Public/Converts/ConvertTo-NormalizedString.ps1",
    "content": "﻿function ConvertTo-NormalizedString {\n    <#\n    .SYNOPSIS\n    Converts a string to a normalized string\n\n    .DESCRIPTION\n    Converts a string to a normalized string\n\n    .PARAMETER String\n    The string to convert\n\n    .EXAMPLE\n    ConvertTo-NormalizedString -String \"café\"\n\n    .EXAMPLE\n    \"café\" | ConvertTo-NormalizedString\n\n    .EXAMPLE\n    ConvertTo-NormalizedString -String \"café\"\n    \"café\" | ConvertTo-NormalizedString\n    'Helène' | ConvertTo-NormalizedString\n    \"Przemysław Kłys and Helène\" | ConvertTo-NormalizedString\n\n    .EXAMPLE\n    \"äöüß\" | ConvertTo-NormalizedString\n    ConvertTo-NormalizedString -String \"café\"\n    \"café\" | ConvertTo-NormalizedString\n    'Helène' | ConvertTo-NormalizedString\n    \"Przemysław Kłys and Helène\" | ConvertTo-NormalizedString\n    \"kłys\" | ConvertTo-NormalizedString\n    \"ąęćśł\" | ConvertTo-NormalizedString\n    \"Michael Roßbach\" | ConvertTo-NormalizedString\n    \"öüóőúéáűí\" | ConvertTo-NormalizedString\n    \"ß\" | ConvertTo-NormalizedString\n    \"Un été de Raphaël\" | ConvertTo-NormalizedString\n    (\"äâûê\", \"éèà\", \"ùçä\") | ConvertTo-NormalizedString\n    \"Fore ðære mærðe…\" | ConvertTo-NormalizedString\n    \"ABC-abc-ČŠŽ-čšž\" | ConvertTo-NormalizedString\n    \"Æ×Þ°±ß…\" | ConvertTo-NormalizedString\n\n    .NOTES\n    General notes\n    #>#\n    [CmdletBinding()]\n    param(\n        [parameter(ValueFromPipeline)][string[]] $String,\n        [switch] $Simplify\n    )\n    Begin {\n        $SpecialCasesGerman = @{\n            [char] \"ä\" = \"a\"\n            [char] \"ö\" = \"o\"\n            [char] \"ü\" = \"u\"\n            [char] \"ß\" = \"ss\"\n            [char] \"Ö\" = \"O\"\n            [char] \"Ü\" = \"U\"\n            [char] \"Ä\" = \"A\"\n        }\n        $SpecialCasesGermanGramatical = @{\n            [char] \"ä\" = \"ae\"\n            [char] \"ö\" = \"oe\"\n            [char] \"ü\" = \"ue\"\n            [char] \"ß\" = \"ss\"\n            [char] \"Ö\" = \"Oe\"\n            [char] \"Ü\" = \"Ue\"\n            [char] \"Ä\" = \"Ae\"\n        }\n\n        $SpecialCases = @{\n            #[char]\"Ä\" = \"A\"\n            #[char]\"Ä\" = \"Ae\"\n            #[char]\"Ö\" = \"Oe\"\n            #[char]\"Ö\" = \"O\"\n            #[char]\"Ü\" = \"Ue\"\n            #[char]\"Ü\" = \"U\"\n            #[char]\"ä\" = \"a\"\n            #[char]\"ä\" = \"ae\"\n            #[char]\"ö\" = \"oe\"\n            #[char]\"ö\" = \"o\"\n            #[char]\"ü\" = \"ue\"\n            #[char]\"ü\" = \"u\"\n            #[char]'ß' = 'ss'\n            [char]\"ø\" = \"o\"\n            [char]\"Ø\" = \"O\"\n            [char]\"Å\" = \"A\"\n            [char]'ð' = 'd'\n            [char]'Æ' = 'AE'\n            [char]'æ' = 'ae'\n            [char]'Þ' = 'TH'\n            [char]'þ' = 'th'\n            [char]'×' = 'X'\n            [char]'°' = 'o'\n            [char]'±' = 'p'\n            [char]'ç' = 'c'\n            [char]'Ç' = 'C'\n            [char]\"…\" = \"...\"\n            [char]\"ï\" = \"i\"\n            [char]\"Ï\" = \"I\"\n            [char]\"ű\" = \"u\"\n            [char]\"ő\" = \"o\"\n            [char]\"á\" = \"a\"\n            [char]\"é\" = \"e\"\n            [char]\"í\" = \"i\"\n            [char]\"ó\" = \"o\"\n            [char]\"ú\" = \"u\"\n            [char]\"ý\" = \"y\"\n            [char]\"ĺ\" = \"l\"\n            [char]\"ŕ\" = \"r\"\n            [char]\"č\" = \"c\"\n            [char]\"ď\" = \"d\"\n            [char]\"ľ\" = \"l\"\n            [char]\"ň\" = \"n\"\n            [char]\"š\" = \"s\"\n            [char]\"ť\" = \"t\"\n            [char]\"ž\" = \"z\"\n            [char]\"ô\" = \"o\"\n            [char]\"ą\" = \"a\"\n            [char]\"ę\" = \"e\"\n            [char]\"è\" = \"e\"\n            [char]\"ć\" = \"c\"\n            [char]\"ś\" = \"s\"\n            [char]\"ź\" = \"z\"\n            [char]\"ł\" = \"l\"\n            [char]\"ń\" = \"n\"\n            [char]\"Ű\" = \"U\"\n            [char]\"Ő\" = \"O\"\n            [char]\"Á\" = \"A\"\n            [char]\"É\" = \"E\"\n            [char]\"Í\" = \"I\"\n            [char]\"Ó\" = \"O\"\n            [char]\"Ú\" = \"U\"\n            [char]\"Ý\" = \"Y\"\n            [char]\"Ĺ\" = \"L\"\n            [char]\"Ŕ\" = \"R\"\n            [char]\"Č\" = \"C\"\n            [char]\"Ď\" = \"D\"\n            [char]\"Ľ\" = \"L\"\n            [char]\"Ň\" = \"N\"\n            [char]\"Š\" = \"S\"\n            [char]\"Ť\" = \"T\"\n            [char]\"Ž\" = \"Z\"\n            [char]\"Ô\" = \"O\"\n            [char]\"Ą\" = \"A\"\n            [char]\"Ę\" = \"E\"\n            [char]\"Ć\" = \"C\"\n            [char]\"Ś\" = \"S\"\n            [char]\"Ź\" = \"Z\"\n            [char]\"Ł\" = \"L\"\n            [char]\"Ń\" = \"N\"\n            \"_\"       = \" \"\n        }\n    }\n    Process {\n        foreach ($S in $String) {\n            # First replace special cases\n            $sb = [System.Text.StringBuilder]::new()\n            foreach ($Char in $S.ToCharArray()) {\n                if ($Simplify -and $SpecialCasesGerman.ContainsKey($Char)) {\n                    [void] $sb.Append($SpecialCasesGerman[$Char])\n                } elseif ($SpecialCasesGermanGramatical.ContainsKey($Char)) {\n                    [void] $sb.Append($SpecialCasesGermanGramatical[$Char])\n                } elseif ($SpecialCases.ContainsKey($Char)) {\n                    [void] $sb.Append($SpecialCases[$Char])\n                } else {\n                    [void] $sb.Append($Char)\n                }\n            }\n            $S = $sb.ToString()\n            # Then normalize the striing\n            $normalizedString = $S.Normalize([System.Text.NormalizationForm]::FormD)\n            # Remove diacritics\n            $sb = [System.Text.StringBuilder]::new()\n            for ($i = 0; $i -lt $normalizedString.Length; $i++) {\n                $c = $normalizedString[$i]\n                if ([Globalization.CharUnicodeInfo]::GetUnicodeCategory($c) -ne [Globalization.UnicodeCategory]::NonSpacingMark) {\n                    [void]$sb.Append($c)\n                }\n            }\n            $S = $sb.ToString().Normalize([System.Text.NormalizationForm]::FormC)\n            # #replace diacritics, if anything is missing\n            $sb = [Text.Encoding]::ASCII.GetString([Text.Encoding]::GetEncoding(\"Cyrillic\").GetBytes($S))\n            $sb\n        }\n    }\n}"
  },
  {
    "path": "Public/Converts/ConvertTo-OperatingSystem.ps1",
    "content": "﻿function ConvertTo-OperatingSystem {\n    <#\n    .SYNOPSIS\n    Allows easy conversion of OperatingSystem, Operating System Version to proper Windows 10 naming based on WMI or AD\n\n    .DESCRIPTION\n    Allows easy conversion of OperatingSystem, Operating System Version to proper Windows 10 naming based on WMI or AD\n\n    .PARAMETER OperatingSystem\n    Operating System as returned by Active Directory\n\n    .PARAMETER OperatingSystemVersion\n    Operating System Version as returned by Active Directory\n\n    .EXAMPLE\n    $Computers = Get-ADComputer -Filter * -Properties OperatingSystem, OperatingSystemVersion | ForEach-Object {\n        $OPS = ConvertTo-OperatingSystem -OperatingSystem $_.OperatingSystem -OperatingSystemVersion $_.OperatingSystemVersion\n        Add-Member -MemberType NoteProperty -Name 'OperatingSystemTranslated' -Value $OPS -InputObject $_ -Force\n        $_\n    }\n    $Computers | Select-Object DNS*, Name, SamAccountName, Enabled, OperatingSystem*, DistinguishedName | Format-Table\n\n    .EXAMPLE\n    $Registry = Get-PSRegistry -ComputerName 'AD1' -RegistryPath 'HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion'\n    ConvertTo-OperatingSystem -OperatingSystem $Registry.ProductName -OperatingSystemVersion $Registry.CurrentBuildNumber\n\n    .NOTES\n    General notes\n    #>\n    [CmdletBinding()]\n    param(\n        [string] $OperatingSystem,\n        [string] $OperatingSystemVersion\n    )\n\n    if ($OperatingSystem -like 'Windows 10*' -or $OperatingSystem -like 'Windows 11*') {\n        $Systems = @{\n            # This is how it's written in AD\n            '10.0 (22621)' = 'Windows 11 22H2'\n            '10.0 (22000)' = 'Windows 11 21H2'\n            '10.0 (19045)' = 'Windows 10 22H2'\n            '10.0 (19044)' = 'Windows 10 21H2'\n            '10.0 (19043)' = 'Windows 10 21H1'\n            '10.0 (19042)' = 'Windows 10 20H2'\n            '10.0 (19041)' = 'Windows 10 2004'\n            '10.0 (18898)' = 'Windows 10 Insider Preview'\n            '10.0 (18363)' = \"Windows 10 1909\"\n            '10.0 (18362)' = \"Windows 10 1903\"\n            '10.0 (17763)' = \"Windows 10 1809\"\n            '10.0 (17134)' = \"Windows 10 1803\"\n            '10.0 (16299)' = \"Windows 10 1709\"\n            '10.0 (15063)' = \"Windows 10 1703\"\n            '10.0 (14393)' = \"Windows 10 1607\"\n            '10.0 (10586)' = \"Windows 10 1511\"\n            '10.0 (10240)' = \"Windows 10 1507\"\n\n            # This is how WMI/CIM stores it\n            '10.0.22621'   = 'Windows 11 22H2'\n            '10.0.22000'   = 'Windows 11 21H2'\n            '10.0.19045'   = 'Windows 10 22H2'\n            '10.0.19044'   = 'Windows 10 21H2'\n            '10.0.19043'   = 'Windows 10 21H1'\n            '10.0.19042'   = 'Windows 10 20H2'\n            '10.0.19041'   = 'Windows 10 2004'\n            '10.0.18898'   = 'Windows 10 Insider Preview'\n            '10.0.18363'   = \"Windows 10 1909\"\n            '10.0.18362'   = \"Windows 10 1903\"\n            '10.0.17763'   = \"Windows 10 1809\"\n            '10.0.17134'   = \"Windows 10 1803\"\n            '10.0.16299'   = \"Windows 10 1709\"\n            '10.0.15063'   = \"Windows 10 1703\"\n            '10.0.14393'   = \"Windows 10 1607\"\n            '10.0.10586'   = \"Windows 10 1511\"\n            '10.0.10240'   = \"Windows 10 1507\"\n\n            # This is how it's written in registry\n            '22621'        = 'Windows 11 22H2'\n            '22000'        = 'Windows 11 21H2'\n            '19045'        = 'Windows 10 22H2'\n            '19044'        = 'Windows 10 21H2'\n            '19043'        = 'Windows 10 21H1'\n            '19042'        = 'Windows 10 20H2'\n            '19041'        = 'Windows 10 2004'\n            '18898'        = 'Windows 10 Insider Preview'\n            '18363'        = \"Windows 10 1909\"\n            '18362'        = \"Windows 10 1903\"\n            '17763'        = \"Windows 10 1809\"\n            '17134'        = \"Windows 10 1803\"\n            '16299'        = \"Windows 10 1709\"\n            '15063'        = \"Windows 10 1703\"\n            '14393'        = \"Windows 10 1607\"\n            '10586'        = \"Windows 10 1511\"\n            '10240'        = \"Windows 10 1507\"\n        }\n        $System = $Systems[$OperatingSystemVersion]\n        if (-not $System) {\n            $System = $OperatingSystemVersion\n        }\n    } elseif ($OperatingSystem -like 'Windows Server*') {\n        # May need updates https://docs.microsoft.com/en-us/windows-server/get-started/windows-server-release-info\n        # to detect Core\n\n        $Systems = @{\n            # This is how it's written in AD\n            '10.0 (20348)' = 'Windows Server 2022'\n            '10.0 (19042)' = 'Windows Server 2019 20H2'\n            '10.0 (19041)' = 'Windows Server 2019 2004'\n            '10.0 (18363)' = 'Windows Server 2019 1909'\n            '10.0 (18362)' = \"Windows Server 2019 1903\" # (Datacenter Core, Standard Core)\n            '10.0 (17763)' = \"Windows Server 2019 1809\" # (Datacenter, Essentials, Standard)\n            '10.0 (17134)' = \"Windows Server 2016 1803\" # (Datacenter, Standard)\n            '10.0 (14393)' = \"Windows Server 2016 1607\"\n            '6.3 (9600)'   = 'Windows Server 2012 R2'\n            '6.1 (7601)'   = 'Windows Server 2008 R2'\n            '5.2 (3790)'   = 'Windows Server 2003'\n\n            # This is how WMI/CIM stores it\n            '10.0.20348'   = 'Windows Server 2022'\n            '10.0.19042'   = 'Windows Server 2019 20H2'\n            '10.0.19041'   = 'Windows Server 2019 2004'\n            '10.0.18363'   = 'Windows Server 2019 1909'\n            '10.0.18362'   = \"Windows Server 2019 1903\" #  (Datacenter Core, Standard Core)\n            '10.0.17763'   = \"Windows Server 2019 1809\"  # (Datacenter, Essentials, Standard)\n            '10.0.17134'   = \"Windows Server 2016 1803\" ## (Datacenter, Standard)\n            '10.0.14393'   = \"Windows Server 2016 1607\"\n            '6.3.9600'     = 'Windows Server 2012 R2'\n            '6.1.7601'     = 'Windows Server 2008 R2' # i think\n            '5.2.3790'     = 'Windows Server 2003' # i think\n\n            # This is how it's written in registry\n            '20348'        = 'Windows Server 2022'\n            '19042'        = 'Windows Server 2019 20H2'\n            '19041'        = 'Windows Server 2019 2004'\n            '18363'        = 'Windows Server 2019 1909'\n            '18362'        = \"Windows Server 2019 1903\" # (Datacenter Core, Standard Core)\n            '17763'        = \"Windows Server 2019 1809\" # (Datacenter, Essentials, Standard)\n            '17134'        = \"Windows Server 2016 1803\" # (Datacenter, Standard)\n            '14393'        = \"Windows Server 2016 1607\"\n            '9600'         = 'Windows Server 2012 R2'\n            '7601'         = 'Windows Server 2008 R2'\n            '3790'         = 'Windows Server 2003'\n        }\n        $System = $Systems[$OperatingSystemVersion]\n        if (-not $System) {\n            $System = $OperatingSystemVersion\n        }\n    } else {\n        $System = $OperatingSystem\n    }\n    if ($System) {\n        $System\n    } else {\n        'Unknown'\n    }\n}\n\n<#\n$Computers = Get-ADComputer -Filter * -Properties OperatingSystem, OperatingSystemVersion | ForEach-Object {\n    $OPS = ConvertTo-OperatingSystem -OperatingSystem $_.OperatingSystem -OperatingSystemVersion $_.OperatingSystemVersion\n    Add-Member -MemberType NoteProperty -Name 'OperatingSystemTranslated' -Value $OPS -InputObject $_ -Force\n    $_\n}\n$Computers | Select-Object DNS*, Name, SamAccountName, Enabled, OperatingSystem*, DistinguishedName | Format-Table\n#>"
  },
  {
    "path": "Public/Converts/ConvertTo-OrderedDictionary.ps1",
    "content": "﻿function ConvertTo-OrderedDictionary {\n    <#\n    .SYNOPSIS\n    Converts a hashtable into an ordered dictionary.\n\n    .DESCRIPTION\n    This function takes a hashtable as input and converts it into an ordered dictionary. The ordered dictionary maintains the order of elements as they were added to the hashtable.\n\n    .PARAMETER HashTable\n    Specifies the hashtable to be converted into an ordered dictionary.\n\n    .EXAMPLE\n    $HashTable = @{\n        \"Key3\" = \"Value3\"\n        \"Key1\" = \"Value1\"\n        \"Key2\" = \"Value2\"\n    }\n    ConvertTo-OrderedDictionary -HashTable $HashTable\n    # Outputs an ordered dictionary where the keys are in the order they were added to the hashtable.\n\n    #>\n    [CmdletBinding()]\n    Param (\n        [parameter(Mandatory = $true, ValueFromPipeline = $true)] $HashTable\n    )\n    # $TimeToGenerate = Start-TimeLog\n    $OrderedDictionary = [ordered]@{ }\n    if ($HashTable -is [System.Collections.IDictionary]) {\n        $Keys = $HashTable.Keys | Sort-Object\n        foreach ($_ in $Keys) {\n            $OrderedDictionary.Add($_, $HashTable[$_])\n        }\n    } elseif ($HashTable -is [System.Collections.ICollection]) {\n        for ($i = 0; $i -lt $HashTable.count; $i++) {\n            $OrderedDictionary.Add($i, $HashTable[$i])\n        }\n    } else {\n        Write-Error \"ConvertTo-OrderedDictionary - Wrong input type.\"\n    }\n    # $EndTime = Stop-TimeLog -Time $TimeToGenerate\n    #Write-Verbose \"ConvertTo-OrderedDictionary - Time to convert: $EndTime\"\n    return $OrderedDictionary\n}"
  },
  {
    "path": "Public/Converts/ConvertTo-PrettyObject.ps1",
    "content": "﻿function ConvertTo-PrettyObject {\n    <#\n    .SYNOPSIS\n    Command to help with converting standard objects that could be nested objects into single level PSCustomObject\n\n    .DESCRIPTION\n    Command to help with converting standard objects that could be nested objects into single level PSCustomObject\n    This is a help command for PSWriteHTML module and probably PSWriteOffice module to create tables from objects\n    and make sure those tables are not nested and can be easily converted to HTML or Office tables without having to manually flatten them\n\n    .PARAMETER Object\n     Specifies the objects to convert to pretty format. Enter a variable that contains the objects, or type a command or expression that gets the objects. You can also pipe an object to ConvertTo-JsonLiteral\n\n    .PARAMETER DateTimeFormat\n    Changes DateTime string format. Default \"yyyy-MM-dd HH:mm:ss\"\n\n    .PARAMETER NumberAsString\n    Provides an alternative serialization option that converts all numbers to their string representation.\n\n    .PARAMETER BoolAsString\n    Provides an alternative serialization option that converts all bool to their string representation.\n\n    .PARAMETER PropertyName\n    Uses PropertyNames provided by user (only works with Force)\n\n    .PARAMETER NewLineFormat\n    Provides a way to configure how new lines are converted for property names\n\n    .PARAMETER NewLineFormatProperty\n    Provides a way to configure how new lines are converted for values\n\n    .PARAMETER PropertyName\n    Allows passing property names to be used for custom objects (hashtables and alike are unaffected)\n\n    .PARAMETER ArrayJoin\n    Forces any array to be a string regardless of depth level\n\n    .PARAMETER ArrayJoinString\n    Uses defined string or char for array join. By default it uses comma with a space when used.\n\n    .PARAMETER Force\n    Forces using property names from first object or given thru PropertyName parameter\n\n    .EXAMPLE\n    $Test1 = [PSCustomObject] @{\n        Number     = 1\n        Number2    = 2.2\n        Bool       = $false\n        Array      = @(\n            'C:\\Users\\1Password.exe'\n            \"C:\\Users\\Ooops.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        )\n        EmptyArray = @()\n        EmptyList  = [System.Collections.Generic.List[string]]::new()\n        HashTable  = @{\n            NumberAgain       = 2\n            OrderedDictionary = [ordered] @{\n                String    = 'test'\n                HashTable = @{\n                    StringAgain = \"oops\"\n                }\n            }\n            Array             = @(\n                'C:\\Users\\1Password.exe'\n                \"C:\\Users\\Ooops.exe\"\n                \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n                \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n            )\n        }\n        DateTime   = Get-Date\n    }\n\n    $Test1 | ConvertTo-PrettyObject -ArrayJoinString \",\" -ArrayJoin | ConvertTo-Json | ConvertFrom-Json\n\n    .NOTES\n    General notes\n    #>\n    [CmdletBinding()]\n    param(\n        [alias('InputObject')]\n        [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName, Position = 0)]\n        [Array] $Object,\n\n        [int] $Depth,\n        [switch] $AsArray,\n        [string] $DateTimeFormat = \"yyyy-MM-dd HH:mm:ss\",\n        [switch] $NumberAsString,\n        [switch] $BoolAsString,\n        [System.Collections.IDictionary] $NewLineFormat = @{\n            NewLineCarriage = '\\r\\n'\n            NewLine         = \"\\n\"\n            Carriage        = \"\\r\"\n        },\n        [System.Collections.IDictionary] $NewLineFormatProperty = @{\n            NewLineCarriage = '\\r\\n'\n            NewLine         = \"\\n\"\n            Carriage        = \"\\r\"\n        },\n        [System.Collections.IDictionary] $AdvancedReplace,\n        [string] $ArrayJoinString,\n        [switch] $ArrayJoin,\n        [string[]]$PropertyName,\n        [switch] $Force\n    )\n    begin {\n        filter IsNumeric() {\n            return $_ -is [byte] -or $_ -is [int16] -or $_ -is [int32] -or $_ -is [int64]  `\n                -or $_ -is [sbyte] -or $_ -is [uint16] -or $_ -is [uint32] -or $_ -is [uint64] `\n                -or $_ -is [float] -or $_ -is [double] -or $_ -is [decimal]\n        }\n        filter IsOfType() {\n            return $_ -is [bool] -or $_ -is [char] -or $_ -is [datetime] -or $_ -is [string] `\n                -or $_ -is [timespan] -or $_ -is [URI] `\n                -or $_ -is [byte] -or $_ -is [int16] -or $_ -is [int32] -or $_ -is [int64] `\n                -or $_ -is [sbyte] -or $_ -is [uint16] -or $_ -is [uint32] -or $_ -is [uint64] `\n                -or $_ -is [float] -or $_ -is [double] -or $_ -is [decimal]\n        }\n        $ProcessedAnyInput = $false\n    }\n    process {\n        # Handle case where no object is provided or null is provided\n        if (-not $PSBoundParameters.ContainsKey('Object') -or $null -eq $Object -or $Object.Count -eq 0) {\n            return\n        }\n\n        $ProcessedAnyInput = $true\n\n        for ($a = 0; $a -lt $Object.Count; $a++) {\n            # Skip null array elements\n            if ($null -eq $Object[$a]) {\n                continue\n            }\n\n            $NewObject = [ordered] @{}\n            if ($Object[$a] -is [System.Collections.IDictionary]) {\n                # Handle empty dictionaries\n                if ($Object[$a].Keys.Count -eq 0) {\n                    [PSCustomObject] $NewObject\n                    continue\n                }\n\n                # Push to TEXT the same as [PSCustomObject]\n                for ($i = 0; $i -lt ($Object[$a].Keys).Count; $i++) {\n                    $Property = ([string[]]$Object[$a].Keys)[$i]\n                    # Skip null or empty property names\n                    if ([string]::IsNullOrEmpty($Property)) {\n                        continue\n                    }\n                    $DisplayProperty = $Property.Replace([System.Environment]::NewLine, $NewLineFormatProperty.NewLineCarriage).Replace(\"`n\", $NewLineFormatProperty.NewLine).Replace(\"`r\", $NewLineFormatProperty.Carriage)\n                    $Value = $Object[$a].$Property\n                    # the same code for PSCustomObject\n                    if ($null -eq $Value) {\n                        $NewObject[$DisplayProperty] = \"\"\n                    } elseif ($Value -is [string]) {\n                        if ($AdvancedReplace) {\n                            foreach ($Key in $AdvancedReplace.Keys) {\n                                $Value = $Value.Replace($Key, $AdvancedReplace[$Key])\n                            }\n                        }\n                        $NewObject[$DisplayProperty] = $Value.Replace([System.Environment]::NewLine, $NewLineFormat.NewLineCarriage).Replace(\"`n\", $NewLineFormat.NewLine).Replace(\"`r\", $NewLineFormat.Carriage)\n                    } elseif ($Value -is [DateTime]) {\n                        $NewObject[$DisplayProperty] = $Object[$a].$Property.ToString($DateTimeFormat)\n                    } elseif ($Value -is [bool]) {\n                        if ($BoolAsString) {\n                            $NewObject[$DisplayProperty] = \"$Value\"\n                        } else {\n                            $NewObject[$DisplayProperty] = $Value\n                        }\n                    } elseif ($Value -is [System.Collections.IDictionary]) {\n                        # We force it to max depth 0\n                        $NewObject[$DisplayProperty] = \"$Value\"\n                    } elseif ($Value -is [System.Collections.IList] -or $Value -is [System.Collections.ReadOnlyCollectionBase]) {\n                        if ($ArrayJoin) {\n                            $Value = $Value -join $ArrayJoinString\n                            $Value = \"$Value\".Replace([System.Environment]::NewLine, $NewLineFormat.NewLineCarriage).Replace(\"`n\", $NewLineFormat.NewLine).Replace(\"`r\", $NewLineFormat.Carriage)\n                            $NewObject[$DisplayProperty] = \"$Value\"\n                        } else {\n                            # We force it to max depth 0\n                            $Value = \"$Value\".Replace([System.Environment]::NewLine, $NewLineFormat.NewLineCarriage).Replace(\"`n\", $NewLineFormat.NewLine).Replace(\"`r\", $NewLineFormat.Carriage)\n                            $NewObject[$DisplayProperty] = \"$Value\"\n                        }\n                    } elseif ($Value -is [System.Enum]) {\n                        $NewObject[$DisplayProperty] = ($Value).ToString()\n                    } elseif (($Value | IsNumeric) -eq $true) {\n                        $Value = $($Value).ToString().Replace(',', '.')\n                        if ($NumberAsString) {\n                            $NewObject[$DisplayProperty] = \"$Value\"\n                        } else {\n                            $NewObject[$DisplayProperty] = $Value\n                        }\n                    } elseif ($Value -is [PSObject]) {\n                        # We force it to max depth 0\n                        $NewObject[$DisplayProperty] = \"$Value\"\n                    } else {\n                        $Value = $Value.ToString().Replace([System.Environment]::NewLine, $NewLineFormat.NewLineCarriage).Replace(\"`n\", $NewLineFormat.NewLine).Replace(\"`r\", $NewLineFormat.Carriage)\n                        $NewObject[$DisplayProperty] = \"$Value\"\n                    }\n                }\n                [PSCustomObject] $NewObject\n            } elseif ($Object[$a] | IsOfType) {\n                # $Value = ConvertTo-StringByType -Value $Object[$a] -DateTimeFormat $DateTimeFormat -NumberAsString:$NumberAsString -BoolAsString:$BoolAsString -Depth $InitialDepth -MaxDepth $MaxDepth -TextBuilder $TextBuilder -NewLineFormat $NewLineFormat -NewLineFormatProperty $NewLineFormatProperty -Force:$Force -ArrayJoin:$ArrayJoin -ArrayJoinString $ArrayJoinString -AdvancedReplace $AdvancedReplace\n                # $null = $TextBuilder.Append($Value)\n                $Object[$a]\n            } else {\n                if ($Force -and -not $PropertyName) {\n                    # Handle case where first object might be null\n                    if ($null -eq $Object[0]) {\n                        continue\n                    }\n                    $PropertyName = $Object[0].PSObject.Properties.Name\n                } elseif ($Force -and $PropertyName) {\n\n                } else {\n                    # Handle case where current object has no properties\n                    if ($null -eq $Object[$a].PSObject -or $null -eq $Object[$a].PSObject.Properties) {\n                        continue\n                    }\n                    $PropertyName = $Object[$a].PSObject.Properties.Name\n                }\n\n                # Skip if no properties found\n                if ($null -eq $PropertyName -or $PropertyName.Count -eq 0) {\n                    continue\n                }\n\n                foreach ($Property in $PropertyName) {\n                    $DisplayProperty = $Property.Replace([System.Environment]::NewLine, $NewLineFormatProperty.NewLineCarriage).Replace(\"`n\", $NewLineFormatProperty.NewLine).Replace(\"`r\", $NewLineFormatProperty.Carriage)\n                    $Value = $Object[$a].$Property\n                    if ($null -eq $Value) {\n                        $NewObject[$DisplayProperty] = \"\"\n                    } elseif ($Value -is [string]) {\n                        if ($AdvancedReplace) {\n                            foreach ($Key in $AdvancedReplace.Keys) {\n                                $Value = $Value.Replace($Key, $AdvancedReplace[$Key])\n                            }\n                        }\n                        $NewObject[$DisplayProperty] = $Value.Replace([System.Environment]::NewLine, $NewLineFormat.NewLineCarriage).Replace(\"`n\", $NewLineFormat.NewLine).Replace(\"`r\", $NewLineFormat.Carriage)\n                    } elseif ($Value -is [DateTime]) {\n                        $NewObject[$DisplayProperty] = $Object[$a].$Property.ToString($DateTimeFormat)\n                    } elseif ($Value -is [bool]) {\n                        if ($BoolAsString) {\n                            $NewObject[$DisplayProperty] = \"$Value\"\n                        } else {\n                            $NewObject[$DisplayProperty] = $Value\n                        }\n                    } elseif ($Value -is [System.Collections.IDictionary]) {\n                        # We force it to max depth 0\n                        $NewObject[$DisplayProperty] = \"$Value\"\n                    } elseif ($Value -is [System.Collections.IList] -or $Value -is [System.Collections.ReadOnlyCollectionBase]) {\n                        if ($ArrayJoin) {\n                            $Value = $Value -join $ArrayJoinString\n                            $Value = \"$Value\".Replace([System.Environment]::NewLine, $NewLineFormat.NewLineCarriage).Replace(\"`n\", $NewLineFormat.NewLine).Replace(\"`r\", $NewLineFormat.Carriage)\n                            $NewObject[$DisplayProperty] = \"$Value\"\n                        } else {\n                            # We force it to max depth 0\n                            $Value = \"$Value\".Replace([System.Environment]::NewLine, $NewLineFormat.NewLineCarriage).Replace(\"`n\", $NewLineFormat.NewLine).Replace(\"`r\", $NewLineFormat.Carriage)\n                            $NewObject[$DisplayProperty] = \"$Value\"\n                        }\n                    } elseif ($Value -is [System.Enum] -or $Value.PSTypeNames -contains 'Deserialized.System.Enum') {\n                        $NewObject[$DisplayProperty] = ($Value).ToString()\n                    } elseif (($Value | IsNumeric) -eq $true) {\n                        if ($NumberAsString) {\n                            $NewObject[$DisplayProperty] = ($Value).ToString()\n                        } else {\n                            $NewObject[$DisplayProperty] = $Value\n                        }\n                    } elseif ($Value -is [PSObject]) {\n                        # We force it to max depth 0\n                        $NewObject[$DisplayProperty] = \"$Value\"\n                    } else {\n                        $Value = $Value.ToString().Replace([System.Environment]::NewLine, $NewLineFormat.NewLineCarriage).Replace(\"`n\", $NewLineFormat.NewLine).Replace(\"`r\", $NewLineFormat.Carriage)\n                        $NewObject[$DisplayProperty] = \"$Value\"\n                    }\n                }\n                [PSCustomObject] $NewObject\n            }\n        }\n    }\n    end {\n        # If no input was processed, check if we were called with null directly\n        if (-not $ProcessedAnyInput -and $PSBoundParameters.ContainsKey('Object') -and $null -eq $Object) {\n            # Return nothing for null input\n            return\n        }\n    }\n}"
  },
  {
    "path": "Public/Converts/ConvertTo-SID.ps1",
    "content": "﻿function ConvertTo-SID {\n    <#\n    .SYNOPSIS\n    Converts a given identity to a Security Identifier (SID).\n\n    .DESCRIPTION\n    This function takes one or more identity strings and converts them to their corresponding Security Identifiers (SIDs). It caches the results for faster lookup.\n\n    .PARAMETER Identity\n    Specifies the identity strings to be converted to SIDs.\n\n    .EXAMPLE\n    ConvertTo-SID -Identity 'Administrator'\n    Converts the 'Administrator' identity to its corresponding SID.\n\n    .EXAMPLE\n    ConvertTo-SID -Identity 'Guest', 'User1'\n    Converts the 'Guest' and 'User1' identities to their corresponding SIDs.\n\n    #>\n    [cmdletBinding()]\n    param(\n        [string[]] $Identity\n    )\n    Begin {\n        if (-not $Script:GlobalCacheSidConvert) {\n            $Script:GlobalCacheSidConvert = @{ }\n        }\n    }\n    Process {\n        foreach ($Ident in $Identity) {\n            if ($Script:GlobalCacheSidConvert[$Ident]) {\n                $Script:GlobalCacheSidConvert[$Ident]\n            } else {\n                try {\n                    $Script:GlobalCacheSidConvert[$Ident] = [PSCustomObject] @{\n                        Name  = $Ident\n                        Sid   = ([System.Security.Principal.NTAccount] $Ident).Translate([System.Security.Principal.SecurityIdentifier]).Value\n                        Error = ''\n                    }\n                } catch {\n                    [PSCustomObject] @{\n                        Name  = $Ident\n                        Sid   = ''\n                        Error = $_.Exception.Message\n                    }\n                }\n                $Script:GlobalCacheSidConvert[$Ident]\n            }\n        }\n    }\n    End {\n\n    }\n}"
  },
  {
    "path": "Public/DNS/Set-DNSServerIPAddress.ps1",
    "content": "function Set-DnsServerIpAddress {\n    <#\n    .SYNOPSIS\n    Sets the DNS server IP addresses on a specified computer for a given network interface.\n\n    .DESCRIPTION\n    This function allows you to set the DNS server IP addresses on a specified computer for a given network interface. It checks if the computer is online before attempting to set the DNS server addresses.\n\n    .PARAMETER ComputerName\n    Specifies the name of the computer where the DNS server IP addresses will be set.\n\n    .PARAMETER NicName\n    Specifies the name of the network interface (NIC) where the DNS server IP addresses will be set. Supports wildcard characters.\n\n    .PARAMETER IpAddresses\n    Specifies one or more IP addresses of the DNS servers to be set on the specified network interface.\n\n    .EXAMPLE\n    Set-DnsServerIpAddress -ComputerName \"Server01\" -NicName \"Ethernet*\" -IpAddresses '8.8.8.8','8.8.4.4','8.8.8.1'\n    Sets the DNS server IP addresses '8.8.8.8', '8.8.4.4', and '8.8.8.1' on the network interface starting with \"Ethernet\" on the computer \"Server01\".\n\n    .NOTES\n    This function may require further enhancements for specific use cases.\n    #>\n    [CmdletBinding()]\n    param(\n        [string] $ComputerName,\n        [string] $NicName,\n        [string] $IpAddresses\n    )\n    if (Test-Connection -ComputerName $ComputerName -Count 2 -Quiet) {\n        Invoke-Command -ComputerName $ComputerName -ScriptBlock { param ($ComputerName, $NicName, $IpAddresses)\n            Write-Host \"Setting on $ComputerName on interface $NicName a new set of DNS Servers $IpAddresses\"\n            Set-DnsClientServerAddress -InterfaceAlias $NicName -ServerAddresses $IpAddresses\n        } -ArgumentList $ComputerName, $NicName, $IpAddresses\n    } else {\n        Write-Warning \"Set-DnsServerIpAddress - Can't access $ComputerName. Computer is not online.\"\n    }\n}"
  },
  {
    "path": "Public/FilesFolders/Convert-FileEncoding.ps1",
    "content": "function Convert-FileEncoding {\n    <#\n    .SYNOPSIS\n    Converts files from one encoding to another.\n\n    .DESCRIPTION\n    Reads a single file or all files within a directory and rewrites them using a new encoding.\n    Useful for converting files from UTF8 with BOM to UTF8 without BOM or any other supported encoding.\n    Files are only converted when their detected encoding matches the provided SourceEncoding unless -Force is used.\n    If a file already uses the target encoding it is skipped.\n    After conversion the content is verified to ensure it matches the original string.\n    If the content differs the change is rolled back by default unless -NoRollbackOnMismatch is specified.\n    Supports -WhatIf for previewing changes.\n\n    .PARAMETER Path\n    Specifies the file or directory to process.\n\n    .PARAMETER Filter\n    Filters which files are processed when Path is a directory. Wildcards are supported.\n\n    .PARAMETER SourceEncoding\n    Encoding used when reading files. The default is UTF8BOM.\n\n    .PARAMETER TargetEncoding\n    Encoding used when writing files. The default is UTF8.\n\n    .PARAMETER Recurse\n    When Path is a directory, process files in all subdirectories as well.\n\n    .PARAMETER Force\n    Convert files even when their detected encoding does not match SourceEncoding.\n\n    .PARAMETER NoRollbackOnMismatch\n    Skip rolling back files when the verification step detects that content changed during conversion.\n\n    .EXAMPLE\n    Convert-FileEncoding -Path 'C:\\Scripts' -Filter '*.ps1' -SourceEncoding UTF8BOM -TargetEncoding UTF8\n\n    Converts all PowerShell scripts under C:\\Scripts from UTF8 with BOM to UTF8.\n    #>\n    [CmdletBinding(SupportsShouldProcess)]\n    param(\n        [Parameter(Mandatory)]\n        [string] $Path,\n\n        [string] $Filter = '*.*',\n\n        [ValidateSet('Ascii','BigEndianUnicode','Unicode','UTF7','UTF8','UTF8BOM','UTF32','Default','OEM')]\n        [string] $SourceEncoding = 'UTF8BOM',\n\n        [ValidateSet('Ascii','BigEndianUnicode','Unicode','UTF7','UTF8','UTF8BOM','UTF32','Default','OEM')]\n        [string] $TargetEncoding = 'UTF8',\n\n        [switch] $Recurse,\n        [switch] $Force,\n        [switch] $NoRollbackOnMismatch\n    )\n\n    $source = Resolve-Encoding -Name $SourceEncoding\n    $target = Resolve-Encoding -Name $TargetEncoding\n\n    if (Test-Path -LiteralPath $Path -PathType Leaf) {\n        $files = Get-Item -LiteralPath $Path\n    } elseif (Test-Path -LiteralPath $Path -PathType Container) {\n        $gciParams = @{ LiteralPath = $Path; File = $true; Filter = $Filter }\n        if ($Recurse) { $gciParams.Recurse = $true }\n        $files = Get-ChildItem @gciParams\n    } else {\n        throw \"Path $Path not found\"\n    }\n\n    foreach ($file in $files) {\n        $result = Convert-FileEncodingSingle -FilePath $file.FullName -SourceEncoding $source -TargetEncoding $target -Force:$Force -NoRollbackOnMismatch:$NoRollbackOnMismatch -WhatIf:$WhatIfPreference\n\n        if ($result) {\n            Write-Verbose \"File: $($result.FilePath) - Status: $($result.Status) - Reason: $($result.Reason)\"\n            if ($result.Warning) {\n                Write-Warning $result.Warning\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Public/FilesFolders/Convert-FolderEncoding.ps1",
    "content": "function Convert-FolderEncoding {\n    <#\n    .SYNOPSIS\n    Converts files in folders to a target encoding based on file extensions.\n\n    .DESCRIPTION\n    A user-friendly wrapper around Convert-FileEncoding that makes it easy to target specific file types\n    by their extensions across one or more folders. This function is ideal for scenarios where you want to convert encoding for\n    specific file types across directories without needing to know filter syntax.\n\n    The function supports both single and multiple file extensions, with smart defaults for PowerShell\n    compatibility. It provides comprehensive feedback and safety features including WhatIf support\n    and backup creation.\n\n    .PARAMETER Path\n    The directory path to search for files. Can be a single directory or an array of directories.\n    Use '.' for the current directory.\n\n    .PARAMETER Extensions\n    File extensions to target for conversion. Can be specified with or without the leading dot.\n    Examples: 'ps1', '.ps1', @('ps1', 'psm1'), @('.cs', '.vb')\n\n    Common presets available via -FileType parameter for convenience.\n\n    .PARAMETER FileType\n    Predefined file type groups for common scenarios:\n    - PowerShell: .ps1, .psm1, .psd1, .ps1xml\n    - CSharp: .cs, .csx\n    - Web: .html, .css, .js, .json, .xml\n    - Scripts: .ps1, .py, .rb, .sh, .bat, .cmd\n    - Text: .txt, .md, .log, .config\n    - All: Processes all common text file types\n\n    .PARAMETER SourceEncoding\n    Expected source encoding of files. Default is 'UTF8BOM'.\n\n    .PARAMETER TargetEncoding\n    Target encoding for conversion.\n    Default is 'UTF8BOM' for PowerShell compatibility (prevents PS 5.1 ASCII misinterpretation).\n\n    .PARAMETER ExcludeDirectories\n    Directory names to exclude from processing (e.g., '.git', 'bin', 'obj', 'node_modules').\n    Default excludes common build and version control directories.\n\n    .PARAMETER Recurse\n    Process files in subdirectories recursively. Default is $true.\n\n    .PARAMETER CreateBackups\n    Create backup files before conversion for additional safety.\n    Backups are created with .bak extension in the same directory.\n\n    .PARAMETER Force\n    Convert files even when their detected encoding doesn't match SourceEncoding.\n\n    .PARAMETER NoRollbackOnMismatch\n    Skip rolling back files when verification detects content changes during conversion.\n\n    .PARAMETER MaxDepth\n    Maximum directory depth to recurse when -Recurse is enabled. Default is unlimited.\n\n    .PARAMETER PassThru\n    Return conversion results for further processing.\n\n    .EXAMPLE\n    Convert-FolderEncoding -Path . -Extensions 'ps1' -WhatIf\n\n    Preview what PowerShell files in the current directory would be converted.\n\n    .EXAMPLE\n    Convert-FolderEncoding -Path @('.\\Scripts', '.\\Modules') -FileType PowerShell -CreateBackups\n\n    Convert all PowerShell files in Scripts and Modules directories to UTF8BOM with backups.\n\n    .EXAMPLE\n    Convert-FolderEncoding -Path . -Extensions @('cs', 'vb') -TargetEncoding UTF8 -Recurse\n\n    Convert all C# and VB.NET files recursively to UTF8 (without BOM).\n\n    .EXAMPLE\n    Convert-FolderEncoding -Path .\\Source -FileType Web -ExcludeDirectories @('node_modules', 'dist') -Force\n\n    Convert web files, excluding build directories, forcing conversion regardless of detected encoding.\n\n    .NOTES\n    Author: PowerShell Encoding Tools\n\n    This function provides a more user-friendly interface than Convert-FileEncoding for common scenarios.\n    For complex filtering requirements, use Convert-FileEncoding directly.\n\n    PowerShell Encoding Notes:\n    - UTF8BOM is recommended for PowerShell files to ensure PS 5.1 compatibility\n    - UTF8 without BOM can cause PS 5.1 to misinterpret files as ASCII\n    - Always test with -WhatIf first and consider using -CreateBackups\n    #>\n    [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName = 'Extensions')]\n    param(\n        [Parameter(Mandatory)]\n        [Alias('Directory', 'Folder')]\n        [string[]] $Path,\n\n        [Parameter(ParameterSetName = 'Extensions', Mandatory)]\n        [string[]] $Extensions,\n\n        [Parameter(ParameterSetName = 'FileType', Mandatory)]\n        [ValidateSet('PowerShell', 'CSharp', 'Web', 'Scripts', 'Text', 'All')]\n        [string] $FileType,\n\n        [ValidateSet('Ascii', 'BigEndianUnicode', 'Unicode', 'UTF7', 'UTF8', 'UTF8BOM', 'UTF32', 'Default', 'OEM')]\n        [string] $SourceEncoding = 'UTF8BOM',\n\n        [ValidateSet('Ascii', 'BigEndianUnicode', 'Unicode', 'UTF7', 'UTF8', 'UTF8BOM', 'UTF32', 'Default', 'OEM')]\n        [string] $TargetEncoding = 'UTF8BOM',\n\n        [string[]] $ExcludeDirectories = @('.git', '.vs', 'bin', 'obj', 'packages', 'node_modules', '.vscode', 'dist', 'build'),\n\n        [bool] $Recurse = $true,\n\n        [switch] $CreateBackups,\n\n        [switch] $Force,\n\n        [switch] $NoRollbackOnMismatch,\n\n        [int] $MaxDepth,\n\n        [switch] $PassThru\n    )\n\n    # Validate paths\n    foreach ($singlePath in $Path) {\n        if (-not (Test-Path -LiteralPath $singlePath -PathType Container)) {\n            throw \"Directory path '$singlePath' not found or is not a directory\"\n        }\n    }\n\n    # Define file type mappings\n    $fileTypeMappings = @{\n        'PowerShell' = @('.ps1', '.psm1', '.psd1', '.ps1xml')\n        'CSharp'     = @('.cs', '.csx', '.csproj')\n        'Web'        = @('.html', '.htm', '.css', '.js', '.json', '.xml', '.xsl', '.xslt')\n        'Scripts'    = @('.ps1', '.py', '.rb', '.sh', '.bash', '.bat', '.cmd')\n        'Text'       = @('.txt', '.md', '.log', '.config', '.ini', '.conf', '.yaml', '.yml')\n        'All'        = @('.ps1', '.psm1', '.psd1', '.ps1xml', '.cs', '.csx', '.html', '.htm', '.css', '.js', '.json', '.xml', '.txt', '.md', '.py', '.rb', '.sh', '.bat', '.cmd', '.config', '.ini', '.yaml', '.yml')\n    }\n\n    # Determine target extensions\n    if ($PSCmdlet.ParameterSetName -eq 'FileType') {\n        $targetExtensions = $fileTypeMappings[$FileType]\n        Write-Verbose \"Using $FileType file type: $($targetExtensions -join ', ')\"\n    } else {\n        # Normalize extensions (ensure they start with a dot)\n        $targetExtensions = $Extensions | ForEach-Object {\n            if ($_.StartsWith('.')) { $_ } else { \".$_\" }\n        }\n        Write-Verbose \"Target extensions: $($targetExtensions -join ', ')\"\n    }\n\n    # Collect all files to process\n    $allFiles = @()\n    $summary = @{\n        TotalDirectories     = $Path.Count\n        ProcessedDirectories = 0\n        TotalFiles           = 0\n        ProcessedFiles       = 0\n        ConvertedFiles       = 0\n        SkippedFiles         = 0\n        ErrorFiles           = 0\n        StartTime            = Get-Date\n    }\n\n    Write-Verbose \"Scanning directories for files...\"\n\n    foreach ($singlePath in $Path) {\n        Write-Verbose \"Processing directory: $singlePath\"\n        $summary.ProcessedDirectories++\n\n        try {\n            $gciParams = @{\n                LiteralPath = $singlePath\n                File        = $true\n            }\n\n            if ($Recurse) {\n                $gciParams.Recurse = $true\n                if ($MaxDepth) { $gciParams.Depth = $MaxDepth }\n            }\n\n            $directoryFiles = Get-ChildItem @gciParams | Where-Object {\n                # Filter by extension\n                $extension = $_.Extension.ToLower()\n                $extensionMatch = $targetExtensions -contains $extension\n\n                # Exclude directories if specified\n                $directoryExcluded = $false\n                if ($ExcludeDirectories -and $_.DirectoryName) {\n                    $relativePath = $_.DirectoryName.Replace($singlePath, '').TrimStart('\\', '/')\n                    $directoryExcluded = $ExcludeDirectories | Where-Object { $relativePath -like \"*$_*\" }\n                }\n\n                return $extensionMatch -and -not $directoryExcluded\n            }\n\n            $allFiles += $directoryFiles\n            $summary.TotalFiles += $directoryFiles.Count\n\n            Write-Verbose \"Found $($directoryFiles.Count) matching files in $singlePath\"\n\n        } catch {\n            Write-Error \"Error processing directory '$singlePath': $($_.Exception.Message)\"\n            continue\n        }\n    }\n\n    if ($allFiles.Count -eq 0) {\n        Write-Warning \"No files found matching the specified criteria.\"\n        Write-Verbose \"Extensions searched: $($targetExtensions -join ', ')\"\n        Write-Verbose \"Paths searched: $($Path -join ', ')\"\n        return\n    }\n\n    Write-Verbose \"Found $($allFiles.Count) files across $($summary.ProcessedDirectories) directories\"\n    Write-Verbose \"Target extensions: $($targetExtensions -join ', ')\"\n    Write-Verbose \"Converting: $SourceEncoding → $TargetEncoding\"\n\n    if ($PSCmdlet.ShouldProcess(\"$($allFiles.Count) files\", \"Convert encoding from $SourceEncoding to $TargetEncoding\")) {\n\n        $results = @()\n        $progressCounter = 0\n\n        foreach ($file in $allFiles) {\n            $progressCounter++\n            $percentComplete = [math]::Round(($progressCounter / $allFiles.Count) * 100, 1)\n\n            Write-Progress -Activity \"Converting file encodings\" -Status \"Processing $($file.Name) ($progressCounter of $($allFiles.Count))\" -PercentComplete $percentComplete\n\n            try {\n                # Create backup if requested\n                if ($CreateBackups) {\n                    $backupPath = \"$($file.FullName).bak\"\n                    Copy-Item -LiteralPath $file.FullName -Destination $backupPath -Force\n                    Write-Verbose \"Created backup: $backupPath\"\n                }\n\n                # Convert the file\n                $convertParams = @{\n                    Path                 = $file.FullName\n                    SourceEncoding       = $SourceEncoding\n                    TargetEncoding       = $TargetEncoding\n                    Force                = $Force\n                    NoRollbackOnMismatch = $NoRollbackOnMismatch\n                    WhatIf               = $WhatIfPreference\n                }\n\n                Convert-FileEncoding @convertParams\n\n                $summary.ProcessedFiles++\n                $summary.ConvertedFiles++\n\n                if ($PassThru) {\n                    $results += [PSCustomObject]@{\n                        FilePath      = $file.FullName\n                        Extension     = $file.Extension\n                        Status        = 'Converted'\n                        BackupCreated = $CreateBackups\n                    }\n                }\n\n            } catch {\n                $summary.ErrorFiles++\n                Write-Error \"Error converting '$($file.FullName)': $($_.Exception.Message)\"\n\n                if ($PassThru) {\n                    $results += [PSCustomObject]@{\n                        FilePath  = $file.FullName\n                        Extension = $file.Extension\n                        Status    = 'Error'\n                        Error     = $_.Exception.Message\n                    }\n                }\n            }\n        }\n\n        Write-Progress -Activity \"Converting file encodings\" -Completed\n    }\n\n    # Display summary\n    $summary.EndTime = Get-Date\n    $summary.Duration = $summary.EndTime - $summary.StartTime\n\n    Write-Verbose \"Conversion Summary:\"\n    Write-Verbose \"  Directories processed: $($summary.ProcessedDirectories)\"\n    Write-Verbose \"  Files found: $($summary.TotalFiles)\"\n    Write-Verbose \"  Files processed: $($summary.ProcessedFiles)\"\n    Write-Verbose \"  Files converted: $($summary.ConvertedFiles)\"\n    Write-Verbose \"  Files with errors: $($summary.ErrorFiles)\"\n    Write-Verbose \"  Duration: $($summary.Duration.TotalSeconds.ToString('F2')) seconds\"\n\n    if ($CreateBackups -and $summary.ConvertedFiles -gt 0) {\n        Write-Verbose \"  Backups created with .bak extension\"\n    }\n\n    if ($PassThru) {\n        return $results\n    }\n}\n"
  },
  {
    "path": "Public/FilesFolders/Get-FileEncoding.ps1",
    "content": "function Get-FileEncoding {\n    <#\n    .SYNOPSIS\n    Get the encoding of a file (ASCII, UTF8, UTF8BOM, Unicode, BigEndianUnicode, UTF7, UTF32).\n\n    .DESCRIPTION\n    Detects the encoding of a file using its byte order mark or by scanning for non‑ASCII characters.\n    Encoding is determined by the first few bytes of the file (BOM) or by the presence of non-ASCII characters.\n    Returns a string with the encoding name or a custom object when -AsObject is used.\n\n    .PARAMETER Path\n    Path to the file to check. Supports pipeline input and can accept FullName property from Get-ChildItem.\n\n    .PARAMETER AsObject\n    Returns a custom object with Path, Encoding, and EncodingName properties instead of just the encoding name string.\n\n    .EXAMPLE\n    Get-FileEncoding -Path 'C:\\temp\\test.txt'\n    Returns the encoding name as a string (e.g., 'UTF8BOM', 'ASCII', 'Unicode')\n\n    .EXAMPLE\n    Get-FileEncoding -Path 'C:\\temp\\test.txt' -AsObject\n    Returns a custom object with detailed encoding information\n\n    .EXAMPLE\n    Get-ChildItem -Path 'C:\\temp\\*.txt' | Get-FileEncoding\n    Gets encoding for all text files in the directory via pipeline\n\n    .NOTES\n    Supported encodings: ASCII, UTF8, UTF8BOM, Unicode (UTF-16LE), BigEndianUnicode (UTF-16BE), UTF7, UTF32\n    #>\n    [CmdletBinding()]\n    param(\n        [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName, Position = 0)]\n        [Alias('FullName')]\n        [string] $Path,\n\n        [switch] $AsObject\n    )\n    process {\n        if (-not (Test-Path -LiteralPath $Path)) {\n            $msg = \"Get-FileEncoding - File not found: $Path\"\n            if ($ErrorActionPreference -eq 'Stop') { throw $msg }\n            Write-Warning $msg\n            return\n        }\n\n        $fs = [System.IO.FileStream]::new($Path, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read)\n        try {\n            $bom = [byte[]]::new(4)\n            $null = $fs.Read($bom, 0, 4)\n            $enc = [System.Text.Encoding]::ASCII\n\n            # Check for BOMs in order of specificity (longer BOMs first)\n            if ($bom[0] -eq 0x00 -and $bom[1] -eq 0x00 -and $bom[2] -eq 0xfe -and $bom[3] -eq 0xff) {\n                $enc = [System.Text.Encoding]::UTF32\n            } elseif ($bom[0] -eq 0xef -and $bom[1] -eq 0xbb -and $bom[2] -eq 0xbf) {\n                $enc = [System.Text.UTF8Encoding]::new($true)\n            } elseif ($bom[0] -eq 0xff -and $bom[1] -eq 0xfe) {\n                $enc = [System.Text.Encoding]::Unicode\n            } elseif ($bom[0] -eq 0xfe -and $bom[1] -eq 0xff) {\n                $enc = [System.Text.Encoding]::BigEndianUnicode\n            } elseif ($bom[0] -eq 0x2b -and $bom[1] -eq 0x2f -and $bom[2] -eq 0x76) {\n                $enc = [System.Text.Encoding]::UTF7\n            } else {\n                # No BOM detected - scan for non-ASCII characters to distinguish UTF8 from ASCII\n                $fs.Position = 0\n                $byte = [byte[]]::new(1)\n                while ($fs.Read($byte, 0, 1) -gt 0) {\n                    if ($byte[0] -gt 0x7F) {\n                        $enc = [System.Text.UTF8Encoding]::new($false)\n                        break\n                    }\n                }\n            }\n        } finally {\n            $fs.Close()\n            $fs.Dispose()\n        }\n\n        # Determine encoding name for consistent return values\n        $encName = if ($enc -is [System.Text.UTF8Encoding] -and $enc.GetPreamble().Length -eq 3) {\n            'UTF8BOM'\n        } elseif ($enc -is [System.Text.UTF8Encoding]) {\n            'UTF8'\n        } elseif ($enc -is [System.Text.UnicodeEncoding]) {\n            'Unicode'\n        } elseif ($enc -is [System.Text.UTF7Encoding]) {\n            'UTF7'\n        } elseif ($enc -is [System.Text.UTF32Encoding]) {\n            'UTF32'\n        } elseif ($enc -is [System.Text.ASCIIEncoding]) {\n            'ASCII'\n        } elseif ($enc -is [System.Text.BigEndianUnicodeEncoding]) {\n            'BigEndianUnicode'\n        } else {\n            $enc.WebName\n        }\n\n        if ($AsObject) {\n            [PSCustomObject]@{\n                Path         = $Path\n                Encoding     = $enc\n                EncodingName = $encName\n            }\n        } else {\n            $encName\n        }\n    }\n}\n\n"
  },
  {
    "path": "Public/FilesFolders/Get-FileInformation.ps1",
    "content": "function Get-FileInformation {\n    <#\n    .SYNOPSIS\n    Get information about file such as Name, FullName and Size\n\n    .DESCRIPTION\n    Get information about file such as Name, FullName and Size\n\n    .PARAMETER File\n    File to get information about\n\n    .EXAMPLE\n    Get-FileInformation -File 'C:\\Support\\GitHub\\PSSharedGoods\\Public\\FilesFolders\\Get-FileInformation.ps1'\n\n    #>\n    [CmdletBinding()]\n    param(\n        [alias('LiteralPath', 'Path')][string] $File\n    )\n    if (Test-Path -LiteralPath $File) {\n        $Item = Get-Item -LiteralPath $File\n        [PSCustomObject] @{\n            Name          = $Item.Name\n            FullName      = $Item.FullName\n            Size          = Get-FileSize -Bytes $Item.Length\n            IsReadOnly    = $Item.IsReadOnly\n            LastWriteTime = $Item.LastWriteTime\n        }\n    }\n}"
  },
  {
    "path": "Public/FilesFolders/Get-FileMetaData.ps1",
    "content": "﻿function Get-FileMetaData {\n    <#\n    .SYNOPSIS\n    Small function that gets metadata information from file providing similar output to what Explorer shows when viewing file\n\n    .DESCRIPTION\n    Small function that gets metadata information from file providing similar output to what Explorer shows when viewing file\n\n    .PARAMETER File\n    FileName or FileObject\n\n    .EXAMPLE\n    Get-ChildItem -Path $Env:USERPROFILE\\Desktop -Force | Get-FileMetaData | Out-HtmlView -ScrollX -Filtering -AllProperties\n\n    .EXAMPLE\n    Get-ChildItem -Path $Env:USERPROFILE\\Desktop -Force | Where-Object { $_.Attributes -like '*Hidden*' } | Get-FileMetaData | Out-HtmlView -ScrollX -Filtering -AllProperties\n\n    #>\n    [CmdletBinding()]\n    param (\n        [Parameter(Position = 0, ValueFromPipeline)][Object] $File,\n        [ValidateSet('None', 'MACTripleDES', 'MD5', 'RIPEMD160', 'SHA1', 'SHA256', 'SHA384', 'SHA512')][string] $HashAlgorithm = 'None',\n        [switch] $Signature,\n        [switch] $AsHashTable\n    )\n    Process {\n        foreach ($F in $File) {\n            $MetaDataObject = [ordered] @{}\n            if ($F -is [string]) {\n                if ($F -and (Test-Path -LiteralPath $F)) {\n                    $FileInformation = Get-ItemProperty -Path $F\n                    if ($FileInformation -is [System.IO.DirectoryInfo]) {\n                        continue\n                    }\n                } else {\n                    Write-Warning \"Get-FileMetaData - Doesn't exists. Skipping $F.\"\n                    continue\n                }\n            } elseif ($F -is [System.IO.DirectoryInfo]) {\n                #Write-Warning \"Get-FileMetaData - Directories are not supported. Skipping $F.\"\n                continue\n            } elseif ($F -is [System.IO.FileInfo]) {\n                $FileInformation = $F\n            } else {\n                Write-Warning \"Get-FileMetaData - Only files are supported. Skipping $F.\"\n                continue\n            }\n            $ShellApplication = New-Object -ComObject Shell.Application\n            $ShellFolder = $ShellApplication.Namespace($FileInformation.Directory.FullName)\n            $ShellFile = $ShellFolder.ParseName($FileInformation.Name)\n            $MetaDataProperties = [ordered] @{}\n            0..400 | ForEach-Object -Process {\n                $DataValue = $ShellFolder.GetDetailsOf($null, $_)\n                $PropertyValue = (Get-Culture).TextInfo.ToTitleCase($DataValue.Trim()).Replace(' ', '')\n                if ($PropertyValue -ne '') {\n                    $MetaDataProperties[\"$_\"] = $PropertyValue\n                }\n            }\n            foreach ($Key in $MetaDataProperties.Keys) {\n                $Property = $MetaDataProperties[$Key]\n                $Value = $ShellFolder.GetDetailsOf($ShellFile, [int] $Key)\n                if ($Property -in 'Attributes', 'Folder', 'Type', 'SpaceFree', 'TotalSize', 'SpaceUsed') {\n                    continue\n                }\n                If (($null -ne $Value) -and ($Value -ne '')) {\n                    $MetaDataObject[\"$Property\"] = $Value\n                }\n            }\n            if ($FileInformation.VersionInfo) {\n                $SplitInfo = ([string] $FileInformation.VersionInfo).Split([char]13)\n                foreach ($Item in $SplitInfo) {\n                    $Property = $Item.Split(\":\").Trim()\n                    if ($Property[0] -and $Property[1] -ne '') {\n                        if ($Property[1] -in 'False', 'True') {\n                            $MetaDataObject[\"$($Property[0])\"] = [bool] $Property[1]\n                        } else {\n                            $MetaDataObject[\"$($Property[0])\"] = $Property[1]\n                        }\n                    }\n                }\n            }\n            $MetaDataObject[\"Attributes\"] = $FileInformation.Attributes\n            $MetaDataObject['IsReadOnly'] = $FileInformation.IsReadOnly\n            $MetaDataObject['IsHidden'] = $FileInformation.Attributes -like '*Hidden*'\n            $MetaDataObject['IsSystem'] = $FileInformation.Attributes -like '*System*'\n            if ($Signature) {\n                $DigitalSignature = Get-AuthenticodeSignature -FilePath $FileInformation.Fullname\n                $MetaDataObject['SignatureCertificateSubject'] = $DigitalSignature.SignerCertificate.Subject\n                $MetaDataObject['SignatureCertificateIssuer'] = $DigitalSignature.SignerCertificate.Issuer\n                $MetaDataObject['SignatureCertificateSerialNumber'] = $DigitalSignature.SignerCertificate.SerialNumber\n                $MetaDataObject['SignatureCertificateNotBefore'] = $DigitalSignature.SignerCertificate.NotBefore\n                $MetaDataObject['SignatureCertificateNotAfter'] = $DigitalSignature.SignerCertificate.NotAfter\n                $MetaDataObject['SignatureCertificateThumbprint'] = $DigitalSignature.SignerCertificate.Thumbprint\n                $MetaDataObject['SignatureStatus'] = $DigitalSignature.Status\n                $MetaDataObject['IsOSBinary'] = $DigitalSignature.IsOSBinary\n            }\n            if ($HashAlgorithm -ne 'None') {\n                $MetaDataObject[$HashAlgorithm] = (Get-FileHash -LiteralPath $FileInformation.FullName -Algorithm $HashAlgorithm).Hash\n            }\n            if ($AsHashTable) {\n                $MetaDataObject\n            } else {\n                [PSCustomObject] $MetaDataObject\n            }\n        }\n    }\n}\n#Get-FileMetaData -File 'c:\\Support\\GitHub\\PSSharedGoods\\Public\\FilesFolders'"
  },
  {
    "path": "Public/FilesFolders/Get-FileName.ps1",
    "content": "function Get-FileName {\n    <#\n    .SYNOPSIS\n    Generates a temporary file name with the specified extension.\n\n    .DESCRIPTION\n    This function generates a temporary file name based on the provided extension.\n    It can generate a temporary file name in the system's temporary folder or just the file name itself.\n\n    .PARAMETER Name\n    Specifies the name of the temporary file. If not specified, the function generates a random file name.\n\n    .PARAMETER Extension\n    Specifies the extension for the temporary file name. Default is 'tmp'.\n\n    .PARAMETER Temporary\n    Indicates whether to generate a temporary file name in the system's temporary folder.\n\n    .PARAMETER TemporaryFileOnly\n    Indicates whether to generate only the temporary file name without the path.\n\n    .EXAMPLE\n    Get-FileName\n    Generates a temporary file name in the system's temporary folder.\n    Example output: C:\\Users\\przemyslaw.klys\\AppData\\Local\\Temp\\3ymsxvav.tmp\n\n    .EXAMPLE\n    Get-FileName -Temporary\n    Generates a temporary file name in the system's temporary folder.\n    Example output: C:\\Users\\przemyslaw.klys\\AppData\\Local\\Temp\\3ymsxvav.tmp\n\n    .EXAMPLE\n    Get-FileName -Temporary -Extension 'xlsx'\n    Generates a temporary file name with the specified extension in the system's temporary folder.\n    Example output: C:\\Users\\przemyslaw.klys\\AppData\\Local\\Temp\\3ymsxvav.xlsx\n\n    .EXAMPLE\n    Get-FileName -Name 'MyFile' -Temporary\n    Generates a temporary file name with the specified name in the system's temporary folder.\n    Example output: C:\\Users\\przemyslaw.klys\\AppData\\Local\\Temp\\MyFile_3ymsxvav.xlsx\n\n    .EXAMPLE\n    Get-FileName -Extension 'xlsx' -TemporaryFileOnly\n    Generates a temporary file name with the specified extension without the path.\n    Example output: 3ymsxvav.xlsx\n\n    .EXAMPLE\n    Get-FileName -Name 'MyFile' -TemporaryFileOnly\n    Generates a temporary file name with the specified name without the path.\n    Example output: MyFile_3ymsxvav.xlsx\n\n    .EXAMPLE\n    Get-FileName -Name 'MyFile' -Extension 'xlsx'\n    Generates a temporary file name with the specified name and extension.\n    Example output: C:\\Users\\przemyslaw.klys\\AppData\\Local\\Temp\\MyFile.xlsx\n    #>\n    [CmdletBinding()]\n    param(\n        [string] $Name,\n        [string] $Extension = 'tmp',\n        [switch] $Temporary,\n        [switch] $TemporaryFileOnly\n    )\n\n    if ($Name -and $Temporary) {\n        $NewName = \"$($Name)_$($([System.IO.Path]::GetRandomFileName()).Split('.')[0]).$Extension\"\n        return [io.path]::Combine([System.IO.Path]::GetTempPath(), $NewName)\n    } elseif ($Name -and $TemporaryFileOnly) {\n        return \"$($Name)_$($([System.IO.Path]::GetRandomFileName()).Split('.')[0]).$Extension\"\n    } elseif ($Name) {\n        $NewName = \"$Name.$Extension\"\n        return [io.path]::Combine([System.IO.Path]::GetTempPath(), $NewName)\n    } elseif ($Temporary) {\n        # C:\\Users\\przemyslaw.klys\\AppData\\Local\\Temp\\p0v4bbif.xlsx\n        return [io.path]::Combine([System.IO.Path]::GetTempPath(), \"$($([System.IO.Path]::GetRandomFileName()).Split('.')[0]).$Extension\")\n    } elseif ($TemporaryFileOnly) {\n        # Generates 3ymsxvav.tmp\n        return \"$($([System.IO.Path]::GetRandomFileName()).Split('.')[0]).$Extension\"\n    } else {\n        return [io.path]::Combine([System.IO.Path]::GetTempPath(), \"$($([System.IO.Path]::GetRandomFileName()).Split('.')[0]).$Extension\")\n    }\n}"
  },
  {
    "path": "Public/FilesFolders/Get-FileOwner.ps1",
    "content": "﻿function Get-FileOwner {\n    <#\n    .SYNOPSIS\n    Retrieves the owner of the specified file or folder.\n\n    .DESCRIPTION\n    This function retrieves the owner of the specified file or folder. It provides options to resolve the owner's identity and output the results as a hashtable or custom object.\n\n    .PARAMETER Path\n    Specifies the path to the file or folder.\n\n    .PARAMETER Recursive\n    Indicates whether to search for files recursively in subdirectories.\n\n    .PARAMETER JustPath\n    Specifies if only the path information should be returned.\n\n    .PARAMETER Resolve\n    Indicates whether to resolve the owner's identity.\n\n    .PARAMETER AsHashTable\n    Specifies if the output should be in hashtable format.\n\n    .EXAMPLE\n    Get-FileOwner -Path \"C:\\Example\\File.txt\"\n    Retrieves the owner of the specified file \"File.txt\".\n\n    .EXAMPLE\n    Get-FileOwner -Path \"C:\\Example\" -Recursive\n    Retrieves the owners of all files in the \"Example\" directory and its subdirectories.\n\n    .EXAMPLE\n    Get-FileOwner -Path \"C:\\Example\\File.txt\" -Resolve\n    Retrieves the owner of the specified file \"File.txt\" and resolves the owner's identity.\n\n    .EXAMPLE\n    Get-FileOwner -Path \"C:\\Example\\File.txt\" -AsHashTable\n    Retrieves the owner of the specified file \"File.txt\" and outputs the result as a hashtable.\n\n    #>\n    [cmdletBinding()]\n    param(\n        [Array] $Path,\n        [switch] $Recursive,\n        [switch] $JustPath,\n        [switch] $Resolve,\n        [switch] $AsHashTable\n    )\n    Begin {\n\n    }\n    Process {\n        foreach ($P in $Path) {\n            if ($P -is [System.IO.FileSystemInfo]) {\n                $FullPath = $P.FullName\n            } elseif ($P -is [string]) {\n                $FullPath = $P\n            }\n            if ($FullPath -and (Test-Path -Path $FullPath)) {\n                if ($JustPath) {\n                    $FullPath | ForEach-Object -Process {\n                        # $File = $_\n                        $ACL = Get-Acl -Path $_\n                        $Object = [ordered]@{\n                            FullName = $_\n                            Owner    = $ACL.Owner\n                        }\n                        if ($Resolve) {\n                            $Identity = Convert-Identity -Identity $ACL.Owner\n                            if ($Identity) {\n                                $Object['OwnerName'] = $Identity.Name\n                                $Object['OwnerSid'] = $Identity.SID\n                                $Object['OwnerType'] = $Identity.Type\n                            } else {\n                                $Object['OwnerName'] = ''\n                                $Object['OwnerSid'] = ''\n                                $Object['OwnerType'] = ''\n                            }\n                        }\n                        if ($AsHashTable) {\n                            $Object\n                        } else {\n                            [PSCustomObject] $Object\n                        }\n                    }\n                } else {\n                    Get-ChildItem -LiteralPath $FullPath -Recurse:$Recursive -Force | ForEach-Object -Process {\n                        $File = $_\n                        $ACL = Get-Acl -Path $File.FullName\n                        $Object = [ordered] @{\n                            FullName       = $_.FullName\n                            Extension      = $_.Extension\n                            CreationTime   = $_.CreationTime\n                            LastAccessTime = $_.LastAccessTime\n                            LastWriteTime  = $_.LastWriteTime\n                            Attributes     = $_.Attributes\n                            Owner          = $ACL.Owner\n                        }\n                        if ($Resolve) {\n                            $Identity = Convert-Identity -Identity $ACL.Owner\n                            if ($Identity) {\n                                $Object['OwnerName'] = $Identity.Name\n                                $Object['OwnerSid'] = $Identity.SID\n                                $Object['OwnerType'] = $Identity.Type\n                            } else {\n                                $Object['OwnerName'] = ''\n                                $Object['OwnerSid'] = ''\n                                $Object['OwnerType'] = ''\n                            }\n                        }\n                        if ($AsHashTable) {\n                            $Object\n                        } else {\n                            [PSCustomObject] $Object\n                        }\n                    }\n                }\n            }\n        }\n    }\n    End {\n\n    }\n}"
  },
  {
    "path": "Public/FilesFolders/Get-FilePermission.ps1",
    "content": "﻿function Get-FilePermission {\n    <#\n    .SYNOPSIS\n    Retrieves and displays file permissions for the specified file or folder.\n\n    .DESCRIPTION\n    This function retrieves and displays the file permissions for the specified file or folder. It provides options to filter permissions based on inheritance, resolve access control types, and include extended information.\n\n    .EXAMPLE\n    Get-FilePermission -Path \"C:\\Example\\File.txt\"\n    Description:\n    Retrieves and displays the permissions for the \"File.txt\" file.\n\n    .EXAMPLE\n    Get-FilePermission -Path \"D:\\Folder\" -Inherited\n    Description:\n    Retrieves and displays only the inherited permissions for the \"Folder\" directory.\n\n    .EXAMPLE\n    Get-FilePermission -Path \"E:\\Document.docx\" -ResolveTypes -Extended\n    Description:\n    Retrieves and displays the resolved access control types and extended information for the \"Document.docx\" file.\n\n    .NOTES\n    This function supports various options to customize the output and handle different permission scenarios.\n    #>\n    [alias('Get-PSPermissions', 'Get-FilePermissions')]\n    [cmdletBinding()]\n    param(\n        [Array] $Path,\n        [switch] $Inherited,\n        [switch] $NotInherited,\n        [switch] $ResolveTypes,\n        [switch] $Extended,\n        [switch] $IncludeACLObject,\n        [switch] $AsHashTable,\n        [System.Security.AccessControl.FileSystemSecurity] $ACLS\n    )\n    foreach ($P in $Path) {\n        if ($P -is [System.IO.FileSystemInfo]) {\n            $FullPath = $P.FullName\n        } elseif ($P -is [string]) {\n            $FullPath = $P\n        }\n        $TestPath = Test-Path -Path $FullPath\n        if ($TestPath) {\n            if (-not $ACLS) {\n                try {\n                    $ACLS = (Get-Acl -Path $FullPath -ErrorAction Stop)\n                } catch {\n                    Write-Warning -Message \"Get-FilePermission - Can't access $FullPath. Error $($_.Exception.Message)\"\n                    continue\n                }\n            }\n            $Output = foreach ($ACL in $ACLS.Access) {\n                if ($Inherited) {\n                    if ($ACL.IsInherited -eq $false) {\n                        # if it's not inherited and we require inherited lets continue\n                        continue\n                    }\n                }\n                if ($NotInherited) {\n                    if ($ACL.IsInherited -eq $true) {\n                        continue\n                    }\n                }\n                $TranslateRights = Convert-GenericRightsToFileSystemRights -OriginalRights $ACL.FileSystemRights\n                $ReturnObject = [ordered] @{ }\n                $ReturnObject['Path' ] = $FullPath\n                $ReturnObject['AccessControlType'] = $ACL.AccessControlType\n                if ($ResolveTypes) {\n                    $Identity = Convert-Identity -Identity $ACL.IdentityReference\n                    if ($Identity) {\n                        $ReturnObject['Principal'] = $ACL.IdentityReference\n                        $ReturnObject['PrincipalName'] = $Identity.Name\n                        $ReturnObject['PrincipalSid'] = $Identity.Sid\n                        $ReturnObject['PrincipalType'] = $Identity.Type\n                    } else {\n                        # this shouldn't happen because Identity should always return value\n                        $ReturnObject['Principal'] = $Identity\n                        $ReturnObject['PrincipalName'] = ''\n                        $ReturnObject['PrincipalSid'] = ''\n                        $ReturnObject['PrincipalType'] = ''\n                    }\n                } else {\n                    $ReturnObject['Principal'] = $ACL.IdentityReference.Value\n                }\n                $ReturnObject['FileSystemRights'] = $TranslateRights\n                $ReturnObject['IsInherited'] = $ACL.IsInherited\n                if ($Extended) {\n                    $ReturnObject['InheritanceFlags'] = $ACL.InheritanceFlags\n                    $ReturnObject['PropagationFlags'] = $ACL.PropagationFlags\n                }\n                if ($IncludeACLObject) {\n                    $ReturnObject['ACL'] = $ACL\n                    $ReturnObject['AllACL'] = $ACLS\n                }\n                if ($AsHashTable) {\n                    $ReturnObject\n                } else {\n                    [PSCustomObject] $ReturnObject\n                }\n            }\n            $Output\n        } else {\n            Write-Warning \"Get-PSPermissions - Path $Path doesn't exists. Skipping.\"\n        }\n    }\n}\n<#\n$Directories = @(\n    '\\\\ad1.ad.evotec.xyz\\SYSVOL'\n    Get-ChildItem -Path '\\\\ad1.ad.evotec.xyz\\SYSVOL' -Recurse -Directory\n)\n$Output = foreach ($Directory in $Directories) {\n    Get-PSPermissions -Path $Directory -NotInherited\n}\n$Output | Format-Table -a\n\n#>"
  },
  {
    "path": "Public/FilesFolders/Get-FileSize.ps1",
    "content": "function Get-FileSize {\n    <#\n    .SYNOPSIS\n    Get-FileSize function calculates the file size in human-readable format.\n\n    .DESCRIPTION\n    This function takes a file size in bytes and converts it into a human-readable format (e.g., KB, MB, GB, etc.).\n\n    .PARAMETER Bytes\n    Specifies the size of the file in bytes.\n\n    .EXAMPLE\n    Get-FileSize -Bytes 1024\n    Output: 1 KB\n\n    .EXAMPLE\n    Get-FileSize -Bytes 1048576\n    Output: 1 MB\n    #>\n    [CmdletBinding()]\n    param(\n        $Bytes\n    )\n    $sizes = 'Bytes,KB,MB,GB,TB,PB,EB,ZB' -split ','\n    for ($i = 0; ($Bytes -ge 1kb) -and ($i -lt $sizes.Count); $i++) {\n        $Bytes /= 1kb\n    }\n    $N = 2;\n    if ($i -eq 0) {\n        $N = 0\n    }\n    return \"{0:N$($N)} {1}\" -f $Bytes, $sizes[$i]\n}\n"
  },
  {
    "path": "Public/FilesFolders/Get-FilesInFolder.ps1",
    "content": "function Get-FilesInFolder {\n    <#\n    .SYNOPSIS\n    Retrieves a list of files in a specified folder with the option to filter by extension.\n\n    .DESCRIPTION\n    This function retrieves a list of files in the specified folder. By default, it includes all files with the '.evtx' extension, but you can specify a different extension using the $Extension parameter.\n\n    .PARAMETER Folder\n    Specifies the folder path from which to retrieve files.\n\n    .PARAMETER Extension\n    Specifies the file extension to filter by. Default value is '*.evtx'.\n\n    .EXAMPLE\n    Get-FilesInFolder -Folder \"C:\\Logs\"\n\n    Description:\n    Retrieves all files with the '.evtx' extension in the \"C:\\Logs\" folder.\n\n    .EXAMPLE\n    Get-FilesInFolder -Folder \"D:\\Documents\" -Extension '*.txt'\n\n    Description:\n    Retrieves all files with the '.txt' extension in the \"D:\\Documents\" folder.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string] $Folder,\n        [string] $Extension = '*.evtx'\n    )\n\n    $Files = Get-ChildItem -Path $Folder -Filter $Extension -Recurse\n    $ReturnFiles = foreach ($File in $Files) {\n        $File.FullName\n    }\n    return $ReturnFiles\n}"
  },
  {
    "path": "Public/FilesFolders/Get-FolderEncoding.ps1",
    "content": "﻿function Get-FolderEncoding {\n    <#\n    .SYNOPSIS\n    Analyzes file encodings in folders based on file extensions.\n\n    .DESCRIPTION\n    A user-friendly wrapper that analyzes encoding distribution across files in one or more folders,\n    filtered by file extensions. This function is ideal for understanding the current encoding state\n    of specific file types before performing conversions.\n\n    The function supports both single and multiple file extensions, with predefined file type groups\n    for common scenarios. It provides comprehensive analysis including encoding distribution,\n    inconsistencies, and recommendations.\n\n    .PARAMETER Path\n    The directory path to analyze. Can be a single directory or an array of directories.\n    Use '.' for the current directory.\n\n    .PARAMETER Extensions\n    File extensions to analyze. Can be specified with or without the leading dot.\n    Examples: 'ps1', '.ps1', @('ps1', 'psm1'), @('.cs', '.vb')\n\n    Common presets available via -FileType parameter for convenience.\n\n    .PARAMETER FileType\n    Predefined file type groups for common scenarios:\n    - PowerShell: .ps1, .psm1, .psd1, .ps1xml\n    - CSharp: .cs, .csx\n    - Web: .html, .css, .js, .json, .xml\n    - Scripts: .ps1, .py, .rb, .sh, .bat, .cmd\n    - Text: .txt, .md, .log, .config\n    - All: Analyzes all common text file types\n\n    .PARAMETER ExcludeDirectories\n    Directory names to exclude from analysis (e.g., '.git', 'bin', 'obj', 'node_modules').\n    Default excludes common build and version control directories.\n\n    .PARAMETER Recurse\n    Process files in subdirectories recursively. Default is $true.\n\n    .PARAMETER MaxDepth\n    Maximum directory depth to recurse when -Recurse is enabled. Default is unlimited.\n\n    .PARAMETER GroupByExtension\n    Group results by file extension to show encoding distribution per file type.\n\n    .PARAMETER ShowFiles\n    Include individual file details in the output. Default is $true.\n    Use -ShowFiles:$false to disable if you only want summary statistics.\n\n    .PARAMETER RecommendTarget\n    Provide encoding recommendations based on file types (e.g., UTF8BOM for PowerShell files).\n    Default is $true. Use -RecommendTarget:$false to disable recommendations.\n\n    .EXAMPLE\n    Get-FolderEncoding -Path . -Extensions 'ps1'\n\n    Analyze PowerShell files in the current directory with file details and recommendations (default behavior).\n\n    .EXAMPLE\n    Get-FolderEncoding -Path @('.\\Scripts', '.\\Modules') -FileType PowerShell -GroupByExtension\n\n    Analyze all PowerShell files in Scripts and Modules directories, grouped by extension.\n\n    .EXAMPLE\n    Get-FolderEncoding -Path . -Extensions @('cs', 'vb') -ShowFiles:$false\n\n    Analyze C# and VB.NET files showing only summary statistics, no individual file details.\n\n    .EXAMPLE\n    Get-FolderEncoding -Path .\\Source -FileType Web -ExcludeDirectories @('node_modules', 'dist')\n\n    Analyze web files, excluding build directories, with full details and recommendations.\n\n    .OUTPUTS\n    PSCustomObject with the following properties:\n    - Summary: Overall statistics and recommendations\n    - EncodingDistribution: Hashtable of encoding counts\n    - ExtensionAnalysis: Analysis grouped by file extension (if -GroupByExtension)\n    - Files: Individual file details (default: included)\n    - Recommendations: Encoding recommendations (default: included)\n\n    .NOTES\n    Author: PowerShell Encoding Tools\n\n    This function provides analysis capabilities to complement Convert-FolderEncoding.\n    Use this to understand your current encoding state before performing conversions.\n\n    PowerShell Encoding Notes:\n    - UTF8BOM is recommended for PowerShell files to ensure PS 5.1 compatibility\n    - Mixed encodings within a project can cause issues\n    - ASCII files are compatible with UTF8 but may need BOM for PowerShell\n    #>\n    [CmdletBinding(DefaultParameterSetName = 'Extensions')]\n    param(\n        [Parameter(Mandatory)]\n        [Alias('Directory', 'Folder')]\n        [string[]] $Path,\n\n        [Parameter(ParameterSetName = 'Extensions', Mandatory)]\n        [string[]] $Extensions,\n\n        [Parameter(ParameterSetName = 'FileType', Mandatory)]\n        [ValidateSet('PowerShell', 'CSharp', 'Web', 'Scripts', 'Text', 'All')]\n        [string] $FileType,\n\n        [string[]] $ExcludeDirectories = @('.git', '.vs', 'bin', 'obj', 'packages', 'node_modules', '.vscode', 'dist', 'build'),\n\n        [bool] $Recurse = $true,\n\n        [int] $MaxDepth,\n\n        [switch] $GroupByExtension,\n\n        [bool] $ShowFiles = $true,\n\n        [bool] $RecommendTarget = $true\n    )\n\n    # Validate paths\n    foreach ($singlePath in $Path) {\n        if (-not (Test-Path -LiteralPath $singlePath -PathType Container)) {\n            throw \"Directory path '$singlePath' not found or is not a directory\"\n        }\n    }\n\n    # Define file type mappings\n    $fileTypeMappings = @{\n        'PowerShell' = @('.ps1', '.psm1', '.psd1', '.ps1xml')\n        'CSharp'     = @('.cs', '.csx', '.csproj')\n        'Web'        = @('.html', '.htm', '.css', '.js', '.json', '.xml', '.xsl', '.xslt')\n        'Scripts'    = @('.ps1', '.py', '.rb', '.sh', '.bash', '.bat', '.cmd')\n        'Text'       = @('.txt', '.md', '.log', '.config', '.ini', '.conf', '.yaml', '.yml')\n        'All'        = @('.ps1', '.psm1', '.psd1', '.ps1xml', '.cs', '.csx', '.html', '.htm', '.css', '.js', '.json', '.xml', '.txt', '.md', '.py', '.rb', '.sh', '.bat', '.cmd', '.config', '.ini', '.yaml', '.yml')\n    }\n\n    # Define encoding recommendations by file type\n    $encodingRecommendations = @{\n        '.ps1'    = 'UTF8BOM'\n        '.psm1'   = 'UTF8BOM'\n        '.psd1'   = 'UTF8BOM'\n        '.ps1xml' = 'UTF8BOM'\n        '.cs'     = 'UTF8'\n        '.csx'    = 'UTF8'\n        '.html'   = 'UTF8'\n        '.htm'    = 'UTF8'\n        '.css'    = 'UTF8'\n        '.js'     = 'UTF8'\n        '.json'   = 'UTF8'\n        '.xml'    = 'UTF8'\n        '.txt'    = 'UTF8'\n        '.md'     = 'UTF8'\n        '.py'     = 'UTF8'\n        '.rb'     = 'UTF8'\n        '.sh'     = 'UTF8'\n        '.bat'    = 'UTF8'\n        '.cmd'    = 'UTF8'\n        '.config' = 'UTF8'\n        '.ini'    = 'UTF8'\n        '.yaml'   = 'UTF8'\n        '.yml'    = 'UTF8'\n    }\n\n    # Determine target extensions\n    if ($PSCmdlet.ParameterSetName -eq 'FileType') {\n        $targetExtensions = $fileTypeMappings[$FileType]\n        Write-Verbose \"Analyzing $FileType file type: $($targetExtensions -join ', ')\"\n    } else {\n        # Normalize extensions (ensure they start with a dot)\n        $targetExtensions = $Extensions | ForEach-Object {\n            if ($_.StartsWith('.')) { $_ } else { \".$_\" }\n        }\n        Write-Verbose \"Target extensions: $($targetExtensions -join ', ')\"\n    }\n\n    # Load encoding detection function\n    if (-not (Get-Command Get-FileEncoding -ErrorAction SilentlyContinue)) {\n        throw \"Get-FileEncoding function not found. Please ensure the encoding detection module is loaded.\"\n    }\n\n    # Collect all files to analyze\n    $allFiles = @()\n    $summary = @{\n        TotalDirectories     = $Path.Count\n        ProcessedDirectories = 0\n        TotalFiles           = 0\n        StartTime            = Get-Date\n    }\n\n    Write-Verbose \"Scanning directories for files...\"\n\n    foreach ($singlePath in $Path) {\n        Write-Verbose \"Processing directory: $singlePath\"\n        $summary.ProcessedDirectories++\n\n        try {\n            $gciParams = @{\n                LiteralPath = $singlePath\n                File        = $true\n            }\n\n            if ($Recurse) {\n                $gciParams.Recurse = $true\n                if ($MaxDepth) { $gciParams.Depth = $MaxDepth }\n            }\n\n            $directoryFiles = Get-ChildItem @gciParams | Where-Object {\n                # Filter by extension\n                $extension = $_.Extension.ToLower()\n                $extensionMatch = $targetExtensions -contains $extension\n\n                # Exclude directories if specified\n                $directoryExcluded = $false\n                if ($ExcludeDirectories -and $_.DirectoryName) {\n                    $relativePath = $_.DirectoryName.Replace($singlePath, '').TrimStart('\\', '/')\n                    $directoryExcluded = $ExcludeDirectories | Where-Object { $relativePath -like \"*$_*\" }\n                }\n\n                return $extensionMatch -and -not $directoryExcluded\n            }\n\n            $allFiles += $directoryFiles\n            $summary.TotalFiles += $directoryFiles.Count\n\n            Write-Verbose \"Found $($directoryFiles.Count) matching files in $singlePath\"\n\n        } catch {\n            Write-Error \"Error processing directory '$singlePath': $($_.Exception.Message)\"\n            continue\n        }\n    }\n\n    if ($allFiles.Count -eq 0) {\n        Write-Warning \"No files found matching the specified criteria.\"\n        Write-Verbose \"Extensions searched: $($targetExtensions -join ', ')\"\n        Write-Verbose \"Paths searched: $($Path -join ', ')\"\n        return\n    }\n\n    Write-Verbose \"Analyzing $($allFiles.Count) files across $($summary.ProcessedDirectories) directories\"\n\n    # Analyze file encodings\n    $encodingDistribution = @{}\n    $extensionAnalysis = @{}\n    $fileDetails = @()\n    $inconsistentExtensions = @()\n\n    $progressCounter = 0\n    foreach ($file in $allFiles) {\n        $progressCounter++\n        $percentComplete = [math]::Round(($progressCounter / $allFiles.Count) * 100, 1)\n\n        Write-Progress -Activity \"Analyzing file encodings\" -Status \"Processing $($file.Name) ($progressCounter of $($allFiles.Count))\" -PercentComplete $percentComplete\n\n        try {\n            $encoding = Get-FileEncoding -Path $file.FullName\n            $extension = $file.Extension.ToLower()\n\n            # Update encoding distribution\n            if ($encodingDistribution.ContainsKey($encoding)) {\n                $encodingDistribution[$encoding]++\n            } else {\n                $encodingDistribution[$encoding] = 1\n            }\n\n            # Update extension analysis\n            if (-not $extensionAnalysis.ContainsKey($extension)) {\n                $extensionAnalysis[$extension] = @{}\n            }\n            if ($extensionAnalysis[$extension].ContainsKey($encoding)) {\n                $extensionAnalysis[$extension][$encoding]++\n            } else {\n                $extensionAnalysis[$extension][$encoding] = 1\n            }\n\n            # Store file details if requested\n            if ($ShowFiles) {\n                $recommendedEncoding = if ($RecommendTarget -and $encodingRecommendations.ContainsKey($extension)) {\n                    $encodingRecommendations[$extension]\n                } else {\n                    $null\n                }\n\n                $fileDetails += [PSCustomObject]@{\n                    FullPath            = $file.FullName\n                    RelativePath        = $file.FullName.Replace((Get-Location).Path, '.').TrimStart('\\', '/')\n                    Extension           = $extension\n                    CurrentEncoding     = $encoding\n                    RecommendedEncoding = $recommendedEncoding\n                    NeedsConversion     = $recommendedEncoding -and ($encoding -ne $recommendedEncoding)\n                    Size                = $file.Length\n                    LastModified        = $file.LastWriteTime\n                }\n            }\n\n        } catch {\n            Write-Warning \"Could not analyze encoding for '$($file.FullName)': $($_.Exception.Message)\"\n            continue\n        }\n    }\n\n    Write-Progress -Activity \"Analyzing file encodings\" -Completed\n\n    # Identify extensions with mixed encodings\n    foreach ($ext in $extensionAnalysis.Keys) {\n        if ($extensionAnalysis[$ext].Keys.Count -gt 1) {\n            $inconsistentExtensions += $ext\n        }\n    }\n\n    # Generate recommendations\n    $recommendations = @()\n    if ($RecommendTarget) {\n        foreach ($ext in $targetExtensions) {\n            $recommendedEncoding = $encodingRecommendations[$ext]\n            if ($recommendedEncoding -and $extensionAnalysis.ContainsKey($ext)) {\n                $currentEncodings = $extensionAnalysis[$ext]\n                $needsConversion = $currentEncodings.Keys | Where-Object { $_ -ne $recommendedEncoding }\n\n                if ($needsConversion) {\n                    $totalFiles = ($currentEncodings.Values | Measure-Object -Sum).Sum\n                    $nonCompliantFiles = $needsConversion | ForEach-Object { $currentEncodings[$_] } | Measure-Object -Sum | Select-Object -ExpandProperty Sum\n\n                    $recommendations += [PSCustomObject]@{\n                        Extension           = $ext\n                        RecommendedEncoding = $recommendedEncoding\n                        TotalFiles          = $totalFiles\n                        CompliantFiles      = $totalFiles - $nonCompliantFiles\n                        NonCompliantFiles   = $nonCompliantFiles\n                        CurrentEncodings    = $currentEncodings\n                    }\n                }\n            }\n        }\n    }\n\n    # Build summary\n    $summary.EndTime = Get-Date\n    $summary.Duration = $summary.EndTime - $summary.StartTime\n    $summary.UniqueEncodings = $encodingDistribution.Keys.Count\n    $summary.MostCommonEncoding = ($encodingDistribution.GetEnumerator() | Sort-Object Value -Descending | Select-Object -First 1).Key\n    $summary.HasMixedEncodings = $inconsistentExtensions.Count -gt 0\n    $summary.InconsistentExtensions = $inconsistentExtensions\n\n    Write-Verbose \"Analysis completed: $($summary.TotalFiles) files, $($summary.UniqueEncodings) unique encodings\"\n    Write-Verbose \"Most common encoding: $($summary.MostCommonEncoding)\"\n    if ($summary.HasMixedEncodings) {\n        Write-Verbose \"Extensions with mixed encodings: $($inconsistentExtensions -join ', ')\"\n    }\n\n    # Build result object\n    $result = [PSCustomObject]@{\n        Summary              = [PSCustomObject]@{\n            TotalDirectories       = $summary.TotalDirectories\n            ProcessedDirectories   = $summary.ProcessedDirectories\n            TotalFiles             = $summary.TotalFiles\n            UniqueEncodings        = $summary.UniqueEncodings\n            MostCommonEncoding     = $summary.MostCommonEncoding\n            HasMixedEncodings      = $summary.HasMixedEncodings\n            InconsistentExtensions = $summary.InconsistentExtensions\n            Duration               = $summary.Duration\n            StartTime              = $summary.StartTime\n            EndTime                = $summary.EndTime\n        }\n        EncodingDistribution = $encodingDistribution\n        Files                = if ($ShowFiles) { $fileDetails } else { $null }\n        Recommendations      = if ($RecommendTarget) { $recommendations } else { $null }\n    }\n\n    if ($GroupByExtension) {\n        $result | Add-Member -NotePropertyName 'ExtensionAnalysis' -NotePropertyValue $extensionAnalysis\n    }\n\n    # Add a display summary method for better default output\n    $result | Add-Member -MemberType ScriptMethod -Name 'DisplaySummary' -Value {\n        Write-Host \"\"\n        Write-Host \"Folder Encoding Analysis Summary\" -ForegroundColor Green\n        Write-Host \"==================================\"\n        Write-Host \"Directories analyzed : $($this.Summary.ProcessedDirectories)\" -ForegroundColor Cyan\n        Write-Host \"Total files found    : $($this.Summary.TotalFiles)\" -ForegroundColor Cyan\n        Write-Host \"Unique encodings     : $($this.Summary.UniqueEncodings)\" -ForegroundColor Cyan\n        Write-Host \"Most common encoding : $($this.Summary.MostCommonEncoding)\" -ForegroundColor Green\n        Write-Host \"Mixed encodings      : $($this.Summary.HasMixedEncodings)\" -ForegroundColor $(if ($this.Summary.HasMixedEncodings) { 'Yellow' } else { 'Green' })\n\n        if ($this.Summary.HasMixedEncodings) {\n            Write-Host \"Inconsistent extensions: $($this.Summary.InconsistentExtensions -join ', ')\" -ForegroundColor Yellow\n        }\n\n        Write-Host \"\"\n        Write-Host \"Encoding Distribution:\" -ForegroundColor Blue\n        $this.EncodingDistribution.GetEnumerator() | Sort-Object Value -Descending | ForEach-Object {\n            $percentage = [math]::Round(($_.Value / $this.Summary.TotalFiles) * 100, 1)\n            $percentText = \"{0}%\" -f $percentage\n            Write-Host \"  $($_.Key): $($_.Value) files ($percentText)\" -ForegroundColor White\n        }\n\n        if ($this.Recommendations -and $this.Recommendations.Count -gt 0) {\n            Write-Host \"\"\n            Write-Host \"Recommendations:\" -ForegroundColor Magenta\n            foreach ($rec in $this.Recommendations) {\n                Write-Host \"  $($rec.Extension) files:\" -ForegroundColor White\n                Write-Host \"    Target encoding        : $($rec.RecommendedEncoding)\" -ForegroundColor Green\n                Write-Host \"    Files needing conversion: $($rec.NonCompliantFiles)/$($rec.TotalFiles)\" -ForegroundColor Yellow\n            }\n        }\n\n        Write-Host \"\"\n        Write-Host \"Analysis duration: $($this.Summary.Duration.TotalSeconds.ToString('F2')) seconds\" -ForegroundColor Gray\n    }\n\n    # Add a custom ToString method for better default display\n    $result | Add-Member -MemberType ScriptMethod -Name 'ToString' -Value {\n        \"Folder Encoding Analysis: $($this.Summary.TotalFiles) files, $($this.Summary.UniqueEncodings) encodings, Most common: $($this.Summary.MostCommonEncoding)\"\n    } -Force\n\n    return $result\n}\n"
  },
  {
    "path": "Public/FilesFolders/Get-PathSeparator.ps1",
    "content": "function Get-PathSeparator {\n    <#\n    .SYNOPSIS\n    Gets the path separator character used by the operating system.\n\n    .DESCRIPTION\n    This function retrieves the path separator character used by the operating system. It can be useful for handling file paths in a platform-independent manner.\n\n    .EXAMPLE\n    Get-PathSeparator\n    Output:\n    \\\n\n    .NOTES\n    The function uses [System.IO.Path]::PathSeparator to get the path separator character.\n    #>\n    [CmdletBinding()]\n    param()\n    return [IO.Path]::PathSeparator\n}"
  },
  {
    "path": "Public/FilesFolders/Get-PathTemporary.ps1",
    "content": "function Get-PathTemporary {\n    <#\n    .SYNOPSIS\n    Gets the path to the temporary directory.\n\n    .DESCRIPTION\n    This function retrieves the path to the system's temporary directory.\n\n    .EXAMPLE\n    Get-PathTemporary\n    Output:\n    C:\\Users\\Username\\AppData\\Local\\Temp\n\n    .NOTES\n    The function uses [System.IO.Path]::GetTempPath() to get the temporary directory path.\n    #>\n    [CmdletBinding()]\n    param()\n    return [IO.path]::GetTempPath()\n}"
  },
  {
    "path": "Public/FilesFolders/Get-TemporaryDirectory.ps1",
    "content": "function Get-TemporaryDirectory {\n    <#\n    .SYNOPSIS\n    Creates a temporary directory and returns its path.\n\n    .DESCRIPTION\n    This function generates a temporary directory with a unique name and returns the full path to the directory.\n\n    .EXAMPLE\n    $tempDir = Get-TemporaryDirectory\n    $tempDir\n    Output:\n    C:\\Users\\Username\\AppData\\Local\\Temp\\abcde12345\n\n    .NOTES\n    The temporary directory is created using a random string name with specified characteristics.\n    #>\n    param(\n\n    )\n    $TemporaryFolder = Get-RandomStringName -Size 13 -LettersOnly -ToLower\n    $TemporaryPath = [system.io.path]::GetTempPath()\n    $Output = New-Item -ItemType Directory -Path $TemporaryPath -Name $TemporaryFolder -Force\n    if (Test-Path -LiteralPath $Output.FullName) {\n        $Output\n    }\n}"
  },
  {
    "path": "Public/FilesFolders/Remove-FileItem.ps1",
    "content": "﻿function Remove-FileItem {\n    <#\n    .SYNOPSIS\n    Removes one or more files and/or folders using one of three methods:\n    Remove-Item, .NET Delete(), or move to Recycle Bin.\n\n    .DESCRIPTION\n    - If the path is a file, removes it in one shot.\n    - If the path is a folder and -SkipFolder is NOT used, removes that folder\n      in one shot (recursively if -Recursive is specified).\n    - If -SkipFolder is used (and the path is a folder), calls Remove-ChildItems\n      to remove only the folder's contents, leaving the folder itself.\n\n    Supports:\n     - RemoveItem, DotNetDelete, RecycleBin\n     - Retries\n     - WhatIf/Confirm\n     - Passthru (detailed objects)\n     - SimpleReturn (boolean overall result)\n\n    .PARAMETER Paths\n    One or more paths to files/folders.\n\n    .PARAMETER DeleteMethod\n    \"RemoveItem\", \"DotNetDelete\", or \"RecycleBin\". Defaults to \"RemoveItem\".\n\n    .PARAMETER Recursive\n    If set, allows recursive removal for folder contents.\n\n    .PARAMETER SkipTopFolder\n    If set for a folder, removes the contents only, not the folder itself.\n\n    .PARAMETER Retries\n    Specifies how many times to attempt removal before giving up. Defaults to 1.\n\n    .PARAMETER Include\n    Patterns (e.g., *.log) to include if removing child items individually.\n    Will work only if SkipTopFolder is used.\n\n    .PARAMETER Exclude\n    Patterns (e.g., *.log) to exclude if removing child items individually.\n    Will work only if SkipTopFolder is used.\n\n    .PARAMETER Filter\n    Filter for Get-ChildItem when removing child items individually.\n    Will work only if SkipTopFolder is used.\n\n    .PARAMETER Passthru\n    Outputs an object for each path with details on success or failure.\n\n    .PARAMETER SimpleReturn\n    Outputs a single boolean indicating overall success or failure.\n\n    .EXAMPLE\n    Remove-FileItem -Paths \"C:\\SomeFolder\" -DeleteMethod RemoveItem -Recursive -WhatIf\n\n    Shows which items would be removed, but doesn't actually remove them,\n    because -WhatIf is in effect.\n\n    .EXAMPLE\n    Remove-FileItem -Paths \"C:\\SomeFolder\", \"C:\\SomeFile.txt\" -Passthru -DeleteMethod DotNetDelete\n\n    Removes both the folder (and everything in it) and the file, then returns details on each removal attempt.\n\n    #>\n    [Alias('Remove-ItemAlternative')]\n    [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName = 'Include')]\n    param(\n        [Parameter(Mandatory, ValueFromPipeline, Position = 0)][Alias('LiteralPath', 'Path')][string[]] $Paths,\n\n        [ValidateSet(\"RemoveItem\", \"DotNetDelete\", \"RecycleBin\")]\n        [string] $DeleteMethod = \"RecycleBin\",\n\n        [switch] $Recursive,\n\n        [alias('SkipFolder')][switch] $SkipTopFolder,\n\n        [int] $Retries = 1,\n\n        [Parameter(ParameterSetName = 'Include')][string[]] $Include,\n\n        [Parameter(ParameterSetName = 'Exclude')][string[]] $Exclude,\n\n        [string] $Filter,\n\n        [switch] $Passthru,\n\n        [switch] $SimpleReturn\n    )\n\n    begin {\n        $Results = [System.Collections.Generic.List[PSObject]]::new()\n        $AllSucceeded = $true\n    }\n\n    process {\n        foreach ($Path in $Paths) {\n            # Resolve the path (handles .\\.. style paths).\n            $UnresolvedFullPath = $null\n            try {\n                $UnresolvedFullPath = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($Path)\n            } catch {\n                $UnresolvedFullPath = $null\n            }\n\n            if (-not $UnresolvedFullPath) {\n                $Message = \"Remove-FileItem - Unable to resolve path '$Path'.\"\n                if ($PSCmdlet.ErrorAction -eq 'Stop') {\n                    throw $Message\n                } else {\n                    Write-Warning -Message $Message\n                }\n                $AllSucceeded = $false\n\n                if ($Passthru) {\n                    $Results.Add(\n                        [PSCustomObject]@{\n                            Path         = $Path\n                            Status       = $false\n                            Reason       = \"Path could not be resolved.\"\n                            AttemptCount = 0\n                            WhatIf       = $WhatIfPreference\n                        }\n                    )\n                }\n                continue\n            }\n\n            if (-not (Test-Path -LiteralPath $UnresolvedFullPath)) {\n                $Message = \"Remove-FileItem - Path '$UnresolvedFullPath' does not exist.\"\n                if ($PSCmdlet.ErrorAction -eq 'Stop') {\n                    throw $Message\n                } else {\n                    Write-Warning -Message $Message\n                }\n                $AllSucceeded = $false\n                if ($Passthru) {\n                    $Results.Add(\n                        [PSCustomObject]@{\n                            Path         = $UnresolvedFullPath\n                            Status       = $false\n                            Reason       = \"Path does not exist.\"\n                            AttemptCount = 0\n                            WhatIf       = $WhatIfPreference\n                        }\n                    )\n                }\n                continue\n            }\n\n            $ItemInfo = Get-Item -LiteralPath $UnresolvedFullPath -Force\n            $IsDirectory = $ItemInfo.PSIsContainer\n\n            if ($IsDirectory -and $SkipTopFolder) {\n                # Remove only the contents, not the folder itself\n                $removeChildItemsSplat = @{\n                    TopLevelPath    = $UnresolvedFullPath\n                    DeleteMethod    = $DeleteMethod\n                    Recursive       = $Recursive\n                    Retries         = $Retries\n                    Include         = $Include\n                    Exclude         = $Exclude\n                    Filter          = $Filter\n                    Passthru        = $Passthru\n                    Results         = $Results\n                    AllSucceededRef = ([ref]$AllSucceeded)\n                }\n                Remove-ChildItems @removeChildItemsSplat\n            } else {\n                # Remove this path (file or folder) in one shot\n                $Attempt = 0\n                $Deleted = $false\n                $LastError = $null\n                $WhatIfUsed = $WhatIfPreference\n\n                while ($Attempt -lt $Retries -and -not $Deleted) {\n                    $Attempt++\n                    Write-Verbose -Message \"Remove-FileItem - Attempting to remove '$UnresolvedFullPath' (Attempt $Attempt of $Retries).\"\n\n                    if ($WhatIfUsed) {\n                        $LastError = \"Skipped because -WhatIf was used.\"\n                    }\n                    if ($PSCmdlet.ShouldProcess($UnresolvedFullPath, \"Remove top-level\")) {\n                        # If -WhatIf is set, ShouldProcess prints a \"What if: ...\" message,\n                        # but we can also choose to skip the removal logic to reflect the fact\n                        # that it wasn't physically removed.\n                        try {\n                            switch ($DeleteMethod) {\n                                'RemoveItem' {\n                                    if ($IsDirectory -and $Recursive) {\n                                        Remove-Item -LiteralPath $UnresolvedFullPath -Recurse -Force -ErrorAction Stop\n                                    } else {\n                                        Remove-Item -LiteralPath $UnresolvedFullPath -Force -ErrorAction Stop\n                                    }\n                                }\n                                'DotNetDelete' {\n                                    if ($IsDirectory) {\n                                        $DirInfo = [System.IO.DirectoryInfo] $UnresolvedFullPath\n                                        if ($Recursive) {\n                                            $DirInfo.Delete($true)\n                                        } else {\n                                            $DirInfo.Delete()\n                                        }\n                                    } else {\n                                        $FileInfo = [System.IO.FileInfo] $UnresolvedFullPath\n                                        $FileInfo.Delete()\n                                    }\n                                }\n                                'RecycleBin' {\n                                    $Shell = [Activator]::CreateInstance([Type]::GetTypeFromProgID(\"Shell.Application\"))\n                                    $FolderPath = Split-Path $UnresolvedFullPath\n                                    $Leaf = Split-Path $UnresolvedFullPath -Leaf\n                                    $Folder = $Shell.NameSpace($FolderPath)\n                                    if (-not $Folder) {\n                                        throw \"Could not open folder: $FolderPath\"\n                                    }\n                                    $ShellItem = $Folder.ParseName($Leaf)\n                                    if (-not $ShellItem) {\n                                        throw \"Item '$Leaf' not found in folder: $FolderPath\"\n                                    }\n                                    $ShellItem.InvokeVerb(\"delete\")\n                                }\n                            }\n                            $Deleted = $true\n                        } catch {\n                            $LastError = $_.Exception.Message\n                            Write-Verbose -Message \"Remove-FileItem - Error deleting '$UnresolvedFullPath': $LastError\"\n\n                            if ($PSCmdlet.ErrorAction -eq 'Stop') {\n                                if ($Attempt -ge $Retries) {\n                                    throw \"Remove-FileItem - Couldn't delete '$UnresolvedFullPath' after $Retries attempts. Error: $LastError\"\n                                }\n                            } else {\n                                if ($Attempt -ge $Retries) {\n                                    Write-Warning -Message \"Remove-FileItem - Couldn't delete '$UnresolvedFullPath' after $Retries attempts. Error: $LastError\"\n                                }\n                            }\n                        }\n                    }\n                    # If it wasn't actually deleted, we may loop again (retry).\n                }\n\n                if (-not $Deleted -and -not $WhatIfUsed) {\n                    $AllSucceeded = $false\n                }\n\n                # If -WhatIf was used, we consider it \"skipped\" but not a real failure.\n                if ($WhatIfUsed) {\n                    $AllSucceeded = $false\n                }\n\n                if ($Passthru) {\n                    $Results.Add(\n                        [PSCustomObject]@{\n                            Path         = $UnresolvedFullPath\n                            Status       = $Deleted\n                            Reason       = if ($Deleted) { $null } else { $LastError }\n                            AttemptCount = $Attempt\n                            WhatIf       = $WhatIfUsed\n                        }\n                    )\n                }\n            }\n        }\n    }\n    end {\n        if ($Passthru) {\n            $Results\n        } elseif ($SimpleReturn) {\n            $AllSucceeded\n        }\n    }\n}"
  },
  {
    "path": "Public/FilesFolders/Remove-FilePermission.ps1",
    "content": "function Remove-FilePermission {\n    <#\n    .SYNOPSIS\n    Removes specific or all access rules for a user or group from a file or folder.\n\n    .DESCRIPTION\n    This function removes specific or all access rules for a specified user or group from a file or folder. It can be used to manage file permissions effectively.\n\n    .PARAMETER Path\n    Specifies the path of the file or folder from which to remove access rules.\n\n    .PARAMETER UserOrGroup\n    Specifies the user or group for which access rules should be removed. If not specified, all access rules will be removed.\n\n    .PARAMETER All\n    Indicates whether all access rules for the specified file or folder should be removed.\n\n    .EXAMPLE\n    Remove-FilePermission -Path \"C:\\Example\\File.txt\" -UserOrGroup \"User1\"\n    Removes access rules for \"User1\" from the file \"File.txt\".\n\n    .EXAMPLE\n    Remove-FilePermission -Path \"C:\\Example\\Folder\" -All\n    Removes all access rules from the folder \"Folder\".\n\n    #>\n    [cmdletBinding()]\n    param(\n        [string] $Path,\n        [string] $UserOrGroup = \"\",\n        [switch] $All\n    )\n    $ACL = Get-Acl -Path $Path\n    if ($UserOrGroup -ne \"\") {\n        foreach ($access in $ACL.Access) {\n            if ($access.IdentityReference.Value -eq $UserOrGroup) {\n                $ACL.RemoveAccessRule($access) | Out-Null\n            }\n        }\n    }\n    if ($All -eq $true) {\n        foreach ($access in $ACL.Access) {\n            $ACL.RemoveAccessRule($access) | Out-Null\n        }\n\n    }\n    Set-Acl -Path $Path -AclObject $ACL\n}"
  },
  {
    "path": "Public/FilesFolders/Set-FileInheritance.ps1",
    "content": "function Set-FileInheritance {\n    <#\n    .SYNOPSIS\n    Sets or removes inheritance for a specified directory.\n\n    .DESCRIPTION\n    This function allows you to set or remove inheritance for a specified directory. You can choose to disable inheritance and optionally keep the inherited ACL.\n\n    .PARAMETER StartingDir\n    Specifies the directory for which to set or remove inheritance.\n\n    .PARAMETER DisableInheritance\n    Switch parameter to disable inheritance for the specified directory.\n\n    .PARAMETER KeepInheritedAcl\n    Switch parameter to keep the inherited ACL when disabling inheritance.\n\n    .EXAMPLE\n    Set-FileInheritance -StartingDir \"C:\\Example\" -DisableInheritance\n    Disables inheritance for the directory \"C:\\Example\".\n\n    .EXAMPLE\n    Set-FileInheritance -StartingDir \"D:\\Data\" -DisableInheritance -KeepInheritedAcl\n    Disables inheritance for the directory \"D:\\Data\" and keeps the inherited ACL.\n\n    #>\n    [cmdletBinding()]\n    param(\n        [string] $StartingDir,\n        [switch] $DisableInheritance,\n        [switch] $KeepInheritedAcl\n    )\n    $acl = Get-Acl -Path $StartingDir\n    $acl.SetAccessRuleProtection($DisableInheritance, $KeepInheritedAcl)\n    $acl | Set-Acl -Path $StartingDir\n}"
  },
  {
    "path": "Public/FilesFolders/Set-FileOwner.ps1",
    "content": "﻿function Set-FileOwner {\n    <#\n    .SYNOPSIS\n    Sets the owner of a file or folder.\n\n    .DESCRIPTION\n    This function sets the owner of a specified file or folder to the provided owner.\n\n    .PARAMETER Path\n    Specifies the path to the file or folder.\n\n    .PARAMETER Recursive\n    Indicates whether to process the items in the specified path recursively.\n\n    .PARAMETER Owner\n    Specifies the new owner for the file or folder.\n\n    .PARAMETER Exclude\n    Specifies an array of owners to exclude from ownership change.\n\n    .PARAMETER JustPath\n    Indicates whether to only change the owner of the specified path without recursing into subfolders.\n\n    .EXAMPLE\n    Set-FileOwner -Path \"C:\\Example\\File.txt\" -Owner \"DOMAIN\\User1\"\n\n    Description:\n    Sets the owner of the file \"File.txt\" to \"DOMAIN\\User1\".\n\n    .EXAMPLE\n    Set-FileOwner -Path \"C:\\Example\\Folder\" -Owner \"DOMAIN\\User2\" -Recursive\n\n    Description:\n    Sets the owner of the folder \"Folder\" and all its contents to \"DOMAIN\\User2\" recursively.\n\n    #>\n    [cmdletBinding(SupportsShouldProcess)]\n    param(\n        [Array] $Path,\n        [switch] $Recursive,\n        [string] $Owner,\n        [string[]] $Exlude,\n        [switch] $JustPath\n    )\n    <#\n    System.Security.Principal.NTAccount new(string domainName, string accountName)\n    System.Security.Principal.NTAccount new(string name)\n    #>\n    Begin { }\n    Process {\n        foreach ($P in $Path) {\n            if ($P -is [System.IO.FileSystemInfo]) {\n                $FullPath = $P.FullName\n            } elseif ($P -is [string]) {\n                $FullPath = $P\n            }\n            $OwnerTranslated = [System.Security.Principal.NTAccount]::new($Owner)\n            if ($FullPath -and (Test-Path -Path $FullPath)) {\n                if ($JustPath) {\n                    $FullPath | ForEach-Object -Process {\n                        $File = $_\n                        try {\n                            $ACL = Get-Acl -Path $File -ErrorAction Stop\n                        } catch {\n                            Write-Warning \"Set-FileOwner - Getting ACL failed with error: $($_.Exception.Message)\"\n                        }\n                        if ($ACL.Owner -notin $Exlude -and $ACL.Owner -ne $OwnerTranslated) {\n                            if ($PSCmdlet.ShouldProcess($File, \"Replacing owner $($ACL.Owner) to $OwnerTranslated\")) {\n                                try {\n                                    $ACL.SetOwner($OwnerTranslated)\n                                    Set-Acl -Path $File -AclObject $ACL -ErrorAction Stop\n                                } catch {\n                                    Write-Warning \"Set-FileOwner - Replacing owner $($ACL.Owner) to $OwnerTranslated failed with error: $($_.Exception.Message)\"\n                                }\n                            }\n                        }\n                    }\n                } else {\n                    Get-ChildItem -LiteralPath $FullPath -Recurse:$Recursive -ErrorAction SilentlyContinue -ErrorVariable err | ForEach-Object -Process {\n                        $File = $_\n                        try {\n                            $ACL = Get-Acl -Path $File.FullName -ErrorAction Stop\n                        } catch {\n                            Write-Warning \"Set-FileOwner - Getting ACL failed with error: $($_.Exception.Message)\"\n                        }\n                        if ($ACL.Owner -notin $Exlude -and $ACL.Owner -ne $OwnerTranslated) {\n                            if ($PSCmdlet.ShouldProcess($File.FullName, \"Replacing owner $($ACL.Owner) to $OwnerTranslated\")) {\n                                try {\n                                    $ACL.SetOwner($OwnerTranslated)\n                                    Set-Acl -Path $File.FullName -AclObject $ACL -ErrorAction Stop\n                                } catch {\n                                    Write-Warning \"Set-FileOwner - Replacing owner $($ACL.Owner) to $OwnerTranslated failed with error: $($_.Exception.Message)\"\n                                }\n                            }\n                        }\n                    }\n                    foreach ($e in $err) {\n                        Write-Warning \"Set-FileOwner - Errors processing $($e.Exception.Message) ($($e.CategoryInfo.Reason))\"\n                    }\n                }\n            }\n        }\n    }\n    End {\n\n    }\n}"
  },
  {
    "path": "Public/FilesFolders/Set-FilePermissions.ps1",
    "content": "function Set-FilePermission {\n    <#\n    .SYNOPSIS\n    Sets file permissions for a specified user or group on a given path.\n\n    .DESCRIPTION\n    This function sets file permissions for a specified user or group on a given path. It allows you to define the type of access control, inheritance flags, and propagation flags.\n\n    .PARAMETER Path\n    The path to the file or directory for which permissions need to be set.\n\n    .PARAMETER Principal\n    Specifies the user or group for which permissions are being set. Use the format 'domain\\username'.\n\n    .PARAMETER InheritedFolderPermissions\n    Specifies the inheritance flags for folder permissions. Default values are ContainerInherit and ObjectInherit.\n\n    .PARAMETER AccessControlType\n    Specifies the type of access control to be allowed or denied. Default is Allow.\n\n    .PARAMETER PropagationFlags\n    Specifies how the access control entries are propagated to child objects. Default is None.\n\n    .PARAMETER AclRightsToAssign\n    Specifies the file system rights to assign to the user or group.\n\n    .EXAMPLE\n    Set-FilePermission -Path \"C:\\Example\\File.txt\" -Principal \"domain\\username\" -AclRightsToAssign \"Modify\"\n    Sets Modify permissions for the user 'domain\\username' on the file \"File.txt\" located at \"C:\\Example\".\n\n    .EXAMPLE\n    Set-FilePermission -Path \"D:\\Data\" -Principal \"domain\\group\" -AclRightsToAssign \"FullControl\" -InheritedFolderPermissions @(\"ContainerInherit\")\n    Sets FullControl permissions for the group 'domain\\group' on the directory \"Data\" located at \"D:\\\" with inheritance only for subfolders.\n\n    .NOTES\n    File permissions are set using the Set-Acl cmdlet from the System.Security.AccessControl module.\n    #>\n    [cmdletBinding()]\n    param (\n        [string] $Path,\n        [alias('UserOrGroup')][string] $Principal,\n        [System.Security.AccessControl.InheritanceFlags] $InheritedFolderPermissions = @(\n            [System.Security.AccessControl.InheritanceFlags]::ContainerInherit,\n            [System.Security.AccessControl.InheritanceFlags]::ObjectInherit\n        ),\n        [System.Security.AccessControl.AccessControlType] $AccessControlType = [System.Security.AccessControl.AccessControlType]::Allow,\n        [System.Security.AccessControl.PropagationFlags] $PropagationFlags = [System.Security.AccessControl.PropagationFlags]::None,\n        [System.Security.AccessControl.FileSystemRights] $AclRightsToAssign\n    )\n    ### The possible values for Rights are:\n    # ListDirectory, ReadData, WriteData, CreateFiles, CreateDirectories, AppendData, Synchronize, FullControl\n    # ReadExtendedAttributes, WriteExtendedAttributes, Traverse, ExecuteFile, DeleteSubdirectoriesAndFiles, ReadAttributes\n    # WriteAttributes, Write, Delete, ReadPermissions, Read, ReadAndExecute, Modify, ChangePermissions, TakeOwnership\n\n    ### Principal expected\n    # domain\\username\n\n    ### Inherited folder permissions:\n    # Object inherit    - This folder and files. (no inheritance to subfolders)\n    # Container inherit - This folder and subfolders.\n    # Inherit only      - The ACE does not apply to the current file/directory\n\n    if ($Principal) {\n        $User = [System.Security.Principal.NTAccount]::new($Principal)\n\n        #define a new access rule.\n        $ACL = Get-Acl -Path $Path\n        <#\n        System.Security.AccessControl.FileSystemAccessRule new(System.Security.Principal.IdentityReference identity, System.Security.AccessControl.FileSystemRights fileSystemRights, System.Security.AccessControl.AccessControlType type)\n        System.Security.AccessControl.FileSystemAccessRule new(string identity, System.Security.AccessControl.FileSystemRights fileSystemRights, System.Security.AccessControl.AccessControlType type)\n        System.Security.AccessControl.FileSystemAccessRule new(System.Security.Principal.IdentityReference identity, System.Security.AccessControl.FileSystemRights fileSystemRights, System.Security.AccessControl.InheritanceFlags inheritanceFlags, System.Security.AccessControl.PropagationFlags propagationFlags, System.Security.AccessControl.AccessControlType type)\n        System.Security.AccessControl.FileSystemAccessRule new(string identity, System.Security.AccessControl.FileSystemRights fileSystemRights, System.Security.AccessControl.InheritanceFlags inheritanceFlags, System.Security.AccessControl.PropagationFlags propagationFlags, System.Security.AccessControl.AccessControlType type)\n        #>\n\n        $Rule = [System.Security.AccessControl.FileSystemAccessRule]::new($User, $AclRightsToAssign, $InheritedFolderPermissions, $PropagationFlags, $AccessControlType)\n        $ACL.SetAccessRule($Rule)\n        Try {\n            Set-Acl -Path $Path -AclObject $ACL\n        } catch {\n            Write-Warning \"Set-FilePermission - Setting permission $AclRightsToAssign failed with error: $($_.Exception.Message)\"\n        }\n    }\n}\n"
  },
  {
    "path": "Public/Get-ProtocolDefaults.ps1",
    "content": "﻿function Get-ProtocolDefaults {\n    <#\n    .SYNOPSIS\n    Gets a list of default settings for SSL/TLS protocols\n\n    .DESCRIPTION\n    Gets a list of default settings for SSL/TLS protocols\n\n    .PARAMETER WindowsVersion\n    Windows Version to search for\n\n    .PARAMETER AsList\n    If true, returns a list of protocol names for all Windows Versions, otherwise returns a single entry for the specified Windows Version\n\n    .EXAMPLE\n    Get-ProtocolDefaults -AsList | Format-Table\n\n    .EXAMPLE\n    Get-ProtocolDefaults -WindowsVersion 'Windows 10 1809' | Format-Table\n\n    .NOTES\n    Based on: https://docs.microsoft.com/en-us/windows/win32/secauthn/protocols-in-tls-ssl--schannel-ssp-\n\n    According to this https://github.com/MicrosoftDocs/windowsserverdocs/issues/2783 SCHANNEL service requires direct enablement so the list is kind of half useful\n    #>\n    [cmdletbinding(DefaultParameterSetName = 'WindowsVersion')]\n    param(\n        [Parameter(Mandatory, ParameterSetName = 'WindowsVersion')][string] $WindowsVersion,\n        [Parameter(Mandatory, ParameterSetName = 'AsList')][switch] $AsList\n    )\n\n    $Defaults = [ordered] @{\n        'Windows Server 2022'        = [ordered] @{\n            'Version'     = 'Windows Server 2022'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Not supported'\n            'SSL2Server'  = 'Not supported'\n            'SSL3Client'  = 'Disabled'\n            'SSL3Server'  = 'Disabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Enabled'\n            'TLS13Server' = 'Enabled'\n        }\n        'Windows Server 2019 20H2'   = [ordered] @{\n            'Version'     = 'Windows Server 2019 20H2'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Not supported'\n            'SSL2Server'  = 'Not supported'\n            'SSL3Client'  = 'Disabled'\n            'SSL3Server'  = 'Disabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        'Windows Server 2019 2004'   = [ordered] @{\n            'Version'     = 'Windows Server 2019 2004'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Not supported'\n            'SSL2Server'  = 'Not supported'\n            'SSL3Client'  = 'Disabled'\n            'SSL3Server'  = 'Disabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        'Windows Server 2019 1909'   = [ordered] @{\n            'Version'     = 'Windows Server 2019 1909'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Not supported'\n            'SSL2Server'  = 'Not supported'\n            'SSL3Client'  = 'Disabled'\n            'SSL3Server'  = 'Disabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        \"Windows Server 2019 1903\"   = [ordered] @{\n            'Version'     = 'Windows Server 2019 1903'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Not supported'\n            'SSL2Server'  = 'Not supported'\n            'SSL3Client'  = 'Disabled'\n            'SSL3Server'  = 'Disabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        \"Windows Server 2019 1809\"   = [ordered] @{\n            'Version'     = 'Windows Server 2019 1809'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Not supported'\n            'SSL2Server'  = 'Not supported'\n            'SSL3Client'  = 'Disabled'\n            'SSL3Server'  = 'Disabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        \"Windows Server 2016 1803\"   = [ordered] @{\n            'Version'     = 'Windows Server 2016 1803'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Not supported'\n            'SSL2Server'  = 'Not supported'\n            'SSL3Client'  = 'Disabled'\n            'SSL3Server'  = 'Disabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        \"Windows Server 2016 1607\"   = [ordered] @{\n            'Version'     = 'Windows Server 2019 1607'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Not supported'\n            'SSL2Server'  = 'Not supported'\n            'SSL3Client'  = 'Disabled'\n            'SSL3Server'  = 'Disabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        'Windows Server 2012 R2'     = [ordered] @{\n            'Version'     = 'Windows Server 2012 R2'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Disabled'\n            'SSL2Server'  = 'Disabled'\n            'SSL3Client'  = 'Enabled'\n            'SSL3Server'  = 'Enabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        'Windows Server 2012'        = [ordered] @{\n            'Version'     = 'Windows Server 2012'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Disabled'\n            'SSL2Server'  = 'Disabled'\n            'SSL3Client'  = 'Enabled'\n            'SSL3Server'  = 'Enabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        'Windows Server 2008 R2'     = [ordered] @{\n            'Version'     = 'Windows Server 2008 R2'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Disabled'\n            'SSL2Server'  = 'Enabled'\n            'SSL3Client'  = 'Enabled'\n            'SSL3Server'  = 'Enabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Disabled'\n            'TLS11Server' = 'Disabled'\n            'TLS12Client' = 'Disabled'\n            'TLS12Server' = 'Disabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        'Windows Server 2008'        = [ordered] @{\n            'Version'     = 'Windows Server 2008'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Disabled'\n            'SSL2Server'  = 'Enabled'\n            'SSL3Client'  = 'Enabled'\n            'SSL3Server'  = 'Enabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Disabled'\n            'TLS11Server' = 'Disabled'\n            'TLS12Client' = 'Disabled'\n            'TLS12Server' = 'Disabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n\n        'Windows 11 21H2'            = [ordered] @{\n            'Version'     = 'Windows 11 21H2'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Not supported'\n            'SSL2Server'  = 'Not supported'\n            'SSL3Client'  = 'Disabled'\n            'SSL3Server'  = 'Disabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Enabled'\n            'TLS13Server' = 'Enabled'\n        }\n        'Windows 10 21H1'            = [ordered] @{\n            'Version'     = 'Windows 10 21H1'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Not supported'\n            'SSL2Server'  = 'Not supported'\n            'SSL3Client'  = 'Disabled'\n            'SSL3Server'  = 'Disabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        'Windows 10 20H2'            = [ordered] @{\n            'Version'     = 'Windows 10 20H2'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Not supported'\n            'SSL2Server'  = 'Not supported'\n            'SSL3Client'  = 'Disabled'\n            'SSL3Server'  = 'Disabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        'Windows 10 2004'            = [ordered] @{\n            'Version'     = 'Windows 10 2004'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Not supported'\n            'SSL2Server'  = 'Not supported'\n            'SSL3Client'  = 'Disabled'\n            'SSL3Server'  = 'Disabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        'Windows 10 Insider Preview' = [ordered] @{\n            'Version'     = 'Windows 10 Insider Preview'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Not supported'\n            'SSL2Server'  = 'Not supported'\n            'SSL3Client'  = 'Disabled'\n            'SSL3Server'  = 'Disabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        \"Windows 10 1909\"            = [ordered] @{\n            'Version'     = 'Windows 10 1909'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Not supported'\n            'SSL2Server'  = 'Not supported'\n            'SSL3Client'  = 'Disabled'\n            'SSL3Server'  = 'Disabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        \"Windows 10 1903\"            = [ordered] @{\n            'Version'     = 'Windows 10 1903'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Not supported'\n            'SSL2Server'  = 'Not supported'\n            'SSL3Client'  = 'Disabled'\n            'SSL3Server'  = 'Disabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        \"Windows 10 1809\"            = [ordered] @{\n            'Version'     = 'Windows 10 1809'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Not supported'\n            'SSL2Server'  = 'Not supported'\n            'SSL3Client'  = 'Disabled'\n            'SSL3Server'  = 'Disabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        \"Windows 10 1803\"            = [ordered] @{\n            'Version'     = 'Windows 10 1803'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Not supported'\n            'SSL2Server'  = 'Not supported'\n            'SSL3Client'  = 'Disabled'\n            'SSL3Server'  = 'Disabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        \"Windows 10 1709\"            = [ordered] @{\n            'Version'     = 'Windows 10 1709'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Not supported'\n            'SSL2Server'  = 'Not supported'\n            'SSL3Client'  = 'Disabled'\n            'SSL3Server'  = 'Disabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        \"Windows 10 1703\"            = [ordered] @{\n            'Version'     = 'Windows 10 1703'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Not supported'\n            'SSL2Server'  = 'Not supported'\n            'SSL3Client'  = 'Disabled'\n            'SSL3Server'  = 'Disabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        \"Windows 10 1607\"            = [ordered] @{\n            'Version'     = 'Windows 10 1607'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Not supported'\n            'SSL2Server'  = 'Not supported'\n            'SSL3Client'  = 'Disabled'\n            'SSL3Server'  = 'Disabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        \"Windows 10 1511\"            = [ordered] @{\n            'Version'     = 'Windows 10 1511'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Disabled'\n            'SSL2Server'  = 'Disabled'\n            'SSL3Client'  = 'Enabled'\n            'SSL3Server'  = 'Enabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n        \"Windows 10 1507\"            = [ordered] @{\n            'Version'     = 'Windows 10 1507'\n            'PCT10'       = 'Not supported'\n            'SSL2Client'  = 'Disabled'\n            'SSL2Server'  = 'Disabled'\n            'SSL3Client'  = 'Enabled'\n            'SSL3Server'  = 'Enabled'\n            'TLS10Client' = 'Enabled'\n            'TLS10Server' = 'Enabled'\n            'TLS11Client' = 'Enabled'\n            'TLS11Server' = 'Enabled'\n            'TLS12Client' = 'Enabled'\n            'TLS12Server' = 'Enabled'\n            'TLS13Client' = 'Not supported'\n            'TLS13Server' = 'Not supported'\n        }\n    }\n    if ($AsList) {\n        foreach ($Key in $Defaults.Keys) {\n            [PSCustomObject] $Defaults[$Key]\n        }\n    } else {\n        if ($Defaults[$WindowsVersion]) {\n            $Defaults[$WindowsVersion]\n        } else {\n            [ordered] @{\n                'Version'     = 'Unknown'\n                'PCT10'       = 'Unknown'\n                'SSL2Client'  = 'Unknown'\n                'SSL2Server'  = 'Unknown'\n                'SSL3Client'  = 'Unknown'\n                'SSL3Server'  = 'Unknown'\n                'TLS10Client' = 'Unknown'\n                'TLS10Server' = 'Unknown'\n                'TLS11Client' = 'Unknown'\n                'TLS11Server' = 'Unknown'\n                'TLS12Client' = 'Unknown'\n                'TLS12Server' = 'Unknown'\n                'TLS13Client' = 'Unknown'\n                'TLS13Server' = 'Unknown'\n            }\n        }\n    }\n}"
  },
  {
    "path": "Public/GitHub/Get-GitHubLatestRelease.ps1",
    "content": "﻿function Get-GitHubLatestRelease {\n    <#\n    .SYNOPSIS\n    Gets one or more releases from GitHub repository\n\n    .DESCRIPTION\n    Gets one or more releases from GitHub repository\n\n    .PARAMETER Url\n    Url to github repository\n\n    .EXAMPLE\n    Get-GitHubLatestRelease -Url \"https://api.github.com/repos/evotecit/Testimo/releases\" | Format-Table\n\n    .NOTES\n    General notes\n    #>\n    [CmdLetBinding()]\n    param(\n        [parameter(Mandatory)][alias('ReleasesUrl')][uri] $Url\n    )\n    $ProgressPreference = 'SilentlyContinue'\n\n    $Responds = Test-Connection -ComputerName $URl.Host -Quiet -Count 1\n    if ($Responds) {\n        Try {\n            [Array] $JsonOutput = (Invoke-WebRequest -Uri $Url -ErrorAction Stop | ConvertFrom-Json)\n            foreach ($JsonContent in $JsonOutput) {\n                [PSCustomObject] @{\n                    PublishDate = [DateTime]  $JsonContent.published_at\n                    CreatedDate = [DateTime] $JsonContent.created_at\n                    PreRelease  = [bool] $JsonContent.prerelease\n                    Version     = [version] ($JsonContent.name -replace 'v', '')\n                    Tag         = $JsonContent.tag_name\n                    Branch      = $JsonContent.target_commitish\n                    Errors      = ''\n                }\n            }\n        } catch {\n            [PSCustomObject] @{\n                PublishDate = $null\n                CreatedDate = $null\n                PreRelease  = $null\n                Version     = $null\n                Tag         = $null\n                Branch      = $null\n                Errors      = $_.Exception.Message\n            }\n        }\n    } else {\n        [PSCustomObject] @{\n            PublishDate = $null\n            CreatedDate = $null\n            PreRelease  = $null\n            Version     = $null\n            Tag         = $null\n            Branch      = $null\n            Errors      = \"No connection (ping) to $($Url.Host)\"\n        }\n    }\n    $ProgressPreference = 'Continue'\n}"
  },
  {
    "path": "Public/GitHub/Get-GitHubVersion.ps1",
    "content": "﻿function Get-GitHubVersion {\n    <#\n    .SYNOPSIS\n    Get the latest version of a GitHub repository and compare with local version\n\n    .DESCRIPTION\n    Get the latest version of a GitHub repository and compare with local version\n\n    .PARAMETER Cmdlet\n    Cmdlet to find module for\n\n    .PARAMETER RepositoryOwner\n    Repository owner\n\n    .PARAMETER RepositoryName\n    Repository name\n\n    .EXAMPLE\n    Get-GitHubVersion -Cmdlet 'Start-DelegationModel' -RepositoryOwner 'evotecit' -RepositoryName 'DelegationModel'\n\n    .NOTES\n    General notes\n    #>\n    [cmdletBinding()]\n    param(\n        [Parameter(Mandatory)][string] $Cmdlet,\n        [Parameter(Mandatory)][string] $RepositoryOwner,\n        [Parameter(Mandatory)][string] $RepositoryName\n    )\n    $App = Get-Command -Name $Cmdlet -ErrorAction SilentlyContinue\n    if ($App) {\n        [Array] $GitHubReleases = (Get-GitHubLatestRelease -Url \"https://api.github.com/repos/$RepositoryOwner/$RepositoryName/releases\" -Verbose:$false)\n        $LatestVersion = $GitHubReleases[0]\n        if (-not $LatestVersion.Errors) {\n            if ($App.Version -eq $LatestVersion.Version) {\n                \"Current/Latest: $($LatestVersion.Version) at $($LatestVersion.PublishDate)\"\n            } elseif ($App.Version -lt $LatestVersion.Version) {\n                \"Current: $($App.Version), Published: $($LatestVersion.Version) at $($LatestVersion.PublishDate). Update?\"\n            } elseif ($App.Version -gt $LatestVersion.Version) {\n                \"Current: $($App.Version), Published: $($LatestVersion.Version) at $($LatestVersion.PublishDate). Lucky you!\"\n            }\n        } else {\n            \"Current: $($App.Version)\"\n        }\n    } else {\n        \"Current: Unknown\"\n    }\n}"
  },
  {
    "path": "Public/IP/Get-IPAddressRangeInformation.ps1",
    "content": "﻿function Get-IPAddressRangeInformation {\n    <#\n    .SYNOPSIS\n    Provides information about IP Address range\n\n    .DESCRIPTION\n    Provides information about IP Address range\n\n    .PARAMETER Network\n    Network in form of IP/NetworkLength (e.g. 10.2.10.0/24')\n\n    .PARAMETER IPAddress\n    IP Address to use\n\n    .PARAMETER NetworkLength\n    Network length to use\n\n    .PARAMETER CIDRObject\n    CIDRObject to use\n\n    .EXAMPLE\n    $CidrObject = @{\n        Ip            = '10.2.10.0'\n        NetworkLength = 24\n    }\n    Get-IPAddressRangeInformation -CIDRObject $CidrObject | Format-Table\n\n    .EXAMPLE\n    Get-IPAddressRangeInformation -Network '10.2.10.0/24' | Format-Table\n\n    .EXAMPLE\n    Get-IPAddressRangeInformation -IPAddress '10.2.10.0' -NetworkLength 24 | Format-Table\n\n    .NOTES\n    General notes\n    #>\n    [cmdletBinding(DefaultParameterSetName = 'Network')]\n    param(\n        [Parameter(ParameterSetName = 'Network', Mandatory)][string] $Network,\n        [Parameter(ParameterSetName = 'IPAddress', Mandatory)][string] $IPAddress,\n        [Parameter(ParameterSetName = 'IPAddress', Mandatory)][int] $NetworkLength,\n        [Parameter(ParameterSetName = 'CIDR', Mandatory)][psobject] $CIDRObject\n    )\n    $IPv4Regex = '(?:(?:0?0?\\d|0?[1-9]\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)\\.){3}(?:0?0?\\d|0?[1-9]\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)'\n\n    if ($Network) {\n        $CIDRObject = @{\n            Ip            = $Network.Split('/')[0]\n            NetworkLength = $Network.Split('/')[1]\n        }\n    } elseif ($IPAddress -and $NetworkLength) {\n        $CIDRObject = @{\n            Ip            = $IPAddress\n            NetworkLength = $NetworkLength\n        }\n    } elseif ($CIDRObject) {\n\n    } else {\n        Write-Error \"Get-IPAddressRangeInformation - Invalid parameters specified\"\n        return\n    }\n\n    $o = [ordered] @{}\n    $o.IP = [string] $CIDRObject.IP\n    $o.BinaryIP = Convert-IPToBinary $o.IP\n    if (-not $o.BinaryIP) {\n        return\n    }\n    $o.NetworkLength = [int32] $CIDRObject.NetworkLength\n    $o.SubnetMask = Convert-BinaryToIP ('1' * $o.NetworkLength).PadRight(32, '0')\n    $o.BinarySubnetMask = ('1' * $o.NetworkLength).PadRight(32, '0')\n    $o.BinaryNetworkAddress = $o.BinaryIP.SubString(0, $o.NetworkLength).PadRight(32, '0')\n    if ($Contains) {\n        if ($Contains -match \"\\A${IPv4Regex}\\z\") {\n            # Passing in IP to test, start binary and end binary.\n            return Test-IPIsInNetwork $Contains $o.BinaryNetworkAddress $o.BinaryNetworkAddress.SubString(0, $o.NetworkLength).PadRight(32, '1')\n        } else {\n            Write-Error \"Get-IPAddressRangeInformation - Invalid IPv4 address specified with -Contains\"\n            return\n        }\n    }\n    $o.NetworkAddress = Convert-BinaryToIP $o.BinaryNetworkAddress\n    if ($o.NetworkLength -eq 32 -or $o.NetworkLength -eq 31) {\n        $o.HostMin = $o.IP\n    } else {\n        $o.HostMin = Convert-BinaryToIP ([System.Convert]::ToString(([System.Convert]::ToInt64($o.BinaryNetworkAddress, 2) + 1), 2)).PadLeft(32, '0')\n    }\n    [string] $BinaryBroadcastIP = $o.BinaryNetworkAddress.SubString(0, $o.NetworkLength).PadRight(32, '1') # this gives broadcast... need minus one.\n    $o.BinaryBroadcast = $BinaryBroadcastIP\n    [int64] $DecimalHostMax = [System.Convert]::ToInt64($BinaryBroadcastIP, 2) - 1\n    [string] $BinaryHostMax = [System.Convert]::ToString($DecimalHostMax, 2).PadLeft(32, '0')\n    $o.HostMax = Convert-BinaryToIP $BinaryHostMax\n    $o.TotalHosts = [int64][System.Convert]::ToString(([System.Convert]::ToInt64($BinaryBroadcastIP, 2) - [System.Convert]::ToInt64($o.BinaryNetworkAddress, 2) + 1))\n    $o.UsableHosts = $o.TotalHosts - 2\n    # ugh, exceptions for network lengths from 30..32\n    if ($o.NetworkLength -eq 32) {\n        $o.Broadcast = $Null\n        $o.UsableHosts = [int64] 1\n        $o.TotalHosts = [int64] 1\n        $o.HostMax = $o.IP\n    } elseif ($o.NetworkLength -eq 31) {\n        $o.Broadcast = $Null\n        $o.UsableHosts = [int64] 2\n        $o.TotalHosts = [int64] 2\n        # Override the earlier set value for this (bloody exceptions).\n        [int64] $DecimalHostMax2 = [System.Convert]::ToInt64($BinaryBroadcastIP, 2) # not minus one here like for the others\n        [string] $BinaryHostMax2 = [System.Convert]::ToString($DecimalHostMax2, 2).PadLeft(32, '0')\n        $o.HostMax = Convert-BinaryToIP $BinaryHostMax2\n    } elseif ($o.NetworkLength -eq 30) {\n        $o.UsableHosts = [int64] 2\n        $o.TotalHosts = [int64] 4\n        $o.Broadcast = Convert-BinaryToIP $BinaryBroadcastIP\n    } else {\n        $o.Broadcast = Convert-BinaryToIP $BinaryBroadcastIP\n    }\n    if ($Enumerate) {\n        $IPRange = @(Get-IPRange $o.BinaryNetworkAddress $o.BinaryNetworkAddress.SubString(0, $o.NetworkLength).PadRight(32, '1'))\n        if ((31, 32) -notcontains $o.NetworkLength ) {\n            $IPRange = $IPRange[1..($IPRange.Count - 1)] # remove first element\n            $IPRange = $IPRange[0..($IPRange.Count - 2)] # remove last element\n        }\n        $o.IPEnumerated = $IPRange\n    } else {\n        $o.IPEnumerated = @()\n    }\n    [PSCustomObject]$o\n}"
  },
  {
    "path": "Public/Logging/Set-LoggingCapabilities.ps1",
    "content": "﻿function Set-LoggingCapabilities {\n    <#\n    .SYNOPSIS\n    Sets up logging capabilities by managing log files.\n\n    .DESCRIPTION\n    This function sets up logging capabilities by creating the necessary directories and managing the number of log files based on the specified maximum.\n\n    .PARAMETER LogPath\n    The path where the log files will be stored.\n\n    .PARAMETER ScriptPath\n    The path of the script that generates the logs.\n\n    .PARAMETER LogMaximum\n    The maximum number of log files to keep. Older files will be deleted if this limit is exceeded.\n\n    .PARAMETER ShowTime\n    Switch to include timestamps in the log entries.\n\n    .PARAMETER TimeFormat\n    The format of the timestamps in the log entries.\n\n    .PARAMETER ParameterPSDefaultParameterValues\n    The hashtable of default parameter values for the Write-Color function.\n    If this parameter is not provided, the function will create a new hashtable.\n    This will only work properly if the function is nested as private function in another module.\n    It's advised to provide the hashtable from the parent function for this to work always.\n\n    .EXAMPLE\n    Set-LoggingCapabilities -LogPath \"C:\\Logs\\log.log\" -ScriptPath \"C:\\Scripts\\script.ps1\" -LogMaximum 10 -ShowTime -TimeFormat \"yyyy-MM-dd HH:mm:ss\" -ParameterPSDefaultParameterValues $Script:PSDefaultParameterValues\n\n    .EXAMPLE\n    Set-LoggingCapabilities -LogPath \"C:\\Logs\\log.log\" -ScriptPath \"C:\\Scripts\\script.ps1\" -LogMaximum 10 -ShowTime -TimeFormat \"yyyy-MM-dd HH:mm:ss\"\n\n    .NOTES\n    This function is used in:\n    - CleanupMonster\n    - PasswordSolution\n    - SharePointEssentials\n\n    And many other scripts.\n    #>\n    [CmdletBinding()]\n    param(\n        [Alias('Path', 'Log', 'Folder', 'LiteralPath', 'FilePath')][string] $LogPath,\n        [string] $ScriptPath,\n        [Alias('Maximum')][int] $LogMaximum,\n        [switch] $ShowTime,\n        [string] $TimeFormat,\n        [System.Collections.IDictionary] $ParameterPSDefaultParameterValues\n    )\n    if (-not $ParameterPSDefaultParameterValues) {\n        $Script:PSDefaultParameterValues = @{\n            \"Write-Color:LogFile\"    = $LogPath\n            \"Write-Color:ShowTime\"   = if ($PSBoundParameters.ContainsKey('ShowTime')) { $ShowTime.IsPresent } else { $null }\n            \"Write-Color:TimeFormat\" = $TimeFormat\n        }\n    } else {\n        $ParameterPSDefaultParameterValues[\"Write-Color:LogFile\"] = $LogPath\n        $ParameterPSDefaultParameterValues[\"Write-Color:ShowTime\"] = if ($PSBoundParameters.ContainsKey('ShowTime')) { $ShowTime.IsPresent } else { $null }\n        $ParameterPSDefaultParameterValues[\"Write-Color:TimeFormat\"] = $TimeFormat\n    }\n    if ($LogPath) {\n        try {\n            $FolderPath = [io.path]::GetDirectoryName($LogPath)\n            if (-not (Test-Path -LiteralPath $FolderPath)) {\n                $null = New-Item -Path $FolderPath -ItemType Directory -Force -WhatIf:$false\n            }\n            if ($LogMaximum -gt 0) {\n                if ($ScriptPath) {\n                    $ScriptPathFolder = [io.path]::GetDirectoryName($ScriptPath)\n                    if ($ScriptPathFolder -eq $FolderPath) {\n                        Write-Color -Text '[i] ', \"LogMaximum is set to \", $LogMaximum, \" but log files are in the same folder as the script. Cleanup disabled.\" -Color Yellow, White, DarkCyan, White\n                        return\n                    }\n                    # Get the extension of the log file\n                    $LogPathExtension = [io.path]::GetExtension($LogPath)\n                    # Get the log files, sort them by creation time, and skip the first $LogMaximum\n                    if ($LogPathExtension) {\n                        # If the log file has an extension, filter the files by that extension to prevent deleting other files\n                        $CurrentLogs = Get-ChildItem -LiteralPath $FolderPath -Filter \"*$LogPathExtension\" -ErrorAction Stop | Sort-Object -Property CreationTime -Descending | Select-Object -Skip $LogMaximum\n                    } else {\n                        $CurrentLogs = $null\n                        Write-Color -Text '[i] ', \"Log file has no extension (?!). Cleanup disabled.\" -Color Yellow, White, DarkCyan, White\n                    }\n                    if ($CurrentLogs) {\n                        Write-Color -Text '[i] ', \"Logs directory has more than \", $LogMaximum, \" log files. Cleanup required...\" -Color Yellow, DarkCyan, Red, DarkCyan\n                        foreach ($Log in $CurrentLogs) {\n                            try {\n                                Remove-Item -LiteralPath $Log.FullName -Confirm:$false -WhatIf:$false\n                                Write-Color -Text '[+] ', \"Deleted \", \"$($Log.FullName)\" -Color Yellow, White, Green\n                            } catch {\n                                Write-Color -Text '[-] ', \"Couldn't delete log file $($Log.FullName). Error: ', \"$($_.Exception.Message) -Color Yellow, White, Red\n                            }\n                        }\n                    }\n                } else {\n                    Write-Color -Text '[i] ', \"LogMaximum is set to \", $LogMaximum, \" but no script path detected. Most likely running interactively. Cleanup disabled.\" -Color Yellow, White, DarkCyan, White\n                }\n            } else {\n                Write-Color -Text '[i] ', \"LogMaximum is set to 0 (Unlimited). No log files will be deleted.\" -Color Yellow, DarkCyan\n            }\n        } catch {\n            Write-Color -Text \"[e] \", \"Couldn't create the log directory. Error: $($_.Exception.Message)\" -Color Yellow, Red\n            $Script:PSDefaultParameterValues[\"Write-Color:LogFile\"] = $null\n        }\n    } else {\n        $Script:PSDefaultParameterValues[\"Write-Color:LogFile\"] = $null\n    }\n    Remove-EmptyValue -Hashtable $Script:PSDefaultParameterValues\n}"
  },
  {
    "path": "Public/Logging/Set-ReportingCapabilities.ps1",
    "content": "﻿function Set-ReportingCapabilities {\n    <#\n    .SYNOPSIS\n    Sets up reporting capabilities by managing report files.\n\n    .DESCRIPTION\n    This function sets up reporting capabilities by creating the necessary directories and managing the number of report files based on the specified maximum.\n\n    .PARAMETER ReportPath\n    The path where the report files will be stored.\n\n    .PARAMETER ScriptPath\n    The path of the script that generates the reports.\n\n    .PARAMETER ReportMaximum\n    The maximum number of report files to keep. Older files will be deleted if this limit is exceeded.\n\n    .EXAMPLE\n    Set-ReportingCapabilities -ReportPath \"C:\\Reports\\report.log\" -ScriptPath \"C:\\Scripts\\script.ps1\" -ReportMaximum 10\n\n    .NOTES\n    This function is used in:\n    - CleanupMonster\n    - PasswordSolution\n    - SharePointEssentials\n\n    And many other scripts.\n    #>\n    [CmdletBinding()]\n    param(\n        [alias('Path', 'LiteralPath', 'FilePath')][string] $ReportPath,\n        [string] $ScriptPath,\n        [Alias('Maximum', 'Count')][int] $ReportMaximum\n    )\n    if ($ReportPath) {\n        try {\n            $FolderPath = [io.path]::GetDirectoryName($ReportPath)\n            if (-not (Test-Path -LiteralPath $FolderPath -ErrorAction Stop)) {\n                $null = New-Item -Path $FolderPath -ItemType Directory -Force -WhatIf:$false -ErrorAction Stop\n            }\n            if ($ReportMaximum -gt 0) {\n                if ($ScriptPath) {\n                    $ScriptPathFolder = [io.path]::GetDirectoryName($ScriptPath)\n                    if ($ScriptPathFolder -eq $FolderPath) {\n                        Write-Color -Text '[i] ', \"ReportMaximum is set to \", $ReportMaximum, \" but report files are in the same folder as the script. Cleanup disabled.\" -Color Yellow, White, DarkCyan, White\n                        return\n                    }\n                }\n                # Get the extension of the report file\n                $ReportPathExtension = [io.path]::GetExtension($ReportPath)\n                # Get the report files, sort them by creation time, and skip the first $ReportMaximum\n                if ($ReportPathExtension) {\n                    # If the report file has an extension, filter the files by that extension to prevent deleting other files\n                    $CurrentReports = Get-ChildItem -LiteralPath $FolderPath -Filter \"*$ReportPathExtension\" -ErrorAction Stop | Sort-Object -Property CreationTime -Descending | Select-Object -Skip $ReportMaximum\n                } else {\n                    $CurrentReports = $null\n                    Write-Color -Text '[i] ', \"Report file has no extension (?!). Cleanup disabled.\" -Color Yellow, White, DarkCyan, White\n                }\n                if ($CurrentReports) {\n                    Write-Color -Text '[i] ', \"Reporting directory has more than \", $ReportMaximum, \" report files. Cleanup required...\" -Color Yellow, DarkCyan, Red, DarkCyan\n                    foreach ($Report in $CurrentReports) {\n                        try {\n                            Remove-Item -LiteralPath $Report.FullName -Confirm:$false -WhatIf:$false\n                            Write-Color -Text '[+] ', \"Deleted \", \"$($Report.FullName)\" -Color Yellow, White, Green\n                        } catch {\n                            Write-Color -Text '[-] ', \"Couldn't delete report file $($Report.FullName). Error: ', \"$($_.Exception.Message) -Color Yellow, White, Red\n                        }\n                    }\n                }\n            } else {\n                Write-Color -Text '[i] ', \"ReportMaximum is set to 0 (Unlimited). No report files will be deleted.\" -Color Yellow, DarkCyan\n            }\n        } catch {\n            Write-Color -Text \"[e] \", \"Couldn't create the reporting directory. Error: $($_.Exception.Message)\" -Color Yellow, Red\n        }\n    }\n}"
  },
  {
    "path": "Public/Objects/Clean-DataInformation.ps1",
    "content": "﻿function Clear-DataInformation {\n    <#\n    .SYNOPSIS\n    Cleans up data information by removing empty values and specified keys.\n\n    .DESCRIPTION\n    The Clear-DataInformation function removes empty values and specified keys from the provided data. It iterates through the data structure and removes keys with null values or keys not in the specified types required array. It also removes empty domains and the 'FoundDomains' key if it becomes empty.\n\n    .PARAMETER Data\n    The data structure containing information to be cleaned.\n\n    .PARAMETER TypesRequired\n    An array of types that are required to be kept in the data structure.\n\n    .PARAMETER DontRemoveSupportData\n    A switch parameter to indicate whether to skip removing keys not in TypesRequired.\n\n    .PARAMETER DontRemoveEmpty\n    A switch parameter to indicate whether to skip removing keys with null values.\n\n    .EXAMPLE\n    $data = @{\n        FoundDomains = @{\n            Domain1 = @{\n                Key1 = 'Value1'\n                Key2 = $null\n            }\n            Domain2 = @{\n                Key1 = 'Value1'\n                Key2 = 'Value2'\n            }\n        }\n    }\n    Clear-DataInformation -Data $data -TypesRequired @('Key1') -DontRemoveSupportData\n\n    This example removes keys with null values from the 'FoundDomains' data structure, keeping only keys of type 'Key1'.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [System.Collections.IDictionary] $Data,\n        [Array] $TypesRequired,\n        [switch] $DontRemoveSupportData,\n        [switch] $DontRemoveEmpty\n    )\n    # Check each domain for empty values and remove if empty\n    foreach ($Domain in $Data.FoundDomains.Keys) {\n        $RemoveDomainKeys = foreach ($Key in $Data.FoundDomains.$Domain.Keys) {\n            if ($null -eq $Data.FoundDomains.$Domain.$Key) {\n                if (-not $DontRemoveEmpty) {\n                    $Key\n                }\n                continue\n            }\n            if ($Key -notin $TypesRequired -and $DontRemoveSupportData -eq $false) {\n                $Key\n            }\n        }\n        foreach ($Key in $RemoveDomainKeys) {\n            $Data.FoundDomains.$Domain.Remove($Key)\n        }\n    }\n\n    # Remove domains if empty\n    $RemoveDomains = foreach ($Domain in $Data.FoundDomains.Keys) {\n        if ($Data.FoundDomains.$Domain.Count -eq 0) {\n            $Domain\n        }\n    }\n    foreach ($Domain in $RemoveDomains) {\n        $Data.FoundDomains.Remove($Domain)\n    }\n    # Remove FoundDomains if empty\n    if ($Data.FoundDomains.Count -eq 0) {\n        $Data.Remove('FoundDomains')\n    }\n\n    # Remove empty keys in Forest\n    $RemoveKeys = foreach ($Key in $Data.Keys) {\n        if ($Key -eq 'FoundDomains') {\n            # Skip this key\n            continue\n        }\n        if ($null -eq $Data.$Key) {\n            if (-not $DontRemoveEmpty) {\n                $Key\n            }\n            continue\n        }\n        if ($Key -notin $TypesRequired -and $DontRemoveSupportData -eq $false) {\n            $Key\n        }\n    }\n    foreach ($Key in $RemoveKeys) {\n        $Data.Remove($Key)\n    }\n}"
  },
  {
    "path": "Public/Objects/Compare-MultipleObjects.ps1",
    "content": "﻿function Compare-MultipleObjects {\n    <#\n    .SYNOPSIS\n    Compares multiple objects based on specified properties and displays differences.\n\n    .DESCRIPTION\n    The Compare-MultipleObjects function compares multiple objects based on specified properties and displays differences in a structured format. It provides options to customize the comparison output and handle various scenarios.\n\n    .PARAMETER Objects\n    Specifies the list of objects to compare.\n\n    .PARAMETER ObjectsName\n    Specifies an array of names for the objects being compared.\n\n    .PARAMETER CompareSorted\n    Indicates whether to compare objects in a sorted manner.\n\n    .PARAMETER FormatOutput\n    Indicates whether to format the output for better readability.\n\n    .PARAMETER FormatDifferences\n    Indicates whether to format and highlight the differences in the output.\n\n    .PARAMETER Summary\n    Indicates whether to display a summary of the comparison results.\n\n    .PARAMETER Splitter\n    Specifies the delimiter to use when joining property values.\n\n    .PARAMETER Property\n    Specifies the properties to compare across objects.\n\n    .PARAMETER ExcludeProperty\n    Specifies properties to exclude from the comparison.\n\n    .PARAMETER AllProperties\n    Indicates whether to compare all properties of the objects.\n\n    .PARAMETER SkipProperties\n    Indicates whether to skip comparing properties.\n\n    .PARAMETER First\n    Specifies the number of first objects to consider for comparison.\n\n    .PARAMETER Last\n    Specifies the number of last objects to consider for comparison.\n\n    .PARAMETER Replace\n    Specifies replacement values for specific properties.\n\n    .PARAMETER FlattenObject\n    Indicates whether to flatten the object structure for comparison.\n\n    .EXAMPLE\n    Compare-MultipleObjects -Objects $objects -Property 'Name', 'Age' -FormatOutput\n\n    Description:\n    Compares the objects in the $objects array based on the 'Name' and 'Age' properties and formats the output for better readability.\n\n    .EXAMPLE\n    Compare-MultipleObjects -Objects $objects -Property 'Status' -FormatDifferences\n\n    Description:\n    Compares the objects in the $objects array based on the 'Status' property and highlights the differences in the output.\n\n    #>\n    [CmdLetBinding()]\n    param(\n        [System.Collections.IList] $Objects,\n        [Array] $ObjectsName = @(),\n        [switch] $CompareSorted,\n        [switch] $FormatOutput,\n        [switch] $FormatDifferences,\n        [switch] $Summary,\n        [string] $Splitter = ', ',\n        [string[]] $Property,\n        [string[]] $ExcludeProperty,\n        [switch] $AllProperties,\n        [switch] $SkipProperties,\n        [int] $First,\n        [int] $Last,\n        [Array] $Replace,\n        [switch] $FlattenObject\n    )\n    if ($null -eq $Objects -or $Objects.Count -eq 1) {\n        Write-Warning \"Compare-MultipleObjects - Unable to compare objects. Not enough objects to compare ($($Objects.Count)).\"\n        return\n    }\n    if (-not $ObjectsName) {\n        $ObjectsName = @()\n    }\n    if ($ObjectsName.Count -gt 0 -and $Objects.Count -gt $ObjectsName.Count) {\n        #$ObjectsName = @()\n        Write-Warning -Message \"Compare-MultipleObjects - Unable to rename objects. ObjectsName small then amount of Objects ($($Objects.Count)).\"\n    }\n\n    # Default Select-Object -Unique is case sensitive, Sort-Object -Unique isn't but it sorts object.\n    # Below is function that solves this, ugly but it works\n    function Compare-TwoArrays {\n        [CmdLetBinding()]\n        param(\n            [string] $FieldName,\n            [Array] $Object1,\n            [Array] $Object2,\n            [Array] $Replace\n        )\n        $Result = [ordered] @{\n            Status = $false\n            Same   = [System.Collections.Generic.List[string]]::new()\n            Add    = [System.Collections.Generic.List[string]]::new()\n            Remove = [System.Collections.Generic.List[string]]::new()\n        }\n\n        if ($Replace) {\n            foreach ($R in $Replace) {\n                # if no keys are given replace is for all objects ''\n                # if keys are given replace is only done for a given FieldName\n                if (($($R.Keys[0]) -eq '') -or ($($R.Keys[0]) -eq $FieldName)) {\n                    if ($null -ne $Object1) {\n                        $Object1 = $Object1 -replace $($R.Values)[0], $($R.Values)[1]\n                        #$Object1 = $Object1 -replace $R[0], $R[1]\n                    }\n                    if ($null -ne $Object2) {\n                        $Object2 = $Object2 -replace $($R.Values)[0], $($R.Values)[1]\n                        #$Object2 = $Object2 -replace $R[0], $R[1]\n                    }\n                }\n            }\n        }\n\n        if ($null -eq $Object1 -and $null -eq $Object2) {\n            $Result['Status'] = $true\n        } elseif (($null -eq $Object1) -or ($null -eq $Object2)) {\n            $Result['Status'] = $false\n            foreach ($O in $Object1) {\n                $Result['Add'].Add($O)\n            }\n            foreach ($O in $Object2) {\n                $Result['Remove'].Add($O)\n            }\n        } else {\n            $ComparedObject = Compare-Object -ReferenceObject $Object1 -DifferenceObject $Object2 -IncludeEqual\n            foreach ($_ in $ComparedObject) {\n                if ($_.SideIndicator -eq '==') {\n                    $Result['Same'].Add($_.InputObject)\n                } elseif (($_.SideIndicator -eq '<=')) {\n                    $Result['Add'].Add($_.InputObject)\n                } elseif (($_.SideIndicator -eq '=>')) {\n                    $Result['Remove'].Add($_.InputObject)\n                }\n            }\n            IF ($Result['Add'].Count -eq 0 -and $Result['Remove'].Count -eq 0) {\n                $Result['Status'] = $true\n            } else {\n                $Result['Status'] = $false\n            }\n        }\n        $Result\n    }\n\n    if ($ObjectsName[0]) {\n        $ValueSourceName = $ObjectsName[0]\n    } else {\n        $ValueSourceName = \"Source\"\n    }\n\n    [Array] $Objects = foreach ($Object in $Objects) {\n        if ($null -eq $Object) {\n            [PSCustomObject] @{}\n        } else {\n            $Object\n        }\n    }\n\n    if ($FlattenObject) {\n        try {\n            [Array] $Objects = ConvertTo-FlatObject -Objects $Objects -ExcludeProperty $ExcludeProperty\n        } catch {\n            Write-Warning \"Compare-MultipleObjects - Unable to flatten objects. ($($_.Exception.Message))\"\n        }\n    }\n\n    if ($First -or $Last) {\n        [int] $TotalCount = $First + $Last\n        if ($TotalCount -gt 1) {\n            $Objects = $Objects | Select-Object -First $First -Last $Last\n        } else {\n            Write-Warning \"Compare-MultipleObjects - Unable to compare objects. Not enough objects to compare ($TotalCount).\"\n            return\n        }\n    }\n    $ReturnValues = @(\n        $FirstElement = [ordered] @{ }\n        $FirstElement['Name'] = 'Properties'\n        if ($Summary) {\n            $FirstElement['Same'] = $null\n            $FirstElement['Different'] = $null\n        }\n        $FirstElement['Status'] = $false\n\n        # Compare properties\n        $FirstObjectProperties = Select-Properties -Objects $Objects -Property $Property -ExcludeProperty $ExcludeProperty -AllProperties:$AllProperties\n        if (-not $SkipProperties) {\n            if ($FormatOutput) {\n                $FirstElement[$ValueSourceName] = $FirstObjectProperties -join $Splitter\n            } else {\n                $FirstElement[$ValueSourceName] = $FirstObjectProperties\n            }\n            [Array] $IsSame = for ($i = 1; $i -lt $Objects.Count; $i++) {\n                if ($ObjectsName[$i]) {\n                    $ValueToUse = $ObjectsName[$i]\n                } else {\n                    $ValueToUse = $i\n                }\n                if ($Objects[0] -is [System.Collections.IDictionary]) {\n                    [string[]] $CompareObjectProperties = $Objects[$i].Keys\n                } else {\n                    [string[]] $CompareObjectProperties = $Objects[$i].PSObject.Properties.Name\n                    [string[]] $CompareObjectProperties = Select-Properties -Objects $Objects[$i] -Property $Property -ExcludeProperty $ExcludeProperty -AllProperties:$AllProperties\n                }\n\n                if ($FormatOutput) {\n                    $FirstElement[\"$ValueToUse\"] = $CompareObjectProperties -join $Splitter\n                } else {\n                    $FirstElement[\"$ValueToUse\"] = $CompareObjectProperties\n                }\n                if ($CompareSorted) {\n                    $Value1 = $FirstObjectProperties | Sort-Object\n                    $Value2 = $CompareObjectProperties | Sort-Object\n                } else {\n                    $Value1 = $FirstObjectProperties\n                    $Value2 = $CompareObjectProperties\n                }\n\n                $Status = Compare-TwoArrays -FieldName 'Properties' -Object1 $Value1 -Object2 $Value2 -Replace $Replace\n                if ($FormatDifferences) {\n                    $FirstElement[\"$ValueToUse-Add\"] = $Status['Add'] -join $Splitter\n                    $FirstElement[\"$ValueToUse-Remove\"] = $Status['Remove'] -join $Splitter\n                    $FirstElement[\"$ValueToUse-Same\"] = $Status['Same'] -join $Splitter\n                } else {\n                    $FirstElement[\"$ValueToUse-Add\"] = $Status['Add']\n                    $FirstElement[\"$ValueToUse-Remove\"] = $Status['Remove']\n                    $FirstElement[\"$ValueToUse-Same\"] = $Status['Same']\n                }\n                $Status\n            }\n            if ($IsSame.Status -notcontains $false) {\n                $FirstElement['Status'] = $true\n            } else {\n                $FirstElement['Status'] = $false\n            }\n            if ($Summary) {\n                [Array] $Collection = (0..($IsSame.Count - 1)).Where( { $IsSame[$_].Status -eq $true }, 'Split')\n                if ($FormatDifferences) {\n                    $FirstElement['Same'] = ($Collection[0] | ForEach-Object {\n                            $Count = $_ + 1\n                            if ($ObjectsName[$Count]) {\n                                $ObjectsName[$Count]\n                            } else {\n                                $Count\n                            }\n                        }\n                    ) -join $Splitter\n                    $FirstElement['Different'] = ($Collection[1] | ForEach-Object {\n                            $Count = $_ + 1\n                            if ($ObjectsName[$Count]) {\n                                $ObjectsName[$Count]\n                            } else {\n                                $Count\n                            }\n                        }\n                    ) -join $Splitter\n                } else {\n                    $FirstElement['Same'] = $Collection[0] | ForEach-Object {\n                        $Count = $_ + 1\n                        if ($ObjectsName[$Count]) {\n                            $ObjectsName[$Count]\n                        } else {\n                            $Count\n                        }\n                    }\n                    $FirstElement['Different'] = $Collection[1] | ForEach-Object {\n                        $Count = $_ + 1\n                        if ($ObjectsName[$Count]) {\n                            $ObjectsName[$Count]\n                        } else {\n                            $Count\n                        }\n                    }\n                }\n            }\n            [PSCustomObject] $FirstElement\n        }\n\n        # Compare Objects\n        foreach ($NameProperty in $FirstObjectProperties) {\n            $EveryOtherElement = [ordered] @{ }\n            $EveryOtherElement['Name'] = $NameProperty\n            if ($Summary) {\n                $EveryOtherElement['Same'] = $null\n                $EveryOtherElement['Different'] = $null\n            }\n            $EveryOtherElement.Status = $false\n\n            if ($FormatOutput) {\n                $EveryOtherElement[$ValueSourceName] = $Objects[0].$NameProperty -join $Splitter\n            } else {\n                $EveryOtherElement[$ValueSourceName] = $Objects[0].$NameProperty\n            }\n\n            [Array] $IsSame = for ($i = 1; $i -lt $Objects.Count; $i++) {\n                $Skip = $false\n\n                if ($ObjectsName[$i]) {\n                    $ValueToUse = $ObjectsName[$i]\n                } else {\n                    $ValueToUse = $i\n                }\n\n                if ($Objects[$i] -is [System.Collections.IDictionary]) {\n                    if ($Objects[$i].Keys -notcontains $NameProperty) {\n                        $Status = [ordered] @{\n                            Status = $false\n                            Same   = @()\n                            Add    = @()\n                            Remove = @()\n                        }\n                        $Skip = $true\n                    }\n                } elseif ($Objects[$i].PSObject.Properties.Name -notcontains $NameProperty) {\n                    $Status = [ordered] @{\n                        Status = $false;\n                        Same   = @()\n                        Add    = @()\n                        Remove = @()\n                    }\n                    $Skip = $true\n                }\n\n                if ($FormatOutput) {\n                    $EveryOtherElement[\"$ValueToUse\"] = $Objects[$i].$NameProperty -join $Splitter\n                } else {\n                    $EveryOtherElement[\"$ValueToUse\"] = $Objects[$i].$NameProperty\n                }\n\n                if ($CompareSorted) {\n                    $Value1 = $Objects[0].$NameProperty | Sort-Object\n                    $Value2 = $Objects[$i].$NameProperty | Sort-Object\n                } else {\n                    $Value1 = $Objects[0].$NameProperty\n                    $Value2 = $Objects[$i].$NameProperty\n                }\n                # This will be used only if we don't use flattening of objects.\n                if ($Value1 -is [PSCustomObject]) {\n                    [ordered] @{ Status = $null; Same = @(); Add = @(); Remove = @() }\n                    continue\n                } elseif ($Value1 -is [System.Collections.IDictionary]) {\n                    [ordered] @{ Status = $null; Same = @(); Add = @(); Remove = @() }\n                    continue\n                } elseif ($Value1 -is [Array] -and $Value1.Count -ne 0 -and $Value1[0] -isnot [string]) {\n                    [ordered] @{ Status = $null; Same = @(); Add = @(); Remove = @() }\n                    continue\n                }\n                if (-not $Skip) {\n                    $Status = Compare-TwoArrays -FieldName $NameProperty -Object1 $Value1 -Object2 $Value2 -Replace $Replace\n                } else {\n                    $Status['Add'] = $Value1\n                }\n                if ($FormatDifferences) {\n                    $EveryOtherElement[\"$ValueToUse-Add\"] = $Status['Add'] -join $Splitter\n                    $EveryOtherElement[\"$ValueToUse-Remove\"] = $Status['Remove'] -join $Splitter\n                    $EveryOtherElement[\"$ValueToUse-Same\"] = $Status['Same'] -join $Splitter\n                } else {\n                    $EveryOtherElement[\"$ValueToUse-Add\"] = $Status['Add']\n                    $EveryOtherElement[\"$ValueToUse-Remove\"] = $Status['Remove']\n                    $EveryOtherElement[\"$ValueToUse-Same\"] = $Status['Same']\n                }\n                $Status\n            }\n            if ($null -eq $IsSame.Status) {\n                $EveryOtherElement['Status'] = $null\n            } elseif ($IsSame.Status -notcontains $false) {\n                $EveryOtherElement['Status'] = $true\n            } else {\n                $EveryOtherElement['Status'] = $false\n            }\n\n            if ($Summary) {\n                [Array] $Collection = (0..($IsSame.Count - 1)).Where( { $IsSame[$_].Status -eq $true }, 'Split')\n                if ($FormatDifferences) {\n                    $EveryOtherElement['Same'] = ($Collection[0] | ForEach-Object {\n                            $Count = $_ + 1\n                            if ($ObjectsName[$Count]) {\n                                $ObjectsName[$Count]\n                            } else {\n                                $Count\n                            }\n                        }\n                    ) -join $Splitter\n                    $EveryOtherElement['Different'] = ($Collection[1] | ForEach-Object {\n                            $Count = $_ + 1\n                            if ($ObjectsName[$Count]) {\n                                $ObjectsName[$Count]\n                            } else {\n                                $Count\n                            }\n                        }\n                    ) -join $Splitter\n                } else {\n                    $EveryOtherElement['Same'] = $Collection[0] | ForEach-Object {\n                        $Count = $_ + 1\n                        if ($ObjectsName[$Count]) {\n                            $ObjectsName[$Count]\n                        } else {\n                            $Count\n                        }\n                    }\n                    $EveryOtherElement['Different'] = $Collection[1] | ForEach-Object {\n                        $Count = $_ + 1\n                        if ($ObjectsName[$Count]) {\n                            $ObjectsName[$Count]\n                        } else {\n                            $Count\n                        }\n                    }\n                }\n            }\n            [PSCuStomObject] $EveryOtherElement\n        }\n    )\n    if ($ReturnValues.Count -eq 1) {\n        return , $ReturnValues\n    } else {\n        return $ReturnValues\n    }\n}"
  },
  {
    "path": "Public/Objects/Compare-ObjectAdvanced.ps1",
    "content": "function Compare-ObjectsAdvanced {\n    <#\n    .SYNOPSIS\n    Compares two sets of objects based on a specified property.\n\n    .DESCRIPTION\n    This function compares two sets of objects based on a specified property. It can be used to identify differences between the objects and perform actions accordingly.\n\n    .PARAMETER Object1\n    The first set of objects to compare.\n\n    .PARAMETER Object2\n    The second set of objects to compare.\n\n    .PARAMETER CommonProperty\n    Specifies the common property to compare between the objects. Default is 'DistinguishedName'.\n\n    .PARAMETER AddObjectArrayName\n    An array of names for additional properties to add to Object1.\n\n    .PARAMETER AddObjectArray\n    An array of values for additional properties to add to Object1.\n\n    .PARAMETER Object1Property\n    Specifies a property from Object1 to compare.\n\n    .PARAMETER Object2Property\n    Specifies a property from Object2 to compare.\n\n    .PARAMETER ObjectPropertySubstitute\n    Specifies a substitute property name for comparison. Default is 'SpecialValueToCompare'.\n\n    .PARAMETER RemoveSideIndicator\n    Indicates whether to remove side indicators in the comparison results.\n\n    .PARAMETER KeepTemporaryProperty\n    Indicates whether to keep temporary properties added during comparison.\n\n    .PARAMETER Side\n    Specifies which side to compare ('Left' or 'Right'). Default is 'Left'.\n\n    .EXAMPLE\n    Compare-ObjectsAdvanced -Object1 $ObjectSet1 -Object2 $ObjectSet2 -CommonProperty 'Name' -Object1Property 'Size' -Object2Property 'Size'\n\n    Description:\n    Compares two sets of objects based on the 'Name' property and the 'Size' property from each set.\n\n    .EXAMPLE\n    Compare-ObjectsAdvanced -Object1 $Users -Object2 $Groups -CommonProperty 'DistinguishedName' -AddObjectArrayName @('Type', 'Status') -AddObjectArray @('User', 'Active') -Side 'Right'\n\n    Description:\n    Compares two sets of objects based on the 'DistinguishedName' property, adding 'Type' and 'Status' properties to Object1, and compares from the 'Right' side.\n\n    #>\n    param(\n        [object] $Object1,\n        [object] $Object2,\n        [alias('Property')][string] $CommonProperty = 'DistinguishedName',\n        [string[]] $AddObjectArrayName,\n        [object[]] $AddObjectArray,\n        [string] $Object1Property,\n        [string] $Object2Property,\n        [string] $ObjectPropertySubstitute = 'SpecialValueToCompare',\n        [switch] $RemoveSideIndicator,\n        [switch] $KeepTemporaryProperty,\n        [ValidateSet('Left', 'Right')][string] $Side = 'Left' # May need Both later on\n    )\n    $Objects = New-GenericList\n\n    if ($null -eq $Object1 -and $null -eq $Object2) {\n        # nothing to do, doesn't event need check for distribution groups because it should be empty as well.\n    } elseif ($null -eq $Object1) {\n        # nothing to do\n    } elseif ($null -eq $Object2) {\n        foreach ($G in $Object1) {\n            #Add-Member -InputObject $G -MemberType NoteProperty -Name 'OrganizationalUnit' -Value $OrganizationalUnit -Force\n            #\n\n            for ($a = 0; $a -lt $AddObjectArrayName.Count; $a++) {\n                $G | Add-Member -MemberType NoteProperty -Name $AddObjectArrayName[$a] -Value $AddObjectArray[$a] -Force\n                \n            }\n            $Objects.Add($G)\n        }\n    } else {\n        $Terminate = New-GenericList -Type [bool]\n\n        if ($Object1Property -and $Object2Property) {                \n            if ($Object1[0].PSObject.Properties.Name -notcontains $Object1Property) {\n                Write-Warning -Message \"Compare-InfrastructureObjects - Object1 property doesn't exists $Object1Property\"\n                $Terminate.Add($true)\n            }\n            if ($Object2[0].PSObject.Properties.Name -notcontains $Object2Property) {\n                Write-Warning -Message \"Compare-InfrastructureObjects - Object2 property doesn't exists $Object2Property\"\n                $Terminate.Add($true)\n            }\n            if ($Terminate -contains $true) {\n                return\n            }\n            $Object1 | Add-Member -MemberType AliasProperty -Name $ObjectPropertySubstitute -Value $Object1Property -Force\n            $Object2 | Add-Member -MemberType AliasProperty -Name $ObjectPropertySubstitute -Value $Object2Property -Force\n            $Compare = Compare-Object -ReferenceObject $Object1 -DifferenceObject $Object2 -Property  $ObjectPropertySubstitute -PassThru\n        } else {\n            if ($Object1[0].PSObject.Properties.Name -notcontains $CommonProperty) {\n                Write-Warning -Message \"Compare-InfrastructureObjects - Object1 property doesn't exists $CommonProperty\"\n                $Terminate.Add($true)\n            }\n            if ($Object2[0].PSObject.Properties.Name -notcontains $CommonProperty) {\n                Write-Warning -Message \"Compare-InfrastructureObjects - Object2 property doesn't exists $CommonProperty\"\n                $Terminate.Add($true)\n            }\n            if ($Terminate -contains $true) {\n                return\n            }\n            $Compare = Compare-Object -ReferenceObject $Object1 -DifferenceObject $Object2 -Property $CommonProperty -PassThru\n        }\n        if ($Side -eq 'Left') {\n            $Compare = $Compare | Where-Object { $_.SideIndicator -eq '<=' }\n        } elseif ($Side -eq 'Right') {\n            $Compare = $Compare | Where-Object { $_.SideIndicator -eq '=>' }\n        } else {\n            # left just in case Equal is needed\n            $Compare = $Compare | Where-Object { $_.SideIndicator -eq '==' }\n        }\n        foreach ($G in $Compare) {\n            if ($RemoveSideIndicator) {\n                $G.PSObject.Members.Remove('SideIndicator')\n            }\n            if (-not $KeepTemporaryProperty) {\n                $G.PSObject.Members.Remove($ObjectPropertySubstitute)\n            }\n            for ($a = 0; $a -lt $AddObjectArrayName.Count; $a++) {\n                $G | Add-Member -MemberType NoteProperty -Name $AddObjectArrayName[$a] -Value $AddObjectArray[$a] -Force\n            }\n            $Objects.Add($G) \n        }\n    }  \n    return $Objects\n}\n"
  },
  {
    "path": "Public/Objects/Compare-ObjectProperties.ps1",
    "content": "Function Compare-ObjectProperties {\n    <#\n    .SYNOPSIS\n    Compares the properties of two objects and returns the differences.\n\n    .DESCRIPTION\n    This function compares the properties of two objects and returns the differences found between them. It compares each property of the reference object with the corresponding property of the difference object.\n\n    .PARAMETER ReferenceObject\n    The reference object to compare properties against.\n\n    .PARAMETER DifferenceObject\n    The object whose properties are compared against the reference object.\n\n    .PARAMETER CaseSensitive\n    Indicates whether the comparison should be case-sensitive. Default is false.\n\n    .EXAMPLE\n    $ad1 = Get-ADUser amelia.mitchell -Properties *\n    $ad2 = Get-ADUser carolyn.quinn -Properties *\n    Compare-ObjectProperties $ad1 $ad2\n    #>\n    Param(\n        [PSObject]$ReferenceObject,\n        [PSObject]$DifferenceObject,\n        [switch]$CaseSensitive = $false\n    )\n    $objprops = @(\n                  $($ReferenceObject | Get-Member -MemberType Property, NoteProperty | ForEach-Object Name),\n                  $($DifferenceObject | Get-Member -MemberType Property, NoteProperty | ForEach-Object Name)\n                  )\n    $objprops = $objprops | Sort-Object -Unique\n    $diffs = foreach ($objprop in $objprops) {\n        $diff = Compare-Object $ReferenceObject $DifferenceObject -Property $objprop -CaseSensitive:$CaseSensitive\n        if ($diff) {\n            $diffprops = [PsCustomObject] @{\n                PropertyName = $objprop\n                RefValue     = ($diff | Where-Object {$_.SideIndicator -eq '<='} | ForEach-Object $($objprop))\n                DiffValue    = ($diff | Where-Object {$_.SideIndicator -eq '=>'} | ForEach-Object $($objprop))\n            }\n            $diffprops\n            #New-Object PSObject -Property $diffprops\n        }\n    }\n    if ($diffs) {return ($diffs | Select-Object PropertyName, RefValue, DiffValue)}\n}\n<#\nhttps://blogs.technet.microsoft.com/janesays/2017/04/25/compare-all-properties-of-two-objects-in-windows-powershell/\n\n$ad1 = Get-ADUser amelia.mitchell -Properties *\n$ad2 = Get-ADUser carolyn.quinn -Properties *\nCompare-ObjectProperties $ad1 $ad2\n#>\n"
  },
  {
    "path": "Public/Objects/Copy-Dictionary.ps1",
    "content": "﻿function Copy-Dictionary {\n    <#\n    .SYNOPSIS\n    Copies dictionary/hashtable\n\n    .DESCRIPTION\n    Copies dictionary uusing PS Serializer. Replaces usage of BinnaryFormatter due to no support in PS 7.4\n\n    .PARAMETER Dictionary\n    Dictionary to copy\n\n    .EXAMPLE\n    $Test = [ordered] @{\n        Test  = 'Test'\n        Test1 = @{\n            Test2 = 'Test2'\n            Test3 = @{\n                Test4 = 'Test4'\n            }\n        }\n        Test2 = @(\n            \"1\", \"2\", \"3\"\n        )\n        Test3 = [PSCustomObject] @{\n            Test4 = 'Test4'\n            Test5 = 'Test5'\n        }\n    }\n\n    $New1 = Copy-Dictionary -Dictionary $Test\n    $New1\n\n    .NOTES\n\n    #>\n    [alias('Copy-Hashtable', 'Copy-OrderedHashtable')]\n    [cmdletbinding()]\n    param(\n        [System.Collections.IDictionary] $Dictionary\n    )\n    $clone = [System.Management.Automation.PSSerializer]::Serialize($Dictionary, [int32]::MaxValue)\n    return [System.Management.Automation.PSSerializer]::Deserialize($clone)\n}"
  },
  {
    "path": "Public/Objects/Copy-DictionaryManual.ps1",
    "content": "﻿function Copy-DictionaryManual {\n    <#\n    .SYNOPSIS\n    Copies a dictionary recursively, handling nested dictionaries and lists.\n\n    .DESCRIPTION\n    This function copies a dictionary recursively, handling nested dictionaries and lists. It creates a deep copy of the input dictionary, ensuring that modifications to the copied dictionary do not affect the original dictionary.\n\n    .PARAMETER Dictionary\n    The dictionary to be copied.\n\n    .EXAMPLE\n    $originalDictionary = @{\n        'Key1' = 'Value1'\n        'Key2' = @{\n            'NestedKey1' = 'NestedValue1'\n        }\n    }\n    $copiedDictionary = Copy-DictionaryManual -Dictionary $originalDictionary\n\n    This example demonstrates how to copy a dictionary with nested values.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [System.Collections.IDictionary] $Dictionary\n    )\n\n    $clone = [ordered] @{}\n    foreach ($Key in $Dictionary.Keys) {\n        $value = $Dictionary.$Key\n\n        $clonedValue = switch ($Dictionary.$Key) {\n            { $null -eq $_ } {\n                $null\n                continue\n            }\n            { $_ -is [System.Collections.IDictionary] } {\n                Copy-DictionaryManual -Dictionary $_\n                continue\n            }\n            {\n                $type = $_.GetType()\n                $type.IsPrimitive -or $type.IsValueType -or $_ -is [string]\n            } {\n                $_\n                continue\n            }\n            default {\n                $_ | Select-Object -Property *\n            }\n\n        }\n\n        if ($value -is [System.Collections.IList]) {\n            $clone[$Key] = @($clonedValue)\n        } else {\n            $clone[$Key] = $clonedValue\n        }\n    }\n\n    $clone\n}"
  },
  {
    "path": "Public/Objects/Format-Dictionary.ps1",
    "content": "﻿function Format-Dictionary {\n    <#\n    .SYNOPSIS\n    Sorts dictionary/hashtable keys including nested hashtables and returns ordered dictionary\n\n    .DESCRIPTION\n    Sorts dictionary/hashtable keys including nested hashtables and returns ordered dictionary\n\n    .PARAMETER Hashtable\n    Hashtable to sort\n\n    .EXAMPLE\n    $Hashtable = [ordered] @{\n        ModuleVersion          = '2.0.X'\n        #PreReleaseTag          = 'Preview5'\n        CompatiblePSEditions   = @('Desktop', 'Core')\n\n        RunMe                  = @{\n            Name = 'RunMe'\n            Type = 'Script'\n            Path = 'RunMe.ps1'\n        }\n        GUID                   = 'eb76426a-1992-40a5-82cd-6480f883ef4d'\n        Author                 = 'Przemyslaw Klys'\n        CompanyName            = 'Evotec'\n        Copyright              = \"(c) 2011 - $((Get-Date).Year) Przemyslaw Klys @ Evotec. All rights reserved.\"\n        Description            = 'Simple project allowing preparing, managing, building and publishing modules to PowerShellGallery'\n        PowerShellVersion      = '5.1'\n        Tags                   = @('Windows', 'MacOS', 'Linux', 'Build', 'Module')\n        IconUri                = 'https://evotec.xyz/wp-content/uploads/2019/02/PSPublishModule.png'\n        ProjectUri             = 'https://github.com/EvotecIT/PSPublishModule'\n        DotNetFrameworkVersion = '4.5.2'\n    }\n    $Hashtable = Format-Dictionary -Hashtable $Hashtable\n    $Hashtable\n\n    .EXAMPLE\n    $Hashtable = Format-Dictionary -Hashtable $Hashtable -ByValue\n    $Hashtable\n\n    .EXAMPLE\n    $Hashtable = Format-Dictionary -Hashtable $Hashtable -ByValue -Descending\n    $Hashtable\n\n    .NOTES\n    General notes\n    #>\n    [alias('Sort-Dictionary')]\n    [CmdletBinding()]\n    param(\n        [alias('Dictionary', 'OrderedDictionary')]\n        [Parameter(Mandatory, ValueFromPipeline)]\n        [System.Collections.IDictionary] $Hashtable,\n        [switch] $Descending,\n        [switch] $ByValue\n    )\n    $Ordered = [ordered] @{}\n    if ($ByValue) {\n        # sort by value\n        $Hashtable.GetEnumerator() | Sort-Object -Property Value -Descending:$Descending.IsPresent | ForEach-Object {\n            if ($_.Value -is [System.Collections.IDictionary]) {\n                $Ordered[$_.Key] = Format-Dictionary -Hashtable $_.Value -Descending:$Descending.IsPresent -ByValue:$ByValue.IsPresent\n            } else {\n                $Ordered[$_.Key] = $_.Value\n            }\n        }\n    } else {\n        foreach ($K in [string[]] $Hashtable.Keys | Sort-Object -Descending:$Descending.IsPresent) {\n            if ($Hashtable[$K] -is [System.Collections.IDictionary]) {\n                $Ordered[$K] = Format-Dictionary -Hashtable $Hashtable[$K] -Descending:$Descending.IsPresent -ByValue:$ByValue.IsPresent\n            } else {\n                $Ordered[$K] = $Hashtable[$K]\n            }\n        }\n    }\n    $Ordered\n}"
  },
  {
    "path": "Public/Objects/Format-FirstXChars.ps1",
    "content": "function Format-FirstXChars {\n    <#\n    .SYNOPSIS\n    This function returns the first X characters of a given text string.\n\n    .DESCRIPTION\n    The Format-FirstXChars function takes a text string and a number of characters as input and returns the first X characters of the text string.\n\n    .PARAMETER Text\n    The input text string from which the first X characters will be extracted.\n\n    .PARAMETER NumberChars\n    The number of characters to extract from the beginning of the input text string.\n\n    .EXAMPLE\n    Format-FirstXChars -Text \"VERBOSE: Loading module from path 'C:\\Users\\pklys\\.vscode\\extensions\\ms-vs\" -NumberChars 15\n    # Returns: VERBOSE: Loading\n\n    .NOTES\n    This function is useful for truncating long text strings to a specific length.\n    #>\n    param(\n        [string] $Text,\n        [int] $NumberChars\n    )\n    return ($Text.ToCharArray() | Select-Object -First $NumberChars) -join ''\n}"
  },
  {
    "path": "Public/Objects/Format-PSTable.ps1",
    "content": "﻿function Format-PSTable {\n    <#\n    .SYNOPSIS\n    Formats a collection of objects into a table for display.\n\n    .DESCRIPTION\n    The Format-PSTable function takes a collection of objects and formats them into a table for easy display. It provides options to customize the output by selecting specific properties, excluding certain properties, and more.\n\n    .PARAMETER Object\n    Specifies the collection of objects to format.\n\n    .PARAMETER SkipTitle\n    Indicates whether to skip displaying the title row in the table.\n\n    .PARAMETER Property\n    Specifies an array of property names to include in the table.\n\n    .PARAMETER ExcludeProperty\n    Specifies an array of property names to exclude from the table.\n\n    .PARAMETER OverwriteHeaders\n    Specifies an object to use as headers for the table.\n\n    .PARAMETER PreScanHeaders\n    Indicates whether to pre-scan the object properties to determine headers.\n\n    .PARAMETER Splitter\n    Specifies the delimiter to use when joining array values.\n\n    .EXAMPLE\n    $data | Format-PSTable\n\n    Description:\n    Formats the $data collection into a table with default settings.\n\n    .EXAMPLE\n    $data | Format-PSTable -Property Name, Age\n\n    Description:\n    Formats the $data collection into a table displaying only the 'Name' and 'Age' properties.\n\n    .EXAMPLE\n    $data | Format-PSTable -ExcludeProperty ID\n\n    Description:\n    Formats the $data collection into a table excluding the 'ID' property.\n\n    #>\n    [CmdletBinding()]\n    param (\n        [parameter(ValueFromPipelineByPropertyName, ValueFromPipeline)][System.Collections.ICollection] $Object,\n        [switch] $SkipTitle,\n        [string[]] $Property,\n        [string[]] $ExcludeProperty,\n        [Object] $OverwriteHeaders,\n        [switch] $PreScanHeaders,\n        [string] $Splitter = ';'\n    )\n    if ($Object[0] -is [System.Collections.IDictionary]) {\n        $Array = @(\n            ### Add Titles\n            if (-not $SkipTitle) {\n                , @('Name', 'Value')\n            }\n            ### Add Data\n            foreach ($O in $Object) {\n                foreach ($Name in $O.Keys) {\n                    $Value = $O[$Name]\n                    # If array contains another array as one of the values we need to do something with it\n                    if ($O[$Name].Count -gt 1) {\n                        $Value = $O[$Name] -join $Splitter\n                    } else {\n                        $Value = $O[$Name]\n                    }\n                    , @($Name, $Value)\n                }\n            }\n        )\n        if ($Array.Count -eq 1) { , $Array } else { $Array }\n    } elseif ($Object[0].GetType().Name -match 'bool|byte|char|datetime|decimal|double|ExcelHyperLink|float|int|long|sbyte|short|string|timespan|uint|ulong|URI|ushort') {\n        return $Object\n    } else {\n        if ($Property) {\n            $Object = $Object | Select-Object -Property $Property\n        }\n        $Array = @(\n            # Get Titles first (to make sure order is correct for all rows)\n            if ($PreScanHeaders) {\n                $Titles = Get-ObjectProperties -Object $Object\n            } elseif ($OverwriteHeaders) {\n                $Titles = $OverwriteHeaders\n            } else {\n                # If no prescan takes property names from first object\n                $Titles = $Object[0].PSObject.Properties.Name\n            }\n            if (-not $SkipTitle) {\n                # Add Titles to Array (if not -SkipTitles)\n                , $Titles\n            }\n            # Extract data (based on Title)\n            foreach ($O in $Object) {\n                $ArrayValues = foreach ($Name in $Titles) {\n                    $Value = $O.\"$Name\"\n                    # If array contains another array as one of the values we need to do something with it\n                    if ($Value.Count -gt 1) {\n                        $Value -join $Splitter\n                    } elseif ($Value.Count -eq 1) {\n                        if ($Value.Value) {\n                           $Value.Value\n                           #$Value\n                        } else {\n                            $Value\n                        }\n                    } else {\n                        ''\n                    }\n                }\n                , $ArrayValues\n            }\n\n        )\n        if ($Array.Count -eq 1) { , $Array } else { $Array }\n    }\n}"
  },
  {
    "path": "Public/Objects/Format-Stream.ps1",
    "content": "function Format-Stream {\n    <#\n    .SYNOPSIS\n    Formats input objects for display in a stream-oriented manner.\n\n    .DESCRIPTION\n    The Format-Stream function formats input objects for display in a stream-oriented manner. It provides flexibility in displaying data in various streams such as Output, Host, Warning, Verbose, Debug, and Information.\n\n    .PARAMETER InputObject\n    Specifies the input objects to be formatted.\n\n    .PARAMETER Property\n    Specifies the properties of the input objects to include in the output.\n\n    .PARAMETER ExcludeProperty\n    Specifies the properties of the input objects to exclude from the output.\n\n    .PARAMETER HideTableHeaders\n    Indicates whether to hide the table headers in the output.\n\n    .PARAMETER ColumnHeaderSize\n    Specifies the size of the column headers in the output.\n\n    .PARAMETER AlignRight\n    Indicates whether to align the output data to the right.\n\n    .PARAMETER Stream\n    Specifies the stream to display the formatted data. Valid values are 'Output', 'Host', 'Warning', 'Verbose', 'Debug', and 'Information'.\n\n    .PARAMETER List\n    Indicates whether to display the output as a list.\n\n    .PARAMETER Transpose\n    Indicates whether to transpose the columns and rows of the output.\n\n    .PARAMETER TransposeSort\n    Specifies the sorting order when transposing the data. Valid values are 'ASC', 'DESC', and 'NONE'.\n\n    .PARAMETER ForegroundColor\n    Specifies the foreground color of the output.\n\n    .PARAMETER ForegroundColorRow\n    Specifies the foreground color of specific rows in the output.\n\n    .EXAMPLE\n    Get-Process | Format-Stream -Property Name, Id -Stream Host\n    Displays the Name and Id properties of the processes in the Host stream.\n\n    .EXAMPLE\n    Get-Service | Format-Stream -ExcludeProperty Status -List\n    Displays all service properties except Status as a list.\n\n    #>\n    [alias('FS', 'Format-TableStream', 'Format-ListStream')]\n    ##[alias('ftv','ftd','fto','fth','fti','flv','fld','flo','flh','fli','Format-TableVerbose', 'Format-TableDebug', 'Format-TableInformation', 'Format-TableWarning')]\n    [CmdletBinding(DefaultParameterSetName = 'All')]\n    param(\n        [Parameter(Mandatory = $false, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Position = 1)]\n        [Array] $InputObject,\n\n        [Parameter(Mandatory = $false, ValueFromPipeline = $false, Position = 0, ParameterSetName = 'Property')]\n        [string[]] $Property,\n\n        [Parameter(Mandatory = $false, ValueFromPipeline = $false, Position = 2, ParameterSetName = 'ExcludeProperty')]\n        [string[]] $ExcludeProperty,\n\n        [Parameter(Mandatory = $false, ValueFromPipeline = $false, Position = 3)]\n        [switch] $HideTableHeaders,\n\n        [Parameter(Mandatory = $false, ValueFromPipeline = $false, Position = 4)]\n        [int] $ColumnHeaderSize,\n\n        [Parameter(Mandatory = $false, ValueFromPipeline = $false, Position = 5)]\n        [switch] $AlignRight,\n\n        [Parameter(Mandatory = $false, ValueFromPipeline = $false, Position = 6)]\n        [validateset('Output', 'Host', 'Warning', 'Verbose', 'Debug', 'Information')]\n        [string] $Stream = 'Verbose',\n\n        [Parameter(Mandatory = $false, ValueFromPipeline = $false, Position = 7)]\n        [alias('AsList')][switch] $List,\n\n        [Parameter(Mandatory = $false, ValueFromPipeline = $false, Position = 8)]\n        [alias('Rotate', 'RotateData', 'TransposeColumnsRows', 'TransposeData')]\n        [switch] $Transpose,\n\n        [Parameter(Mandatory = $false, ValueFromPipeline = $false, Position = 9)]\n        [ValidateSet('ASC', 'DESC', 'NONE')]\n        [string] $TransposeSort = 'NONE',\n\n        [alias('Color')]\n        [System.ConsoleColor[]] $ForegroundColor,\n\n        [alias('ColorRow')]\n        [int[]] $ForegroundColorRow\n    )\n    Begin {\n        $IsVerbosePresent = $PSCmdlet.MyInvocation.BoundParameters['Verbose'].IsPresent\n\n        if ($Stream -eq 'Output') {\n            #\n        } elseif ($Stream -eq 'Host') {\n            #\n        } elseif ($Stream -eq 'Warning') {\n            [System.Management.Automation.ActionPreference] $WarningCurrent = $WarningPreference\n            $WarningPreference = 'continue'\n        } elseif ($Stream -eq 'Verbose') {\n            [System.Management.Automation.ActionPreference] $VerboseCurrent = $VerbosePreference\n            $VerbosePreference = 'continue'\n        } elseif ($Stream -eq 'Debug') {\n            [System.Management.Automation.ActionPreference] $DebugCurrent = $DebugPreference\n            $DebugPreference = 'continue'\n        } elseif ($Stream -eq 'Information') {\n            [System.Management.Automation.ActionPreference] $InformationCurrent = $InformationPreference\n            $InformationPreference = 'continue'\n        }\n\n        [bool] $FirstRun = $True # First run for pipeline\n        [bool] $FirstLoop = $True # First loop for data\n        [bool] $FirstList = $True # First loop for a list\n        [int] $ScreenWidth = $Host.UI.RawUI.WindowSize.Width - 12 # Removes 12 chars because of VERBOSE: output\n        $ArrayList = @()\n    }\n    Process {\n        if ($InputObject.Count -eq 0) { break }\n        if ($FirstRun) {\n            $FirstRun = $false\n            if ($Transpose) { $InputObject = Format-TransposeTable -Object $InputObject -Sort $TransposeSort }\n            $Data = Format-PSTable -Object $InputObject -Property $Property -ExcludeProperty $ExcludeProperty -NoAliasOrScriptProperties:$NoAliasOrScriptProperties -DisplayPropertySet:$DisplayPropertySet -PreScanHeaders:$PreScanHeaders\n            $Headers = $Data[0]\n            if ($HideTableHeaders) {\n                $Data.RemoveAt(0);\n            }\n            $ArrayList += $Data\n        } else {\n            if ($Transpose) { $InputObject = Format-TransposeTable -Object $InputObject -Sort $TransposeSort }\n            $Data = Format-PSTable -Object $InputObject -Property $Property -ExcludeProperty $ExcludeProperty -NoAliasOrScriptProperties:$NoAliasOrScriptProperties -DisplayPropertySet:$DisplayPropertySet -PreScanHeaders:$PreScanHeaders -OverwriteHeaders $Headers -SkipTitle\n            $ArrayList += $Data\n        }\n    }\n    End {\n        if (-not $ColumnHeaderSize) {\n            $ColumnLength = [int[]]::new($Headers.Count);\n            foreach ($Row in $ArrayList) {\n                $i = 0\n                foreach ($Column in $Row) {\n                    $Length = \"$Column\".Length\n                    if ($Length -gt $ColumnLength[$i]) {\n                        $ColumnLength[$i] = $Length\n                    }\n                    $i++\n                }\n            }\n            if ($IsVerbosePresent) {\n                Write-Verbose \"Format-TableVerbose - ScreenWidth $ScreenWidth\"\n                Write-Verbose \"Format-TableVerbose - Column Lengths $($ColumnLength -join ',')\"\n            }\n        }\n        # Add empty line\n        if ($Stream -eq 'Output') {\n            Write-Output -InputObject ''\n        } elseif ($Stream -eq 'Host') {\n            Write-Host -Object ''\n        } elseif ($Stream -eq 'Warning') {\n            Write-Warning -Message ''\n        } elseif ($Stream -eq 'Verbose') {\n            Write-Verbose -Message ''\n        } elseif ($Stream -eq 'Debug') {\n            Write-Debug -Message ''\n        } elseif ($Stream -eq 'Information') {\n            Write-Information -MessageData ''\n        }\n        if ($List) {\n            [int] $RowCount = 1\n            foreach ($Row in $ArrayList ) {\n                [string] $Output = ''\n                [int] $ColumnNumber = 0\n                [int] $CurrentColumnLength = 0\n\n                if ($ColumnHeaderSize) {\n                    $PadLength = $ColumnHeaderSize # Add +1 to make sure there's space between columns\n                } else {\n                    $PadLength = (($Headers.Length | Measure-Object -Maximum).Maximum) + 1 # Add +1 to make sure there's space between columns\n                }\n\n\n                # Prepare each data for row\n                if (-not $FirstList) {\n                    $i = 0\n                    foreach ($ColumnValue in $Row) {\n                        if (-not $HideTableHeaders) {\n                            # Using Headers for a List\n                            if ($AlignRight) {\n                                $Head = $($Headers[$i]).PadLeft($PadLength)\n                            } else {\n                                $Head = $($Headers[$i]).PadRight($PadLength)\n                            }\n                            $Output = \"$Head`: $ColumnValue\"\n                        } else {\n                            # Hide table headers for a List switch\n                            $Output = \"$ColumnValue\"\n                        }\n\n                        if ($Stream -eq 'Output') {\n                            Write-Output -InputObject $Output\n                        } elseif ($Stream -eq 'Host') {\n                            Write-Host -Object $Output\n                        } elseif ($Stream -eq 'Warning') {\n                            Write-Warning -Message $Output\n                        } elseif ($Stream -eq 'Verbose') {\n                            Write-Verbose -Message $Output\n                        } elseif ($Stream -eq 'Debug') {\n                            Write-Debug -Message $Output\n                        } elseif ($Stream -eq 'Information') {\n                            Write-Information -MessageData $Output\n                        }\n                        $i++\n                    }\n                    $RowCount++\n                    if ($RowCount -ne $ArrayList.Count) {\n                        # Add empty line per each object but only if it's not last object\n                        if ($Stream -eq 'Output') {\n                            Write-Output -InputObject ''\n                        } elseif ($Stream -eq 'Host') {\n                            Write-Host -Object ''\n                        } elseif ($Stream -eq 'Warning') {\n                            Write-Warning -Message ''\n                        } elseif ($Stream -eq 'Verbose') {\n                            Write-Verbose -Message ''\n                        } elseif ($Stream -eq 'Debug') {\n                            Write-Debug -Message ''\n                        } elseif ($Stream -eq 'Information') {\n                            Write-Information -MessageData ''\n                        }\n                    }\n                }\n                $FirstList = $false\n            }\n        } else {\n            # Process Data\n            [int] $RowCountColors = 1\n            foreach ($Row in $ArrayList ) {\n                [string] $Output = ''\n                [int] $ColumnNumber = 0\n                [int] $CurrentColumnLength = 0\n                # Prepare each data for row\n                foreach ($ColumnValue in $Row) {\n\n                    # Set Column Header Size to static value or based on string length\n                    if ($ColumnHeaderSize) {\n                        $PadLength = $ColumnHeaderSize # Add +1 to make sure there's space between columns\n                    } else {\n                        $PadLength = $ColumnLength[$ColumnNumber] + 1 # Add +1 to make sure there's space between columns\n                    }\n\n                    # Makes sure to display all data on current screen size, the larger the screen, the more it fits\n                    $CurrentColumnLength += $PadLength\n                    if ($CurrentColumnLength -ge $ScreenWidth) {\n                        break\n                    }\n\n                    # Prepare Data\n                    if ($ColumnHeaderSize) {\n                        # if ColumnHeaderSize is defined we need to trim text and make sure there is space between for the ones being trimmed\n                        $ColumnValue = (\"$ColumnValue\".ToCharArray() | Select-Object -First ($PadLength - 1)) -join ''\n                    } else {\n                        $ColumnValue = (\"$ColumnValue\".ToCharArray() | Select-Object -First ($PadLength)) -join ''\n                    }\n                    if ($Output -eq '') {\n                        if ($AlignRight) {\n                            $Output = \"$ColumnValue\".PadLeft($PadLength)\n                        } else {\n                            $Output = \"$ColumnValue\".PadRight($PadLength)\n                        }\n                    } else {\n                        if ($AlignRight) {\n                            $Output = $Output + \"$ColumnValue\".PadLeft($PadLength)\n                        } else {\n                            $Output = $Output + \"$ColumnValue\".PadRight($PadLength)\n                        }\n                    }\n                    $ColumnNumber++\n                }\n                if ($Stream -eq 'Output') {\n                    Write-Output -InputObject $Output\n                } elseif ($Stream -eq 'Host') {\n                    if ($ForegroundColorRow -contains $RowCountColors) {\n                        [int] $Index = $ForegroundColorRow.IndexOf($RowCountColors)\n                        Write-Host -Object $Output -ForegroundColor $ForegroundColor[$Index]\n                    } else {\n                        Write-Host -Object $Output\n                    }\n                } elseif ($Stream -eq 'Warning') {\n                    Write-Warning -Message $Output\n                } elseif ($Stream -eq 'Verbose') {\n                    Write-Verbose -Message $Output\n                } elseif ($Stream -eq 'Debug') {\n                    Write-Debug -Message $Output\n                } elseif ($Stream -eq 'Information') {\n                    Write-Information -MessageData $Output\n                }\n\n\n                if (-not $HideTableHeaders) {\n                    # Add underline\n                    if ($FirstLoop) {\n                        $HeaderUnderline = $Output -Replace '\\w', '-'\n                        #Write-Verbose -Message $HeaderUnderline\n                        if ($Stream -eq 'Output') {\n                            Write-Output -InputObject $HeaderUnderline\n                        } elseif ($Stream -eq 'Host') {\n                            if ($ForegroundColorRow -contains $RowCountColors) {\n                                [int] $Index = $ForegroundColorRow.IndexOf($RowCountColors)\n                                Write-Host -Object $HeaderUnderline -ForegroundColor $ForegroundColor[$Index]\n                            } else {\n                                Write-Host -Object $HeaderUnderline\n                            }\n                        } elseif ($Stream -eq 'Warning') {\n                            Write-Warning -Message $HeaderUnderline\n                        } elseif ($Stream -eq 'Verbose') {\n                            Write-Verbose -Message $HeaderUnderline\n                        } elseif ($Stream -eq 'Debug') {\n                            Write-Debug -Message $HeaderUnderline\n                        } elseif ($Stream -eq 'Information') {\n                            Write-Information -MessageData $HeaderUnderline\n                        }\n                    }\n                }\n\n                $FirstLoop = $false\n                $RowCountColors++\n            }\n        }\n\n        # Add empty line\n        if ($Stream -eq 'Output') {\n            Write-Output -InputObject ''\n        } elseif ($Stream -eq 'Host') {\n            Write-Host -Object ''\n        } elseif ($Stream -eq 'Warning') {\n            Write-Warning -Message ''\n        } elseif ($Stream -eq 'Verbose') {\n            Write-Verbose -Message ''\n        } elseif ($Stream -eq 'Debug') {\n            Write-Debug -Message ''\n        } elseif ($Stream -eq 'Information') {\n            Write-Information -MessageData ''\n        }\n\n\n        # Set back to defaults\n        if ($Stream -eq 'Output') {\n            #\n        } elseif ($Stream -eq 'Host') {\n            #\n        } elseif ($Stream -eq 'Warning') {\n            $WarningPreference = $WarningCurrent\n        } elseif ($Stream -eq 'Verbose') {\n            $VerbosePreference = $VerboseCurrent\n        } elseif ($Stream -eq 'Debug') {\n            $DebugPreference = $DebugCurrent\n        } elseif ($Stream -eq 'Information') {\n            $InformationPreference = $InformationCurrent\n        }\n    }\n}"
  },
  {
    "path": "Public/Objects/Format-StringToSentence.ps1",
    "content": "function Format-StringToSentence {\n    <#\n    .SYNOPSIS\n    Formats a given string by adding spaces before uppercase letters, digits, and non-word characters.\n\n    .DESCRIPTION\n    The Format-AddSpaceToSentence function takes a string or an array of strings\n    and adds a space before each uppercase letter, digit, and non-word character (excluding dots, spaces, and underscores).\n    It also provides options to convert the string to lowercase, remove certain characters before or after the formatting, and remove double spaces.\n\n    .PARAMETER Text\n    The string or array of strings to be formatted.\n\n    .PARAMETER RemoveCharsBefore\n    An array of characters to be removed from the string before the formatting is applied.\n\n    .PARAMETER RemoveCharsAfter\n    An array of characters to be removed from the string after the formatting is applied.\n\n    .PARAMETER ToLowerCase\n    If this switch is present, the function will convert the string to lowercase.\n\n    .PARAMETER RemoveDoubleSpaces\n    If this switch is present, the function will remove any double spaces from the string.\n\n    .PARAMETER MakeWordsUpperCase\n    An array of words that should be converted to uppercase after the formatting is applied.\n\n    .PARAMETER DisableAddingSpace\n    If this switch is present, the function will not add spaces before uppercase letters, digits, and non-word characters.\n\n    .EXAMPLE\n    $test = @(\n        'OnceUponATime',\n        'OnceUponATime1',\n        'Money@Risk',\n        'OnceUponATime123',\n        'AHappyMan2014'\n        'OnceUponATime_123'\n        'Domain test.com'\n    )\n\n    Format-StringToSentence -Text $Test -RemoveCharsAfter '_' -RemoveDoubleSpaces\n\n    This example formats each string in the $test array, removes any underscores after the formatting, and removes any double spaces.\n\n    .EXAMPLE\n    $test = @(\n        'OnceUponATime',\n        'OnceUponATime1',\n        'Money@Risk',\n        'OnceUponATime123',\n        'AHappyMan2014'\n        'OnceUponATime_123'\n        'Domain test.com'\n    )\n\n    $Test | Format-StringToSentence -ToLowerCase -RemoveCharsAfter '_' -RemoveDoubleSpaces\n\n    This example does the same as the previous one, but also converts each string to lowercase.\n\n    .EXAMPLE\n    $test = @(\n        'OnceUponATime',\n        'OnceUponATime1',\n        'Money@Risk',\n        'OnceUponATime123',\n        'AHappyMan2014'\n        'OnceUponATime_123'\n        'Domain test.com'\n    )\n\n    Format-StringToSentence -Text $Test -RemoveCharsAfter '_' -RemoveDoubleSpaces -MakeWordsUpperCase 'test.com', 'money'\n\n    .NOTES\n    The function uses the -creplace operator to add spaces, which is case-insensitive. Therefore, it will add spaces before both uppercase and lowercase letters if they are specified in the RemoveCharsBefore or RemoveCharsAfter parameters.\n    #>\n    [alias('Format-AddSpaceToSentence')]\n    [CmdletBinding()]\n    param(\n        [Parameter(Mandatory = $false, ValueFromPipeline = $true, Position = 0)][string[]] $Text,\n        [string[]] $RemoveCharsBefore,\n        [string[]] $RemoveCharsAfter,\n        [switch] $ToLowerCase,\n        [switch] $RemoveDoubleSpaces,\n        [string[]] $MakeWordsUpperCase,\n        [switch] $DisableAddingSpace\n    )\n    Process {\n        foreach ($T in $Text) {\n            if ($RemoveCharsBefore) {\n                foreach ($R in $RemoveCharsBefore) {\n                    $T = $T -ireplace [regex]::Escape($R), \"\"\n                }\n            }\n            if (-not $DisableAddingSpace) {\n                $T = $T -creplace '([A-Z]|[^a-zA-Z0-9_.\\s]|_|\\d+)(?<![a-z])', ' $&'\n            }\n            if ($ToLowerCase) {\n                $T = $T.ToLower()\n            }\n            if ($RemoveCharsAfter) {\n                foreach ($R in $RemoveCharsAfter) {\n                    $T = $T -ireplace [regex]::Escape($R), \"\"\n                }\n            }\n            if ($RemoveDoubleSpaces) {\n                $T = $T -creplace '\\s+', ' '\n            }\n            if ($MakeWordsUpperCase) {\n                foreach ($W in $MakeWordsUpperCase) {\n                    $T = $T -ireplace [regex]::Escape($W), $W.ToUpper()\n\n                }\n            }\n            $T.Trim()\n        }\n    }\n}"
  },
  {
    "path": "Public/Objects/Format-ToTitleCase.ps1",
    "content": "function Format-ToTitleCase {\n    <#\n    .SYNOPSIS\n    Formats string or number of strings to Title Case\n\n    .DESCRIPTION\n    Formats string or number of strings to Title Case allowing for prettty display\n\n    .PARAMETER Text\n    Sentence or multiple sentences to format\n\n    .PARAMETER RemoveWhiteSpace\n    Removes spaces after formatting string to Title Case.\n\n    .PARAMETER RemoveChar\n    Array of characters to remove\n\n    .EXAMPLE\n    Format-ToTitleCase 'me'\n\n    Output:\n    Me\n\n    .EXAMPLE\n    'me i feel good' | Format-ToTitleCase\n\n    Output:\n    Me I Feel Good\n    Not Feel\n\n    .EXAMPLE\n    'me i feel', 'not feel' | Format-ToTitleCase\n\n    Output:\n    Me I Feel Good\n    Not Feel\n\n    .EXAMPLE\n    Format-ToTitleCase -Text 'This is my thing' -RemoveWhiteSpace\n\n    Output:\n    ThisIsMyThing\n\n    .EXAMPLE\n    Format-ToTitleCase -Text \"This is my thing: That - No I don't want all chars\" -RemoveWhiteSpace -RemoveChar ',', '-', \"'\", '\\(', '\\)', ':'\n\n    .NOTES\n    General notes\n\n    #>\n    [CmdletBinding()]\n    param(\n        [Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0)][string[]] $Text,\n        [switch] $RemoveWhiteSpace,\n        [string[]] $RemoveChar\n    )\n    Begin {}\n    Process {\n        $Conversion = foreach ($T in $Text) {\n            $Output = (Get-Culture).TextInfo.ToTitleCase($T)\n            foreach ($Char in $RemoveChar) {\n                $Output = $Output -replace $Char\n            }\n            if ($RemoveWhiteSpace) {\n                $Output = $Output -replace ' ', ''\n            }\n            $Output\n        }\n        $Conversion\n    }\n    End {}\n}"
  },
  {
    "path": "Public/Objects/Format-TransposeTable.ps1",
    "content": "function Format-TransposeTable {\n    <#\n    .SYNOPSIS\n    Transposes (pivot) a table of objects\n\n    .DESCRIPTION\n    Transposes (pivot) a table of objects\n\n    .PARAMETER AllObjects\n    List of objects to transpose\n\n    .PARAMETER Sort\n    Legacy parameter to sort the output\n\n    .PARAMETER Legacy\n    Allows to transpose the table in a legacy way\n\n    .PARAMETER Property\n    Provides a property to name the column based on the property value\n\n    .EXAMPLE\n    $T = [PSCustomObject] @{\n        Name   = \"Server 1\"\n        Test   = 1\n        Test2  = 7\n        Ole    = 'bole'\n        Trolle = 'A'\n        Alle   = 'sd'\n    }\n    $T1 = [PSCustomObject] @{\n        Name   = \"Server 2\"\n        Test   = 2\n        Test2  = 3\n        Ole    = '1bole'\n        Trolle = 'A'\n        Alle   = 'sd'\n    }\n\n    Format-TransposeTable -Object @($T, $T1) -Property \"Name\" | Format-Table\n\n    .EXAMPLE\n    $T2 = [ordered] @{\n        Name   = \"Server 1\"\n        Test   = 1\n        Test2  = 7\n        Ole    = 'bole'\n        Trolle = 'A'\n        Alle   = 'sd'\n    }\n    $T3 = [ordered] @{\n        Name   = \"Server 2\"\n        Test   = 2\n        Test2  = 3\n        Ole    = '1bole'\n        Trolle = 'A'\n        Alle   = 'sd'\n    }\n\n    $Test = Format-TransposeTable -Object @($T2, $T3)\n    $Test | Format-Table\n\n    .NOTES\n    General notes\n    #>\n    [CmdletBinding(DefaultParameterSetName = 'Pivot')]\n    param (\n        [Alias(\"Object\")]\n        [Parameter(ParameterSetName = 'Legacy', Position = 0, ValueFromPipeline, ValueFromPipelineByPropertyName)]\n        [Parameter(ParameterSetName = 'Pivot', Position = 0, ValueFromPipeline, ValueFromPipelineByPropertyName)]\n        [Array] $AllObjects,\n\n        [Parameter(ParameterSetName = 'Legacy')]\n        [ValidateSet(\"ASC\", \"DESC\", \"NONE\")][String] $Sort = 'NONE',\n\n        [Parameter(ParameterSetName = 'Legacy')]\n        [switch] $Legacy,\n\n        [Parameter(ParameterSetName = 'Pivot')]\n        [string] $Property,\n\n        [Parameter(ParameterSetName = 'Pivot')]\n        [string] $Name = \"Object \"\n    )\n    begin {\n        $Object = [System.Collections.Generic.List[object]]::new()\n    }\n    process {\n        foreach ($O in $AllObjects) {\n            $Object.Add($O)\n        }\n    }\n    end {\n        if (-not $Legacy) {\n            if ($Object[0] -is [System.Collections.IDictionary]) {\n                # Handling of dictionaries\n                $ListHeader = [System.Collections.Generic.List[string]]::new()\n                $ListHeader.Add('Name')\n                if ($Property) {\n                    foreach ($myObject in $Object) {\n                        $ListHeader.Add($myObject.$Property)\n                    }\n                } else {\n                    for ($i = 0; $i -lt $Object.Count; $i++) {\n                        $ListHeader.Add(\"$($Name)$i\")\n                    }\n                }\n                $CountOfProperties = $Object[0].GetEnumerator().Name.Count\n                [Array] $ObjectsList = for ($i = 0; $i -lt $CountOfProperties; $i++) {\n                    $TranslatedObject = [ordered] @{\n                        'Name' = $Object[0].GetEnumerator().Name[$i]\n                    }\n                    foreach ($Header in $ListHeader) {\n                        if ($Header -ne 'Name') {\n                            $TranslatedObject[$Header] = ''\n                        }\n                    }\n                    $TranslatedObject\n                }\n                for ($i = 0; $i -lt $ObjectsList.Count; $i++) {\n                    for ($j = 0; $j -lt $Object.Count; $j++) {\n                        $NameOfProperty = $ObjectsList[$i].Name\n                        $ObjectsList[$i][$j + 1] = $Object[$j].$NameOfProperty\n                    }\n                    [PSCustomObject] $ObjectsList[$i]\n                }\n            } else {\n                # PSCustomObject/Class handling\n                $ListHeader = [System.Collections.Generic.List[string]]::new()\n                $ListHeader.Add('Name')\n                if ($Property) {\n                    foreach ($myObject in $Object) {\n                        $ListHeader.Add($myObject.$Property)\n                    }\n                } else {\n                    if ($AllObjects.Count -eq 1) {\n                        $ListHeader.Add(\"$($Name)\")\n                    } else {\n                        for ($i = 0; $i -lt $Object.Count; $i++) {\n                            $ListHeader.Add(\"$($Name)$i\")\n                        }\n                    }\n                }\n                $CountOfProperties = $Object[0].PSObject.Properties.Name.Count\n                [Array] $ObjectsList = for ($i = 0; $i -lt $CountOfProperties; $i++) {\n                    $TranslatedObject = [ordered] @{\n                        'Name' = $Object[0].PSObject.Properties.Name[$i]\n                    }\n                    foreach ($Header in $ListHeader) {\n                        if ($Header -ne 'Name') {\n                            $TranslatedObject[$Header] = ''\n                        }\n                    }\n                    $TranslatedObject\n                }\n                for ($i = 0; $i -lt $ObjectsList.Count; $i++) {\n                    for ($j = 0; $j -lt $Object.Count; $j++) {\n                        $NameOfProperty = $ObjectsList[$i].Name\n                        $ObjectsList[$i][$j + 1] = $Object[$j].$NameOfProperty\n                    }\n                    [PSCustomObject] $ObjectsList[$i]\n                }\n            }\n        } else {\n            foreach ($myObject in $Object) {\n                if ($myObject -is [System.Collections.IDictionary]) {\n                    if ($Sort -eq 'ASC') {\n                        [PSCustomObject] $myObject.GetEnumerator() | Sort-Object -Property Name -Descending:$false\n                    } elseif ($Sort -eq 'DESC') {\n                        [PSCustomObject] $myObject.GetEnumerator() | Sort-Object -Property Name -Descending:$true\n                    } else {\n                        [PSCustomObject] $myObject\n                    }\n                } else {\n                    $Output = [ordered] @{ }\n                    if ($Sort -eq 'ASC') {\n                        $myObject.PSObject.Properties | Sort-Object -Property Name -Descending:$false | ForEach-Object {\n                            $Output[\"$($_.Name)\"] = $_.Value\n                        }\n                    } elseif ($Sort -eq 'DESC') {\n                        $myObject.PSObject.Properties | Sort-Object -Property Name -Descending:$true | ForEach-Object {\n                            $Output[\"$($_.Name)\"] = $_.Value\n                        }\n                    } else {\n                        $myObject.PSObject.Properties | ForEach-Object {\n                            $Output[\"$($_.Name)\"] = $_.Value\n                        }\n                    }\n                    $Output\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "Public/Objects/Format-View.ps1",
    "content": "function Format-View {\n    <#\n    .SYNOPSIS\n    Formats and displays objects in a customizable view.\n\n    .DESCRIPTION\n    The Format-View function formats and displays objects in a customizable view. It allows you to specify properties to include or exclude, control output streams, and customize the display format.\n\n    .PARAMETER InputObject\n    Specifies the object to format.\n\n    .PARAMETER Property\n    Specifies the properties of the object to include in the output.\n\n    .PARAMETER ExcludeProperty\n    Specifies the properties of the object to exclude from the output.\n\n    .PARAMETER HideTableHeaders\n    Indicates whether to hide table headers in the output.\n\n    .PARAMETER Stream\n    Specifies the output stream for the formatted object. Valid values are 'Output', 'Host', 'Warning', 'Verbose', 'Debug', and 'Information'.\n\n    .PARAMETER List\n    Indicates whether to display the object as a list.\n\n    .PARAMETER Autosize\n    Indicates whether to automatically adjust the column width based on the content.\n\n    .EXAMPLE\n    Format-View -InputObject $object -Property Name, Age -Stream Verbose\n    Formats the object with only the 'Name' and 'Age' properties and outputs to the verbose stream.\n\n    .EXAMPLE\n    Get-Process | Format-View -Property Name, CPU -Stream Host\n    Formats the process objects with only the 'Name' and 'CPU' properties and outputs to the host.\n\n    #>\n    [alias('FV', 'Format-Verbose', 'Format-Debug', 'Format-Warning')]\n    [CmdletBinding(DefaultParameterSetName = 'All')]\n    param(\n        [Parameter(Mandatory = $false, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Position = 0)]\n        [object] $InputObject,\n        [Parameter(Mandatory = $false, ValueFromPipeline = $false, Position = 1, ParameterSetName = 'Property')]\n        [Object[]] $Property,\n        [Parameter(Mandatory = $false, ValueFromPipeline = $false, Position = 2, ParameterSetName = 'ExcludeProperty')]\n        [Object[]] $ExcludeProperty,\n        [Parameter(Mandatory = $false, ValueFromPipeline = $false, Position = 3)]\n        [switch] $HideTableHeaders,\n        [Parameter(Mandatory = $false, ValueFromPipeline = $false, Position = 6)]\n        [validateset('Output', 'Host', 'Warning', 'Verbose', 'Debug', 'Information')]\n        [string] $Stream = 'Verbose',\n        [Parameter(Mandatory = $false, ValueFromPipeline = $false, Position = 7)]\n        [alias('AsList')][switch] $List,\n        [Parameter(Mandatory = $false, ValueFromPipeline = $false, Position = 8)]\n        [switch] $Autosize\n    )\n    Begin {\n        $IsVerbosePresent = $PSCmdlet.MyInvocation.BoundParameters[\"Verbose\"].IsPresent\n\n        if ($Stream -eq 'Output') {\n            #\n        } elseif ($Stream -eq 'Host') {\n            #\n        } elseif ($Stream -eq 'Warning') {\n            [System.Management.Automation.ActionPreference] $WarningCurrent = $WarningPreference\n            $WarningPreference = 'continue'\n        } elseif ($Stream -eq 'Verbose') {\n            [System.Management.Automation.ActionPreference] $VerboseCurrent = $VerbosePreference\n            $VerbosePreference = 'continue'\n        } elseif ($Stream -eq 'Debug') {\n            [System.Management.Automation.ActionPreference] $DebugCurrent = $DebugPreference\n            $DebugPreference = 'continue'\n        } elseif ($Stream -eq 'Information') {\n            [System.Management.Automation.ActionPreference] $InformationCurrent = $InformationPreference\n            $InformationPreference = 'continue'\n        }\n\n        [bool] $FirstRun = $True # First run for pipeline\n        [bool] $FirstLoop = $True # First loop for data\n        [bool] $FirstList = $True # First loop for a list\n        [int] $ScreenWidth = $Host.UI.RawUI.WindowSize.Width - 12 # Removes 12 chars because of VERBOSE: output\n        $MyList = [System.Collections.Generic.List[Object]]::new()\n    }\n    Process {\n        $MyList.Add($InputObject)\n    }\n    End {\n        $Parameters = @{}\n        if ($Property) {\n            $Parameters.Property = $Property\n        }\n        if ($ExcludeProperty) {\n            $Parameters.ExcludeProperty = $ExcludeProperty\n        }\n        if ($HideTableHeaders) {\n            $Parameters.HideTableHeaders = $HideTableHeaders\n        }\n\n        if ($List) {\n            # Show and set back to defaults\n            if ($Stream -eq 'Output') {\n                $MyList | Format-List @Parameters | Out-String | Write-Output\n            } elseif ($Stream -eq 'Host') {\n                $MyList | Format-List @Parameters | Out-String | Write-Host\n            } elseif ($Stream -eq 'Warning') {\n                $MyList | Format-List @Parameters | Out-String | Write-Warning\n                $WarningPreference = $WarningCurrent\n            } elseif ($Stream -eq 'Verbose') {\n                $MyList | Format-List @Parameters | Out-String | Write-Verbose\n                $VerbosePreference = $VerboseCurrent\n            } elseif ($Stream -eq 'Debug') {\n                $MyList | Format-List @Parameters | Out-String | Write-Debug\n                $DebugPreference = $DebugCurrent\n            } elseif ($Stream -eq 'Information') {\n                $MyList | Format-List @Parameters | Out-String | Write-Information\n                $InformationPreference = $InformationCurrent\n            }\n        } else {\n            # Show and set back to defaults\n            if ($Stream -eq 'Output') {\n                $MyList | Format-Table @Parameters | Out-String | Write-Output\n            } elseif ($Stream -eq 'Host') {\n                $MyList | Format-Table @Parameters | Out-String | Write-Host\n            } elseif ($Stream -eq 'Warning') {\n                $MyList | Format-Table @Parameters | Out-String | Write-Warning\n                $WarningPreference = $WarningCurrent\n            } elseif ($Stream -eq 'Verbose') {\n                $MyList | Format-Table @Parameters | Out-String | Write-Verbose\n                $VerbosePreference = $VerboseCurrent\n            } elseif ($Stream -eq 'Debug') {\n                $MyList | Format-Table @Parameters | Out-String | Write-Debug\n                $DebugPreference = $DebugCurrent\n            } elseif ($Stream -eq 'Information') {\n                $MyList | Format-Table @Parameters | Out-String | Write-Information\n                $InformationPreference = $InformationCurrent\n            }\n        }\n    }\n}"
  },
  {
    "path": "Public/Objects/Get-Colors.ps1",
    "content": "﻿function Get-Colors {\n    <#\n    .SYNOPSIS\n    Retrieves RGB color values based on the provided color names.\n\n    .DESCRIPTION\n    The Get-Colors function retrieves RGB color values from a predefined list based on the color names provided as input. If no color names are specified, it returns all available RGB color values.\n\n    .PARAMETER Color\n    Specifies an array of color names for which RGB values are to be retrieved.\n\n    .EXAMPLE\n    Get-Colors -Color \"Red\", \"Green\"\n    Retrieves the RGB values for the colors Red and Green.\n\n    .EXAMPLE\n    Get-Colors\n    Retrieves all available RGB color values.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string[]] $Color\n    )\n    if ($Color) {\n        foreach ($_ in $Color) {\n            $Script:RGBColors.$_\n        }\n    } else {\n        return $Script:RGBColors\n    }\n}\n$ScriptBlockColors = {\n    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)\n    $Script:RGBColors.Keys | Where-Object { $_ -like \"*$wordToComplete*\" }\n}\n\nRegister-ArgumentCompleter -CommandName Get-Colors -ParameterName Color -ScriptBlock $ScriptBlockColors"
  },
  {
    "path": "Public/Objects/Get-DataInformation.ps1",
    "content": "﻿function Get-DataInformation {\n    <#\n    .SYNOPSIS\n    Retrieves data information based on specified criteria.\n\n    .DESCRIPTION\n    This function retrieves data information based on the specified criteria. It checks for required types, availability of commands, and executes content if provided.\n\n    .PARAMETER Content\n    The script block to execute for gathering data.\n\n    .PARAMETER Text\n    The text message to display when gathering data.\n\n    .PARAMETER TypesRequired\n    An array of types required for data gathering.\n\n    .PARAMETER TypesNeeded\n    An array of types needed for data gathering.\n\n    .PARAMETER Commands\n    An array of commands to check for availability.\n\n    .PARAMETER SkipAvailability\n    Switch to skip availability check for commands.\n\n    .EXAMPLE\n    Get-DataInformation -Content { Get-Process } -Text \"Gathering process information\" -TypesRequired @(\"System.Diagnostics.Process\") -TypesNeeded @(\"System.Diagnostics.Process\") -Commands @(\"Get-Process\")\n\n    Description:\n    Retrieves process information using the Get-Process command.\n\n    .EXAMPLE\n    Get-DataInformation -Content { Get-Service } -Text \"Gathering service information\" -TypesRequired @(\"System.ServiceProcess.ServiceController\") -TypesNeeded @(\"System.ServiceProcess.ServiceController\") -Commands @(\"Get-Service\")\n\n    Description:\n    Retrieves service information using the Get-Service command.\n    #>\n    [CmdletBinding()]\n    param(\n        [ScriptBlock] $Content,\n        [string] $Text,\n        [Array] $TypesRequired,\n        [Array] $TypesNeeded,\n        [Array] $Commands,\n        [switch] $SkipAvailability\n    )\n    if (Find-TypesNeeded -TypesRequired $TypesRequired -TypesNeeded $TypesNeeded) {\n        Write-Verbose -Message $Text\n        $Time = Start-TimeLog\n\n        if ($Commands.Count -gt 0 -and -not $SkipAvailability) {\n            $Available = Test-AvailabilityCommands -Commands $Commands\n            if ($Available -contains $false) {\n                $EndTime = Stop-TimeLog -Time $Time -Option OneLiner\n                Write-Warning \"Get-DataInformation - Commands $($Commands -join \", \") is/are not available. Data gathering skipped.\"\n                Write-Verbose \"$Text - Time: $EndTime\"\n                return\n            }\n        }\n        if ($null -ne $Content) {\n            & $Content\n        }\n        $EndTime = Stop-TimeLog -Time $Time -Option OneLiner\n        Write-Verbose \"$Text - Time: $EndTime\"\n    }\n}"
  },
  {
    "path": "Public/Objects/Get-MimeType.ps1",
    "content": "function Get-MimeType {\r\n\t<#\r\n\t.SYNOPSIS\r\n\tGet-MimeType function returns the MIME type of a file based on its extension.\r\n\r\n\t.DESCRIPTION\r\n\tThis function takes a file name as input and returns the corresponding MIME type based on the file extension.\r\n\r\n\t.PARAMETER FileName\r\n\tSpecifies the name of the file for which the MIME type needs to be determined.\r\n\r\n\t.EXAMPLE\r\n\tGet-MimeType -FileName \"example.jpg\"\r\n\tReturns \"image/jpeg\" as the MIME type for the file \"example.jpg\".\r\n\r\n\t.EXAMPLE\r\n\tGet-MimeType -FileName \"example.png\"\r\n\tReturns \"image/png\" as the MIME type for the file \"example.png\".\r\n\t#>\r\n\t[CmdletBinding()]\r\n\tparam (\r\n\t\t[Parameter(Mandatory = $true)]\r\n\t\t[string] $FileName\r\n\t)\r\n\r\n\t$MimeMappings = @{\r\n\t\t'.jpeg' = 'image/jpeg'\r\n\t\t'.jpg'  = 'image/jpeg'\r\n\t\t'.png'  = 'image/png'\r\n\t}\r\n\r\n\t$Extension = [System.IO.Path]::GetExtension( $FileName )\r\n\t$ContentType = $MimeMappings[ $Extension ]\r\n\r\n\tif ([string]::IsNullOrEmpty($ContentType)) {\r\n\t\treturn New-Object System.Net.Mime.ContentType\r\n\t} else {\r\n\t\treturn New-Object System.Net.Mime.ContentType($ContentType)\r\n\t}\r\n}"
  },
  {
    "path": "Public/Objects/Get-Types.ps1",
    "content": "Function Get-Types {\n    <#\n    .SYNOPSIS\n    Retrieves the enum values of the specified types.\n\n    .DESCRIPTION\n    This function takes an array of types and returns the enum values of each type.\n\n    .PARAMETER Types\n    Specifies the types for which enum values need to be retrieved.\n\n    .EXAMPLE\n    Get-Types -Types [System.DayOfWeek]\n    Retrieves the enum values of the System.DayOfWeek type.\n\n    .EXAMPLE\n    Get-Types -Types [System.ConsoleColor, System.EnvironmentVariableTarget]\n    Retrieves the enum values of the System.ConsoleColor and System.EnvironmentVariableTarget types.\n    #>\n    [CmdletBinding()]\n    param (\n        [Object] $Types\n    )\n    $TypesRequired = foreach ($Type in $Types) {\n        $Type.GetEnumValues()\n    }\n    return $TypesRequired\n}"
  },
  {
    "path": "Public/Objects/Join-Uri.ps1",
    "content": "﻿function Join-Uri {\n    <#\n    .SYNOPSIS\n    Provides ability to join two Url paths together\n\n    .DESCRIPTION\n    Provides ability to join two Url paths together\n\n    .PARAMETER BaseUri\n    Primary Url to merge\n\n    .PARAMETER RelativeOrAbsoluteUri\n    Additional path to merge with primary url\n\n    .EXAMPLE\n    Join-Uri 'https://evotec.xyz/' '/wp-json/wp/v2/posts'\n\n    .EXAMPLE\n    Join-Uri 'https://evotec.xyz/' 'wp-json/wp/v2/posts'\n\n    .EXAMPLE\n    Join-Uri -BaseUri 'https://evotec.xyz/' -RelativeOrAbsoluteUri '/wp-json/wp/v2/posts'\n\n    .EXAMPLE\n    Join-Uri -BaseUri 'https://evotec.xyz/test/' -RelativeOrAbsoluteUri '/wp-json/wp/v2/posts'\n\n    .NOTES\n    General notes\n    #>\n    [alias('Join-Url')]\n    [cmdletBinding()]\n    param(\n        [parameter(Mandatory)][uri] $BaseUri,\n        [parameter(Mandatory)][uri] $RelativeOrAbsoluteUri\n    )\n\n    return ($BaseUri.OriginalString.TrimEnd('/') + \"/\" + $RelativeOrAbsoluteUri.OriginalString.TrimStart('/'))\n    #return [Uri]::new([Uri]::new($BaseUri), $RelativeOrAbsoluteUri).ToString()\n    #return [Uri]::new($BaseUri.OriginalString, $RelativeOrAbsoluteUri).ToString()\n}"
  },
  {
    "path": "Public/Objects/Join-UriQuery.ps1",
    "content": "﻿function Join-UriQuery {\n    <#\n    .SYNOPSIS\n    Provides ability to join two Url paths together including advanced querying\n\n    .DESCRIPTION\n    Provides ability to join two Url paths together including advanced querying which is useful for RestAPI/GraphApi calls\n\n    .PARAMETER BaseUri\n    Primary Url to merge\n\n    .PARAMETER RelativeOrAbsoluteUri\n    Additional path to merge with primary url (optional)\n\n    .PARAMETER QueryParameter\n    Parameters and their values in form of hashtable\n\n    .PARAMETER EscapeUriString\n    If set, will escape the url string\n\n    .EXAMPLE\n    Join-UriQuery -BaseUri 'https://evotec.xyz/' -RelativeOrAbsoluteUri '/wp-json/wp/v2/posts' -QueryParameter @{\n        page     = 1\n        per_page = 20\n        search   = 'SearchString'\n    }\n\n    .EXAMPLE\n    Join-UriQuery -BaseUri 'https://evotec.xyz/wp-json/wp/v2/posts' -QueryParameter @{\n        page     = 1\n        per_page = 20\n        search   = 'SearchString'\n    }\n\n    .EXAMPLE\n    Join-UriQuery -BaseUri 'https://evotec.xyz' -RelativeOrAbsoluteUri '/wp-json/wp/v2/posts'\n\n    .NOTES\n    General notes\n    #>\n    [alias('Join-UrlQuery')]\n    [CmdletBinding()]\n    param (\n        [parameter(Mandatory)][uri] $BaseUri,\n        [parameter(Mandatory = $false)][uri] $RelativeOrAbsoluteUri,\n        [Parameter()][System.Collections.IDictionary] $QueryParameter,\n        [alias('EscapeUrlString')][switch] $EscapeUriString\n    )\n    Begin {\n        Add-Type -AssemblyName System.Web\n    }\n    Process {\n        # Join primary url with additional path if needed\n        if ($BaseUri -and $RelativeOrAbsoluteUri) {\n            $Url = Join-Uri -BaseUri $BaseUri -RelativeOrAbsoluteUri $RelativeOrAbsoluteUri\n        } else {\n            $Url = $BaseUri\n        }\n\n        # Create a http name value collection from an empty string\n        if ($QueryParameter) {\n            $Collection = [System.Web.HttpUtility]::ParseQueryString([String]::Empty)\n            foreach ($key in $QueryParameter.Keys) {\n                $Collection.Add($key, $QueryParameter.$key)\n            }\n        }\n\n        # Build the uri\n        $uriRequest = [System.UriBuilder] $Url\n        if ($Collection) {\n            $uriRequest.Query = $Collection.ToString()\n        }\n        if (-not $EscapeUriString) {\n            $uriRequest.Uri.AbsoluteUri\n        } else {\n            [System.Uri]::EscapeUriString($uriRequest.Uri.AbsoluteUri)\n        }\n    }\n}"
  },
  {
    "path": "Public/Objects/Merge-Array.ps1",
    "content": "function Merge-Array {\n    <#\n    .SYNOPSIS\n    Merge-Array allows to merge two or more arrays together. \n    \n    .DESCRIPTION\n    Merge-Array allows to merge two or more arrays together. It copies headers from each Array and merges them together allowing for fulll output. \n    When used with Prescan parameter it actually is able to show headers from all arrays\n    \n    .PARAMETER Array\n    List of Arrays to process\n    \n    .PARAMETER Prescan\n    Scans each element of each array for headers. \n    \n    .EXAMPLE\n    $Array1 = @(\n        [PSCustomObject] @{ Name = 'Company1'; Count = 259  }\n        [PSCustomObject] @{ Name = 'Company2'; Count = 300 }\n    )\n    $Array2 = @(\n        [PSCustomObject] @{ Name = 'Company1'; Count = 25 }\n        [PSCustomObject] @{ Name = 'Company2'; Count = 100 }\n    )\n    $Array3 = @(\n        [PSCustomObject] @{ Name1 = 'Company1'; Count3 = 25 }\n        [PSCustomObject] @{ Name1 = 'Company2'; Count3 = 100 }\n        [PSCustomObject] @{ Name2 = 'Company2'; Count3 = 100 }\n    )\n\n    $Array1 | Format-Table -AutoSize\n    $Array2 | Format-Table -AutoSize\n    $Array3 | Format-Table -AutoSize\n\n    Merge-Array -Array $Array1, $Array2, $Array3 | Format-Table -AutoSize\n    Merge-Array -Array $Array1, $Array2, $Array3 -Prescan | Format-Table -AutoSize\n    \n    .NOTES\n    General notes\n    #>\n    \n    param(\n        [Array[]] $Array,\n        [switch] $Prescan\n    )\n    $PropertyNames = foreach ($A in $Array) {\n        if ($Prescan) {\n            foreach ($O in $A) {\n                $O.PSObject.Properties.Name\n            }\n        } else {\n            $A[0].PSObject.Properties.Name\n        }\n    } \n    $PropertyNames = $PropertyNames | Sort-Object -Unique\n    foreach ($A in $Array) {\n        $A | Select-Object -Property $PropertyNames\n    }\n}"
  },
  {
    "path": "Public/Objects/Merge-Objects.ps1",
    "content": "<#\n$FoundUser1 = [pscustomobject] @{\n    'Duplicate Group1' = 'test1'\n    'User2'            = 'test2'\n}\n\n$FoundUser2 = [pscustomobject] @{\n    'Duplicate Group2' = 'test3'\n    'User1'            = 'test4'\n}\n\nMerge-Objects -Object1 $FoundUser1 -Object2 $FoundUser2\n#>\nfunction Merge-Objects {\n    <#\n    .SYNOPSIS\n    Merges two objects into a single object.\n\n    .DESCRIPTION\n    This function merges two objects into a single object by combining their properties. If there are duplicate properties, the values from Object2 will overwrite the values from Object1.\n\n    .PARAMETER Object1\n    The first object to be merged.\n\n    .PARAMETER Object2\n    The second object to be merged.\n\n    .EXAMPLE\n    $Object1 = [pscustomobject] @{\n        'Name' = 'John Doe'\n        'Age'  = 30\n    }\n\n    $Object2 = [pscustomobject] @{\n        'Age'  = 31\n        'City' = 'New York'\n    }\n\n    Merge-Objects -Object1 $Object1 -Object2 $Object2\n\n    Description\n    -----------\n    Merges $Object1 and $Object2 into a single object. The resulting object will have properties 'Name', 'Age', and 'City' with values 'John Doe', 31, and 'New York' respectively.\n\n    #>\n    [CmdletBinding()]\n    param (\n        [Object] $Object1,\n        [Object] $Object2\n    )\n    $Object = [ordered] @{}\n    foreach ($Property in $Object1.PSObject.Properties) {\n        $Object.($Property.Name) = $Property.Value\n\n    }\n    foreach ($Property in $Object2.PSObject.Properties) {\n        $Object.($Property.Name) = $Property.Value\n    }\n    return [pscustomobject] $Object\n}"
  },
  {
    "path": "Public/Objects/Remove-DuplicateObjects.ps1",
    "content": "function Remove-DuplicateObjects {\n    <#\n    .SYNOPSIS\n    Removes duplicate objects from a list based on specified properties.\n\n    .DESCRIPTION\n    This function removes duplicate objects from the input list based on the specified properties. It retains only unique objects in the list.\n\n    .PARAMETER Object\n    The list of objects to remove duplicates from.\n\n    .PARAMETER Property\n    The properties to consider when identifying duplicates.\n\n    .EXAMPLE\n    $Array = @()\n    $Array += [PSCustomObject] @{ 'Name' = 'Test'; 'Val1' = 'Testor2'; 'Val2' = 'Testor2'}\n    $Array += [PSCustomObject] @{ 'Name' = 'Test'; 'Val1' = 'Testor2'; 'Val2' = 'Testor2'}\n    $Array += [PSCustomObject] @{ 'Name' = 'Test1'; 'Val1' = 'Testor2'; 'Val2' = 'Testor2'}\n    $Array += [PSCustomObject] @{ 'Name' = 'Test1'; 'Val1' = 'Testor2'; 'Val2' = 'Testor2'}\n\n    Write-Color 'Before' -Color Red\n    $Array | Format-Table -A\n\n    Write-Color 'After' -Color Green\n    $Array = $Array | Sort-Object -Unique -Property 'Name', 'Val1','Val2'\n    $Array | Format-Table -AutoSize\n\n    .NOTES\n    This function removes duplicate objects from a list based on specified properties.\n    #>\n    [CmdletBinding()]\n    param(\n        [System.Collections.IList] $Object,\n        [string[]] $Property\n    )\n    if ($Object.Count -eq 0) {\n        return $Object\n    } else {\n        return $Object | Sort-Object -Property $Property -Unique\n    }\n}"
  },
  {
    "path": "Public/Objects/Remove-EmptyValue.ps1",
    "content": "﻿function Remove-EmptyValue {\n    <#\n    .SYNOPSIS\n    Removes empty values from a hashtable recursively.\n\n    .DESCRIPTION\n    This function removes empty values from a given hashtable. It can be used to clean up a hashtable by removing keys with null, empty string, empty array, or empty dictionary values. The function supports recursive removal of empty values.\n\n    .PARAMETER Hashtable\n    The hashtable from which empty values will be removed.\n\n    .PARAMETER ExcludeParameter\n    An array of keys to exclude from the removal process.\n\n    .PARAMETER Recursive\n    Indicates whether to recursively remove empty values from nested hashtables.\n\n    .PARAMETER Rerun\n    Specifies the number of times to rerun the removal process recursively.\n\n    .PARAMETER DoNotRemoveNull\n    If specified, null values will not be removed.\n\n    .PARAMETER DoNotRemoveEmpty\n    If specified, empty string values will not be removed.\n\n    .PARAMETER DoNotRemoveEmptyArray\n    If specified, empty array values will not be removed.\n\n    .PARAMETER DoNotRemoveEmptyDictionary\n    If specified, empty dictionary values will not be removed.\n\n    .EXAMPLE\n    $hashtable = @{\n        'Key1' = '';\n        'Key2' = $null;\n        'Key3' = @();\n        'Key4' = @{}\n    }\n    Remove-EmptyValue -Hashtable $hashtable -Recursive\n\n    Description\n    -----------\n    This example removes empty values from the $hashtable recursively.\n\n    .EXAMPLE\n    $SplatDictionary = [ordered] @{\n        Test  = $NotExistingParameter\n        Test1 = 'Existing Entry'\n        Test2 = $null\n        Test3 = ''\n        Test5 = 0\n        Test6 = 6\n        Test7 = @{}\n    }\n\n    Remove-EmptyValue -Splat $SplatDictionary -Recursive -ExcludeParameter 'Test7'\n\n    $SplatDictionary\n\n    #>\n    [alias('Remove-EmptyValues')]\n    [CmdletBinding()]\n    param(\n        [alias('Splat', 'IDictionary')][Parameter(Mandatory)][System.Collections.IDictionary] $Hashtable,\n        [string[]] $ExcludeParameter,\n        [switch] $Recursive,\n        [int] $Rerun,\n        [switch] $DoNotRemoveNull,\n        [switch] $DoNotRemoveEmpty,\n        [switch] $DoNotRemoveEmptyArray,\n        [switch] $DoNotRemoveEmptyDictionary\n    )\n    foreach ($Key in [string[]] $Hashtable.Keys) {\n        if ($Key -notin $ExcludeParameter) {\n            if ($Recursive) {\n                if ($Hashtable[$Key] -is [System.Collections.IDictionary]) {\n                    if ($Hashtable[$Key].Count -eq 0) {\n                        if (-not $DoNotRemoveEmptyDictionary) {\n                            $Hashtable.Remove($Key)\n                        }\n                    } else {\n                        Remove-EmptyValue -Hashtable $Hashtable[$Key] -Recursive:$Recursive -ExcludeParameter $ExcludeParameter -DoNotRemoveNull:$DoNotRemoveNull -DoNotRemoveEmpty:$DoNotRemoveEmpty -DoNotRemoveEmptyArray:$DoNotRemoveEmptyArray -DoNotRemoveEmptyDictionary:$DoNotRemoveEmptyDictionary\n                    }\n                } else {\n                    if (-not $DoNotRemoveNull -and $null -eq $Hashtable[$Key]) {\n                        $Hashtable.Remove($Key)\n                    } elseif (-not $DoNotRemoveEmpty -and $Hashtable[$Key] -is [string] -and $Hashtable[$Key] -eq '') {\n                        $Hashtable.Remove($Key)\n                    } elseif (-not $DoNotRemoveEmptyArray -and $Hashtable[$Key] -is [System.Collections.IList] -and $Hashtable[$Key].Count -eq 0) {\n                        $Hashtable.Remove($Key)\n                    }\n                }\n            } else {\n                if (-not $DoNotRemoveNull -and $null -eq $Hashtable[$Key]) {\n                    $Hashtable.Remove($Key)\n                } elseif (-not $DoNotRemoveEmpty -and $Hashtable[$Key] -is [string] -and $Hashtable[$Key] -eq '') {\n                    $Hashtable.Remove($Key)\n                } elseif (-not $DoNotRemoveEmptyArray -and $Hashtable[$Key] -is [System.Collections.IList] -and $Hashtable[$Key].Count -eq 0) {\n                    $Hashtable.Remove($Key)\n                }\n            }\n        }\n    }\n    if ($Rerun) {\n        for ($i = 0; $i -lt $Rerun; $i++) {\n            Remove-EmptyValue -Hashtable $Hashtable -Recursive:$Recursive -ExcludeParameter $ExcludeParameter -DoNotRemoveNull:$DoNotRemoveNull -DoNotRemoveEmpty:$DoNotRemoveEmpty -DoNotRemoveEmptyArray:$DoNotRemoveEmptyArray -DoNotRemoveEmptyDictionary:$DoNotRemoveEmptyDictionary\n        }\n    }\n}"
  },
  {
    "path": "Public/Objects/Remove-ObjectsExistingInTarget.ps1",
    "content": "function Remove-ObjectsExistingInTarget {\n    <#\n    .SYNOPSIS\n    Removes objects from the source list that exist in the target list based on specified properties.\n\n    .DESCRIPTION\n    This function compares two lists of objects and removes objects from the source list that have matching properties in the target list. It returns either the objects that do not exist in the target list or only the objects that exist in the target list based on the specified properties.\n\n    .PARAMETER ObjectSource\n    The list of objects to compare against the target list.\n\n    .PARAMETER ObjectTarget\n    The list of objects to compare with.\n\n    .PARAMETER ComparePropertySource\n    The property in the source objects to compare.\n\n    .PARAMETER ComparePropertyTarget\n    The property in the target objects to compare.\n\n    .PARAMETER Reverse\n    Switch to return only the objects that exist in the target list.\n\n    .EXAMPLE\n    $sourceList = @(\n        [PSCustomObject]@{Id = 1; Name = \"A\"},\n        [PSCustomObject]@{Id = 2; Name = \"B\"},\n        [PSCustomObject]@{Id = 3; Name = \"C\"}\n    )\n\n    $targetList = @(\n        [PSCustomObject]@{Id = 2; Name = \"B\"},\n        [PSCustomObject]@{Id = 3; Name = \"C\"}\n    )\n\n    Remove-ObjectsExistingInTarget -ObjectSource $sourceList -ObjectTarget $targetList -ComparePropertySource \"Id\" -ComparePropertyTarget \"Id\"\n    # Output: Id Name\n    #        -- ----\n    #         1 A\n\n    .EXAMPLE\n    $sourceList = @(\n        [PSCustomObject]@{Id = 1; Name = \"A\"},\n        [PSCustomObject]@{Id = 2; Name = \"B\"},\n        [PSCustomObject]@{Id = 3; Name = \"C\"}\n    )\n\n    $targetList = @(\n        [PSCustomObject]@{Id = 2; Name = \"B\"},\n        [PSCustomObject]@{Id = 3; Name = \"C\"}\n    )\n\n    Remove-ObjectsExistingInTarget -ObjectSource $sourceList -ObjectTarget $targetList -ComparePropertySource \"Id\" -ComparePropertyTarget \"Id\" -Reverse\n    # Output: Id Name\n    #        -- ----\n    #         2 B\n    #         3 C\n    #>\n    param(\n        $ObjectSource,\n        $ObjectTarget,\n        [string] $ComparePropertySource,\n        [string] $ComparePropertyTarget,\n        [switch] $Reverse # returns only existing objects\n    )\n    $ObjectsExistingInTarget = @()\n    $ObjectsNotExistingInTarget = @()\n    foreach ($Object in $ObjectSource) {\n        if ($ObjectTarget.$ComparePropertySource -contains $Object.$ComparePropertyTarget) {\n            $ObjectsExistingInTarget += $Object\n        } else {\n            $ObjectsNotExistingInTarget += $Object\n        }\n    }\n    if ($Reverse) {\n        return $ObjectsExistingInTarget\n    } else {\n        return $ObjectsNotExistingInTarget\n    }\n}"
  },
  {
    "path": "Public/Objects/Remove-WhiteSpace.ps1",
    "content": "function Remove-WhiteSpace {\n    <#\n    .SYNOPSIS\n    Removes leading, trailing, and extra white spaces from a given text string.\n\n    .DESCRIPTION\n    The Remove-WhiteSpace function removes any leading, trailing, and extra white spaces from the input text string. It ensures that only single spaces separate words within the text.\n\n    .PARAMETER Text\n    The input text string from which white spaces are to be removed.\n\n    .EXAMPLE\n    $MyValue = Remove-WhiteSpace -Text '   My    Field  '\n    # $MyValue now contains 'My Field'\n\n    #>\n    param(\n        [string] $Text\n    )\n    $Text = $Text -replace '(^\\s+|\\s+$)','' -replace '\\s+',' '\n    return $Text\n}\n<#\n$MyValue = Remove-WhiteSpace -Text 'My Field  '\nWrite-Color $MyValue, 'No' -Color White, Yellow\n\n#>"
  },
  {
    "path": "Public/Objects/Rename-LatinCharacters.ps1",
    "content": "﻿Function Rename-LatinCharacters {\n    <#\n    .SYNOPSIS\n    Renames a name to a name without special chars.\n\n    .DESCRIPTION\n    Renames a name to a name without special chars.\n\n    .PARAMETER String\n    Provide a string to rename\n\n    .EXAMPLE\n    Rename-LatinCharacters -String 'Przemysław Kłys'\n\n    .EXAMPLE\n    Rename-LatinCharacters -String 'Przemysław'\n\n    .NOTES\n    General notes\n    #>\n    [alias('Remove-StringLatinCharacters')]\n    [cmdletBinding()]\n    param(\n        [string] $String\n    )\n    [Text.Encoding]::ASCII.GetString([Text.Encoding]::GetEncoding(\"Cyrillic\").GetBytes($String))\n}"
  },
  {
    "path": "Public/Objects/Rename-UserValuesFromHash.ps1",
    "content": "function Rename-UserValuesFromHash {\n    <#\n    .SYNOPSIS\n    This function renames user values based on a hash table of match data.\n\n    .DESCRIPTION\n    The Rename-UserValuesFromHash function takes a list of users, a hash table of match data, and an array of field types. It then renames specific values in the user objects based on the match data provided.\n\n    .PARAMETER Users\n    The list of user objects to be processed.\n\n    .PARAMETER MatchData\n    A hash table containing the match data used for renaming values.\n\n    .PARAMETER FieldTypes\n    An array of field types to be considered for renaming.\n\n    .EXAMPLE\n    $users = @(\n        [PSCustomObject]@{ UserPrincipalName = 'user1@test.com'; License = 'test:license'; ProxyAddress = 'proxy@test.com' }\n        [PSCustomObject]@{ UserPrincipalName = 'user2@test.com'; License = 'test:license'; ProxyAddress = 'proxy@test.com' }\n    )\n    $matchData = @{\n        'test.com' = 'newdomain.com'\n        'test:' = 'newdomain:'\n    }\n    $fieldTypes = @('UserPrincipalName', 'License')\n    Rename-UserValuesFromHash -Users $users -MatchData $matchData -FieldTypes $fieldTypes\n\n    #>\n    [CmdletBinding()]\n    param(\n        $Users,\n        $MatchData,\n        $FieldTypes\n    )\n    <#\n    foreach ($User in $DataFinland) {\n        $User.UserPrincipalName = $($User.UserPrincipalName).ToLower().Replace('@test.com', '@newdomain.com')\n        $User.License = $($User.License).ToLower().Replace('test:', 'newdomain:')\n        $User.ProxyAddress = $(($User.ProxyAddress).ToLower()).Replace('@test.com', '@newdomain.com').Replace('@test.onmicrosoft.com', '@newdomain.onmicrosoft.com')\n    }\n    #>\n    Write-Verbose \"FieldTypes: $($FieldTypes -join ',')\"\n    foreach ($User in $Users) {\n        foreach ($Match in $MatchData.Keys) {\n            $Key = $Match\n            $Value = $MatchData.$Match\n            Write-Verbose \"User: $($User.UserPrincipalName) Key: $Key Value: $Value\"\n            foreach ($Field in $FieldTypes) {\n                if ($User.$Field) {\n                    $User.$Field = $($User.$Field).ToLower().Replace($Key, $Value)\n                }\n            }\n        }\n    }\n    return $Users\n}"
  },
  {
    "path": "Public/Objects/Select-Properties.ps1",
    "content": "﻿function Select-Properties {\n    <#\n    .SYNOPSIS\n    Allows for easy selecting property names from one or multiple objects\n\n    .DESCRIPTION\n    Allows for easy selecting property names from one or multiple objects. This is especially useful with using AllProperties parameter where we want to make sure to get all properties from all objects.\n\n    .PARAMETER Objects\n    One or more objects\n\n    .PARAMETER Property\n    Properties to include\n\n    .PARAMETER ExcludeProperty\n    Properties to exclude\n\n    .PARAMETER AllProperties\n    All unique properties from all objects\n\n    .PARAMETER PropertyNameReplacement\n    Default property name when object has no properties\n\n    .EXAMPLE\n    $Object1 = [PSCustomobject] @{\n        Name1 = '1'\n        Name2 = '3'\n        Name3 = '5'\n    }\n    $Object2 = [PSCustomobject] @{\n        Name4 = '2'\n        Name5 = '6'\n        Name6 = '7'\n    }\n\n    Select-Properties -Objects $Object1, $Object2 -AllProperties\n\n    #OR:\n\n    $Object1, $Object2 | Select-Properties -AllProperties -ExcludeProperty Name6 -Property Name3\n\n    .EXAMPLE\n    $Object3 = [Ordered] @{\n        Name1 = '1'\n        Name2 = '3'\n        Name3 = '5'\n    }\n    $Object4 = [Ordered] @{\n        Name4 = '2'\n        Name5 = '6'\n        Name6 = '7'\n    }\n\n    Select-Properties -Objects $Object3, $Object4 -AllProperties\n\n    $Object3, $Object4 | Select-Properties -AllProperties\n\n    .NOTES\n    General notes\n    #>\n    [CmdLetBinding()]\n    param(\n        [Array][Parameter(Position = 0, ValueFromPipeline, ValueFromPipelineByPropertyName)] $Objects,\n        [string[]] $Property,\n        [string[]] $ExcludeProperty,\n        [switch] $AllProperties,\n        [string] $PropertyNameReplacement = '*'\n    )\n    Begin {\n        function Select-Unique {\n            [CmdLetBinding()]\n            param(\n                [System.Collections.IList] $Object\n            )\n            [Array] $CleanedList = foreach ($O in $Object) {\n                if ($null -ne $O) {\n                    $O\n                }\n            }\n            $New = $CleanedList.ToLower() | Select-Object -Unique\n            $Selected = foreach ($_ in $New) {\n                $Index = $Object.ToLower().IndexOf($_)\n                if ($Index -ne -1) {\n                    $Object[$Index]\n                }\n            }\n            $Selected\n        }\n        $ObjectsList = [System.Collections.Generic.List[Object]]::new()\n    }\n    Process {\n        foreach ($Object in $Objects) {\n            $ObjectsList.Add($Object)\n        }\n    }\n    End {\n        if ($ObjectsList.Count -eq 0) {\n            Write-Warning 'Select-Properties - Unable to process. Objects count equals 0.'\n            return\n        }\n        if ($ObjectsList[0] -is [System.Collections.IDictionary]) {\n            if ($AllProperties) {\n                [Array] $All = foreach ($_ in $ObjectsList) {\n                    $_.Keys\n                }\n                #  $FirstObjectProperties = $All | Select-Object -Unique\n                $FirstObjectProperties = Select-Unique -Object $All\n            } else {\n                $FirstObjectProperties = $ObjectsList[0].Keys\n            }\n            if ($Property.Count -gt 0 -and $ExcludeProperty.Count -gt 0) {\n                #$FirstObjectProperties = $FirstObjectProperties | Where-Object { $Property -contains $_ -and $ExcludeProperty -notcontains $_ }\n                $FirstObjectProperties = foreach ($_ in $FirstObjectProperties) {\n                    if ($Property -contains $_ -and $ExcludeProperty -notcontains $_) {\n                        $_\n                        continue\n                    }\n                }\n\n            } elseif ($Property.Count -gt 0) {\n                # $FirstObjectProperties = $FirstObjectProperties | Where-Object { $Property -contains $_ }\n\n                $FirstObjectProperties = foreach ($_ in $FirstObjectProperties) {\n                    if ($Property -contains $_) {\n                        $_\n                        continue\n                    }\n                }\n            } elseif ($ExcludeProperty.Count -gt 0) {\n                #$FirstObjectProperties = $FirstObjectProperties | Where-Object { $ExcludeProperty -notcontains $_ }\n                $FirstObjectProperties = foreach ($_ in $FirstObjectProperties) {\n                    if ($ExcludeProperty -notcontains $_) {\n                        $_\n                        continue\n                    }\n                }\n            }\n        } elseif ($ObjectsList[0].GetType().Name -match 'bool|byte|char|datetime|decimal|double|ExcelHyperLink|float|int|long|sbyte|short|string|timespan|uint|ulong|URI|ushort') {\n            $FirstObjectProperties = $PropertyNameReplacement\n            #Write-Warning \"Select-Properties - Object of type $($ObjectsList[0].GetType().Name). Skipping.\"\n        } else {\n            if ($Property.Count -gt 0 -and $ExcludeProperty.Count -gt 0) {\n                $ObjectsList = $ObjectsList | Select-Object -Property $Property -ExcludeProperty $ExcludeProperty\n            } elseif ($Property.Count -gt 0) {\n                $ObjectsList = $ObjectsList | Select-Object -Property $Property #-ExcludeProperty $ExcludeProperty\n            } elseif ($ExcludeProperty.Count -gt 0) {\n                $ObjectsList = $ObjectsList | Select-Object -Property '*' -ExcludeProperty $ExcludeProperty\n            }\n            if ($AllProperties) {\n                [Array] $All = foreach ($_ in $ObjectsList) {\n                    $ListProperties = $_.PSObject.Properties.Name\n                    if ($null -ne $ListProperties) {\n                        $ListProperties\n                    }\n                }\n                #$FirstObjectProperties = $All | Select-Object -Unique\n                $FirstObjectProperties = Select-Unique -Object $All\n            } else {\n                $FirstObjectProperties = $ObjectsList[0].PSObject.Properties.Name\n            }\n        }\n        $FirstObjectProperties\n    }\n}"
  },
  {
    "path": "Public/Objects/Split-Array.ps1",
    "content": "function Split-Array {\n    <#\n    .SYNOPSIS\n    Split an array into multiple arrays of a specified size or by a specified number of elements\n\n    .DESCRIPTION\n    Split an array into multiple arrays of a specified size or by a specified number of elements\n\n    .PARAMETER Objects\n    Lists of objects you would like to split into multiple arrays based on their size or number of parts to split into.\n\n    .PARAMETER Parts\n    Parameter description\n\n    .PARAMETER Size\n    Parameter description\n\n    .EXAMPLE\n    This splits array into multiple arrays of 3\n    Example below wil return 1,2,3  + 4,5,6 + 7,8,9\n    Split-array -Objects @(1,2,3,4,5,6,7,8,9,10) -Parts 3\n\n    .EXAMPLE\n    This splits array into 3 parts regardless of amount of elements\n    Split-array -Objects @(1,2,3,4,5,6,7,8,9,10) -Size 3\n\n    .NOTES\n\n    #>\n    [CmdletBinding()]\n    param(\n        [alias('InArray', 'List')][Array] $Objects,\n        [int]$Parts,\n        [int]$Size\n    )\n    if ($Objects.Count -eq 1) { return $Objects }\n    if ($Parts) {\n        $PartSize = [Math]::Ceiling($inArray.count / $Parts)\n    }\n    if ($Size) {\n        $PartSize = $Size\n        $Parts = [Math]::Ceiling($Objects.count / $Size)\n    }\n    $outArray = [System.Collections.Generic.List[Object]]::new()\n    for ($i = 1; $i -le $Parts; $i++) {\n        $start = (($i - 1) * $PartSize)\n        $end = (($i) * $PartSize) - 1\n        if ($end -ge $Objects.count) { $end = $Objects.count - 1 }\n        $outArray.Add(@($Objects[$start..$end]))\n    }\n    , $outArray\n}"
  },
  {
    "path": "Public/Objects/Test-IsDistinguishedName.ps1",
    "content": "﻿function Test-IsDistinguishedName {\n    <#\n    .SYNOPSIS\n    Determines whether a given string is a valid Distinguished Name (DN) format.\n    \n    .DESCRIPTION\n    This function checks if the provided string matches the format of a Distinguished Name (DN) in Active Directory. It validates the structure of a DN which typically consists of Common Name (CN), Organizational Unit (OU), and Domain Component (DC) components.\n    \n    .PARAMETER Identity\n    Specifies the string to be tested as a Distinguished Name (DN).\n    \n    .EXAMPLE\n    Test-IsDistinguishedName -Identity \"CN=John Doe,OU=Users,DC=example,DC=com\"\n    This example checks if the given string is a valid Distinguished Name format.\n    \n    .NOTES\n    Original source: https://github.com/PsCustomObject/IT-ToolBox/blob/master/Public/Test-IsValidDn.ps1\n\n    #>\n    [alias('Test-IsDN')]\n    [cmdletBinding()]\n    param (\n        [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)]\n        [Alias('DN', 'DistinguishedName')][string] $Identity\n    )\n    Process {\n        [regex]$distinguishedNameRegex = '^(?:(?<cn>CN=(?<name>(?:[^,]|\\,)*)),)?(?:(?<path>(?:(?:CN|OU)=(?:[^,]|\\,)+,?)+),)?(?<domain>(?:DC=(?:[^,]|\\,)+,?)+)$'\n        $Identity -match $distinguishedNameRegex\n    }\n}"
  },
  {
    "path": "Public/Programs/Find-MyProgramData.ps1",
    "content": "function Find-MyProgramData {\n    <#\n    .SYNOPSIS\n    Finds specific data within a given array of strings.\n\n    .DESCRIPTION\n    This function searches for a specific text within an array of strings and returns the second element of the string that matches the search criteria.\n\n    .PARAMETER Data\n    The array of strings to search through.\n\n    .PARAMETER FindText\n    The text to search for within the array of strings.\n\n    .EXAMPLE\n    Find-MyProgramData -Data @(\"Program A 123\", \"Program B 456\", \"Program C 789\") -FindText \"B\"\n    This example will return \"456\" as it finds the string containing \"B\" and returns the second element of that string.\n\n    #>\n    [CmdletBinding()]\n    param (\n        $Data,\n        $FindText\n    )\n    foreach ($Sub in $Data) {\n        if ($Sub -like $FindText) {\n            $Split = $Sub.Split(' ')\n            return $Split[1]\n        }\n    }\n    return ''\n}"
  },
  {
    "path": "Public/Programs/Initialize-ModulePortable.ps1",
    "content": "﻿function Initialize-ModulePortable {\n    <#\n    .SYNOPSIS\n    Initializes a portable module by downloading or importing it along with its required modules.\n\n    .DESCRIPTION\n    This function initializes a portable module by either downloading it from the PowerShell Gallery or importing it from a specified path. It also recursively loads any required modules for the primary module.\n\n    .PARAMETER Name\n    Specifies the name of the module to initialize.\n\n    .PARAMETER Path\n    Specifies the path where the module will be downloaded or imported. Defaults to the current script root.\n\n    .PARAMETER Download\n    Switch to indicate whether to download the module from the PowerShell Gallery.\n\n    .PARAMETER Import\n    Switch to indicate whether to import the module from the specified path.\n\n    .EXAMPLE\n    Initialize-ModulePortable -Name \"MyModule\" -Download\n    Downloads the module named \"MyModule\" from the PowerShell Gallery.\n\n    .EXAMPLE\n    Initialize-ModulePortable -Name \"MyModule\" -Path \"C:\\Modules\" -Import\n    Imports the module named \"MyModule\" from the specified path \"C:\\Modules\".\n\n    #>\n    [CmdletBinding()]\n    param(\n        [alias('ModuleName')][string] $Name,\n        [string] $Path = $PSScriptRoot,\n        [switch] $Download,\n        [switch] $Import\n    )\n    function Get-RequiredModule {\n        param(\n            [string] $Path,\n            [string] $Name\n        )\n        $PrimaryModule = Get-ChildItem -LiteralPath \"$Path\\$Name\" -Filter '*.psd1' -Recurse -ErrorAction SilentlyContinue -Depth 1\n        if ($PrimaryModule) {\n            $Module = Get-Module -ListAvailable $PrimaryModule.FullName -ErrorAction SilentlyContinue -Verbose:$false\n            if ($Module) {\n                [Array] $RequiredModules = $Module.RequiredModules.Name\n                if ($null -ne $RequiredModules) {\n                    $null\n                }\n                $RequiredModules\n                foreach ($_ in $RequiredModules) {\n                    Get-RequiredModule -Path $Path -Name $_\n                }\n            }\n        } else {\n            Write-Warning \"Initialize-ModulePortable - Modules to load not found in $Path\"\n        }\n    }\n\n    if (-not $Name) {\n        Write-Warning \"Initialize-ModulePortable - Module name not given. Terminating.\"\n        return\n    }\n    if (-not $Download -and -not $Import) {\n        Write-Warning \"Initialize-ModulePortable - Please choose Download/Import switch. Terminating.\"\n        return\n    }\n\n    if ($Download) {\n        try {\n            if (-not $Path -or -not (Test-Path -LiteralPath $Path)) {\n                $null = New-Item -ItemType Directory -Path $Path -Force\n            }\n            Save-Module -Name $Name -LiteralPath $Path -WarningVariable WarningData -WarningAction SilentlyContinue -ErrorAction Stop\n        } catch {\n            $ErrorMessage = $_.Exception.Message\n\n            if ($WarningData) {\n                Write-Warning \"Initialize-ModulePortable - $WarningData\"\n            }\n            Write-Warning \"Initialize-ModulePortable - Error $ErrorMessage\"\n            return\n        }\n    }\n\n    if ($Download -or $Import) {\n        [Array] $Modules = Get-RequiredModule -Path $Path -Name $Name | Where-Object { $null -ne $_ }\n        if ($null -ne $Modules) {\n            [array]::Reverse($Modules)\n        }\n        $CleanedModules = [System.Collections.Generic.List[string]]::new()\n\n        foreach ($_ in $Modules) {\n            if ($CleanedModules -notcontains $_) {\n                $CleanedModules.Add($_)\n            }\n        }\n        $CleanedModules.Add($Name)\n\n        $Items = foreach ($_ in $CleanedModules) {\n            Get-ChildItem -LiteralPath \"$Path\\$_\" -Filter '*.psd1' -Recurse -ErrorAction SilentlyContinue -Depth 1\n        }\n        [Array] $PSD1Files = $Items.FullName\n    }\n    if ($Download) {\n        $ListFiles = foreach ($PSD1 in $PSD1Files) {\n            $PSD1.Replace(\"$Path\", '$PSScriptRoot')\n        }\n        # Build File\n        $Content = @(\n            '$Modules = @('\n            foreach ($_ in $ListFiles) {\n                \"   `\"$_`\"\"\n            }\n            ')'\n            \"foreach (`$_ in `$Modules) {\"\n            \"   Import-Module `$_ -Verbose:`$false -Force\"\n            \"}\"\n        )\n        $Content | Set-Content -Path $Path\\$Name.ps1 -Force\n    }\n    if ($Import) {\n        $ListFiles = foreach ($PSD1 in $PSD1Files) {\n            $PSD1\n        }\n        foreach ($_ in $ListFiles) {\n            Import-Module $_ -Verbose:$false -Force\n        }\n    }\n}\n\n#Initialize-ModulePortable -Name 'Testimo' -Path $Env:USERPROFILE\\Desktop\\TestimoPortable -Verbose -Download -Import\n\n#Initialize-ModulePortable -Name 'SqlServer' -Path $Env:USERPROFILE\\Desktop\\SqlServer -Verbose -Download #-Import"
  },
  {
    "path": "Public/Programs/Invoke-CommandCustom.ps1",
    "content": "function Invoke-CommandCustom {\n    <#\n    .SYNOPSIS\n    Invokes a script block with optional parameters and arguments.\n\n    .DESCRIPTION\n    The Invoke-CommandCustom function executes a script block with the ability to pass parameters and arguments. It provides options to return verbose output, errors, and warnings.\n\n    .PARAMETER ScriptBlock\n    Specifies the script block to execute.\n\n    .PARAMETER Parameter\n    Specifies a dictionary of parameters to pass to the script block.\n\n    .PARAMETER Argument\n    Specifies an array of arguments to pass to the script block.\n\n    .PARAMETER ReturnVerbose\n    Indicates whether to return verbose output.\n\n    .PARAMETER ReturnError\n    Indicates whether to return errors.\n\n    .PARAMETER ReturnWarning\n    Indicates whether to return warnings.\n\n    .PARAMETER AddParameter\n    Indicates whether to add parameters to the script block.\n\n    .EXAMPLE\n    Invoke-CommandCustom -ScriptBlock { Get-Process } -ReturnVerbose\n\n    Description:\n    Invokes the Get-Process cmdlet and returns verbose output.\n\n    .EXAMPLE\n    Invoke-CommandCustom -ScriptBlock { Get-Service } -Parameter @{Name=\"Spooler\"} -ReturnError\n\n    Description:\n    Invokes the Get-Service cmdlet with the \"Spooler\" parameter and returns any errors encountered.\n\n    #>\n    [cmdletBinding()]\n    param(\n        [scriptblock] $ScriptBlock,\n        [System.Collections.IDictionary] $Parameter,\n        [array] $Argument,\n        [switch] $ReturnVerbose,\n        [switch] $ReturnError,\n        [switch] $ReturnWarning,\n        [switch] $AddParameter\n    )\n    $Output = [ordered]@{}\n    $ps = [PowerShell]::Create()\n    if ($ReturnVerbose) {\n        $null = $ps.AddScript('$VerbosePreference = \"Continue\"').AddStatement()\n    }\n    if ($ScriptBlock) {\n        if ($Parameter -and $AddParameter) {\n            $Count = 0\n            [string] $ScriptBlockParams = @(\n                \"param(\"\n                foreach ($Key in $Parameter.Keys) {\n                    $Count++\n                    if ($Count -eq $Parameter.Keys.Count) {\n                        \"`$$($Key)\"\n                    } else {\n                        \"`$$($Key),\"\n                    }\n                }\n                \")\"\n                $ScriptBlock.ToString()\n            )\n            $ScriptBlockScript = [scriptblock]::Create($ScriptBlockParams)\n            $null = $ps.AddScript($ScriptBlockScript)\n        } else {\n            $null = $ps.AddScript($ScriptBlock)\n        }\n    }\n    if ($Parameter) {\n        foreach ($Key in $Parameter.Keys) {\n            $null = $ps.AddParameter($Key, $Parameter[$Key])\n        }\n    }\n    if ($Argument) {\n        foreach ($Arg in $Argument) {\n            $null = $ps.AddArgument($Arg)\n        }\n    }\n    $ErrorCaught = $null\n    try {\n        $InvokedCommand = $ps.Invoke()\n    } catch {\n        $ErrorCaught = $_\n    }\n    if ($InvokedCommand) {\n        $Output['Output'] = $InvokedCommand\n    }\n    if ($ReturnVerbose) {\n        if ($Ps.Streams.Verbose) {\n            $Output['Verbose'] = $ps.Streams.Verbose\n        }\n    }\n    if ($ReturnWarning) {\n        if ($ps.Streams.Warning) {\n            $Output['Warning'] = $ps.Streams.Warning\n        }\n    }\n    if ($ReturnError) {\n        if ($ErrorCaught) {\n            $Output['Error'] = $ErrorCaught\n        } else {\n            if ($Ps.Streams.Error) {\n                $Output['Error'] = $ps.Streams.Error\n            }\n        }\n    }\n    if ($ReturnError -or $ReturnVerbose -or $ReturnWarning) {\n        $Output\n    } else {\n        $Output.Output\n    }\n}"
  },
  {
    "path": "Public/Programs/Start-InternalFunction.ps1",
    "content": "﻿function Start-InternalFunction {\n    <#\n    .SYNOPSIS\n    Starts an internal function within a specified module.\n\n    .DESCRIPTION\n    This function starts an internal function within a specified module by importing the module and executing the provided script block.\n\n    .PARAMETER ScriptBlock\n    Specifies the script block to be executed as the internal function.\n\n    .PARAMETER Module\n    Specifies the name of the module containing the internal function.\n\n    .EXAMPLE\n    Start-InternalFunction -ScriptBlock { Get-ChildItem } -Module \"ExampleModule\"\n    This example starts the internal function 'Get-ChildItem' within the 'ExampleModule' module.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [ScriptBlock] $ScriptBlock,\n        [string] $Module\n    )\n\n    $InternalModule = Import-Module -Name $Module -PassThru\n    & $InternalModule $ScriptBlock\n}"
  },
  {
    "path": "Public/Programs/Start-MyProgram.ps1",
    "content": "function Start-MyProgram {\n    <#\n    .SYNOPSIS\n    Starts a program with specified arguments and logs the output.\n\n    .DESCRIPTION\n    This function starts a program with the provided arguments and logs the output using a specified logger. If no logger is provided, it returns the output as a string.\n\n    .PARAMETER Program\n    The path to the program to be executed.\n\n    .PARAMETER CmdArgList\n    An array of arguments to be passed to the program.\n\n    .PARAMETER LoggerParameters\n    A dictionary containing parameters for the logger.\n\n    .EXAMPLE\n    Start-MyProgram -Program \"C:\\Program.exe\" -CmdArgList @(\"-arg1\", \"-arg2\") -LoggerParameters @{\"LogPath\"=\"C:\\Logs\"; \"LogLevel\"=\"Info\"}\n    Starts the program \"C:\\Program.exe\" with arguments \"-arg1\" and \"-arg2\" and logs the output using a logger with log path \"C:\\Logs\" and log level \"Info\".\n\n    .EXAMPLE\n    Start-MyProgram -Program \"C:\\AnotherProgram.exe\" -CmdArgList @(\"-input\", \"file.txt\")\n    Starts the program \"C:\\AnotherProgram.exe\" with argument \"-input file.txt\" and returns the output as a string.\n\n    #>\n    [CmdletBinding()]\n    param (\n        [string] $Program,\n        [string[]] $CmdArgList,\n        [System.Collections.IDictionary] $LoggerParameters\n    )\n\n   # $Output = & $Program $CmdArgList 2>&1\n    $Output = (cmd /c $Program $CmdArgList '2>&1')\n    if (-not $LoggerParameters) {\n        if ($Output) {\n            return $Output\n        }\n    } else {\n        $Logger = Get-Logger @LoggerParameters\n        if ($null -ne $Output) {\n            $Logger.AddInfoRecord(\"Running program $Program with output: $Output\")\n        } else {\n            $Logger.AddInfoRecord(\"Running program $Program $CmdArgList\")\n        }\n    }\n}"
  },
  {
    "path": "Public/Random/Get-RandomCharacters.ps1",
    "content": "function Get-RandomCharacters {\n    <#\n    .SYNOPSIS\n    Generates a random string of characters from a specified character set.\n\n    .DESCRIPTION\n    This function generates a random string of characters from a specified character set with the given length.\n\n    .PARAMETER length\n    The length of the random string to generate.\n\n    .PARAMETER characters\n    The set of characters from which to generate the random string.\n\n    .EXAMPLE\n    Get-RandomCharacters -length 8 -characters 'abcdef123'\n    Generates a random string of 8 characters from the character set 'abcdef123'.\n\n    .EXAMPLE\n    Get-RandomCharacters -length 12 -characters 'ABC123!@#'\n    Generates a random string of 12 characters from the character set 'ABC123!@#'.\n    #>\n    [cmdletbinding()]\n    param(\n        [int] $length,\n        [string] $characters\n    )\n    if ($length -ne 0 -and $characters -ne '') {\n        $random = 1..$length | ForEach-Object { Get-Random -Maximum $characters.length }\n        $private:ofs = \"\" # https://blogs.msdn.microsoft.com/powershell/2006/07/15/psmdtagfaq-what-is-ofs/\n        return [String]$characters[$random]\n    } else {\n        return\n    }\n}"
  },
  {
    "path": "Public/Random/Get-RandomFileName.ps1",
    "content": "function Get-RandomFileName {\n    <#\n    .SYNOPSIS\n    Generates a random file name with a specified length and extension.\n\n    .DESCRIPTION\n    This function generates a random file name with a specified length and extension. The file name is created using random letters only.\n\n    .PARAMETER Length\n    The length of the random file name to generate. Default is 16.\n\n    .PARAMETER Extension\n    The extension to append to the random file name.\n\n    .EXAMPLE\n    Get-RandomFileName -Length 8 -Extension \"txt\"\n    Generates a random file name with a length of 8 characters and appends the extension \".txt\".\n\n    .EXAMPLE\n    Get-RandomFileName -Extension \"docx\"\n    Generates a random file name with a default length of 16 characters and appends the extension \".docx\".\n    #>\n    [cmdletbinding()]\n    param(\n        $Length = 16,\n        $Extension\n    )\n    $File = Get-RandomStringName -Size $Length -LettersOnly -ToLower\n    return \"$File.$Extension\"\n}"
  },
  {
    "path": "Public/Random/Get-RandomPassword.ps1",
    "content": "function Get-RandomPassword {\n    <#\n    .SYNOPSIS\n    Generates a random password with a specified number of lowercase letters, uppercase letters, numbers, and special characters.\n\n    .DESCRIPTION\n    This function generates a random password with a customizable combination of lowercase letters, uppercase letters, numbers, and special characters.\n\n    .PARAMETER LettersLowerCase\n    Specifies the number of lowercase letters to include in the password.\n\n    .PARAMETER LettersHigherCase\n    Specifies the number of uppercase letters to include in the password.\n\n    .PARAMETER Numbers\n    Specifies the number of numbers to include in the password.\n\n    .PARAMETER SpecialChars\n    Specifies the number of special characters to include in the password.\n\n    .PARAMETER SpecialCharsLimited\n    Specifies the number of limited special characters to include in the password.\n\n    .EXAMPLE\n    Get-RandomPassword -LettersLowerCase 4 -LettersHigherCase 2 -Numbers 1 -SpecialChars 0 -SpecialCharsLimited 1\n    Generates a random password with 4 lowercase letters, 2 uppercase letters, 1 number, and 1 limited special character.\n\n    .EXAMPLE\n    Get-RandomPassword -LettersLowerCase 3 -LettersHigherCase 3 -Numbers 2 -SpecialChars 2 -SpecialCharsLimited 1\n    Generates a random password with 3 lowercase letters, 3 uppercase letters, 2 numbers, 2 special characters, and 1 limited special character.\n    #>\n    [cmdletbinding()]\n    param(\n        [int] $LettersLowerCase = 4,\n        [int] $LettersHigherCase = 2,\n        [int] $Numbers = 1,\n        [int] $SpecialChars = 0,\n        [int] $SpecialCharsLimited = 1\n    )\n    $Password = @(\n        Get-RandomCharacters -length $LettersLowerCase -characters 'abcdefghiklmnoprstuvwxyz'\n        Get-RandomCharacters -length $LettersHigherCase -characters 'ABCDEFGHKLMNOPRSTUVWXYZ'\n        Get-RandomCharacters -length $Numbers -characters '1234567890'\n        Get-RandomCharacters -length $SpecialChars -characters '!$%()=?{@#'\n        Get-RandomCharacters -length $SpecialCharsLimited -characters '!$#'\n    )\n    $StringPassword = $Password -join ''\n    $StringPassword = ($StringPassword.ToCharArray() | Get-Random -Count $StringPassword.Length) -join ''\n    return $StringPassword\n}\n"
  },
  {
    "path": "Public/Random/Get-RandomStringName.ps1",
    "content": "function Get-RandomStringName {\n    <#\n    .SYNOPSIS\n    Generates a random string of specified length with various options.\n\n    .DESCRIPTION\n    This function generates a random string of specified length with options to convert the case and include only letters.\n\n    .PARAMETER Size\n    The length of the random string to generate. Default is 31.\n\n    .PARAMETER ToLower\n    Convert the generated string to lowercase.\n\n    .PARAMETER ToUpper\n    Convert the generated string to uppercase.\n\n    .PARAMETER LettersOnly\n    Generate a random string with only letters.\n\n    .EXAMPLE\n    Get-RandomStringName -Size 10\n    Generates a random string of length 10.\n\n    .EXAMPLE\n    Get-RandomStringName -Size 8 -ToLower\n    Generates a random string of length 8 and converts it to lowercase.\n\n    .EXAMPLE\n    Get-RandomStringName -Size 12 -ToUpper\n    Generates a random string of length 12 and converts it to uppercase.\n\n    .EXAMPLE\n    Get-RandomStringName -Size 15 -LettersOnly\n    Generates a random string of length 15 with only letters.\n\n    #>\n    [cmdletbinding()]\n    param(\n        [int] $Size = 31,\n        [switch] $ToLower,\n        [switch] $ToUpper,\n        [switch] $LettersOnly\n    )\n    [string] $MyValue = @(\n        if ($LettersOnly) {\n            ( -join ((1..$Size) | ForEach-Object { (65..90) + (97..122) | Get-Random } | ForEach-Object { [char]$_ }))\n        } else {\n            ( -join ((48..57) + (97..122) | Get-Random -Count $Size | ForEach-Object { [char]$_ }))\n        }\n    )\n    if ($ToLower) {\n        return $MyValue.ToLower()\n    }\n    if ($ToUpper) {\n        return $MyValue.ToUpper()\n    }\n    return $MyValue\n}"
  },
  {
    "path": "Public/Registry/Dismount-PSRegistryPath.ps1",
    "content": "﻿function Dismount-PSRegistryPath {\n    <#\n    .SYNOPSIS\n    Dismounts a registry path.\n\n    .DESCRIPTION\n    This function dismounts a registry path specified by the MountPoint parameter. It unloads the registry path using reg.exe command.\n\n    .PARAMETER MountPoint\n    Specifies the registry path to be dismounted.\n\n    .PARAMETER Suppress\n    Suppresses the output if set to $true.\n\n    .EXAMPLE\n    Dismount-PSRegistryPath -MountPoint \"HKLM:\\Software\\MyApp\" -Suppress\n    Dismounts the registry path \"HKLM:\\Software\\MyApp\" without displaying any output.\n\n    .EXAMPLE\n    Dismount-PSRegistryPath -MountPoint \"HKCU:\\Software\\Settings\"\n    Dismounts the registry path \"HKCU:\\Software\\Settings\" and displays output if successful.\n\n    #>\n    [alias('Dismount-RegistryPath')]\n    [cmdletbinding()]\n    param(\n        [Parameter(Mandatory)][string] $MountPoint,\n        [switch] $Suppress\n    )\n\n    # This is required to force removal of the mount point\n    [gc]::Collect()\n\n    $pinfo = [System.Diagnostics.ProcessStartInfo]::new()\n    $pinfo.FileName = \"reg.exe\"\n    $pinfo.RedirectStandardError = $true\n    $pinfo.RedirectStandardOutput = $true\n    $pinfo.UseShellExecute = $false\n    $pinfo.Arguments = \" unload $MountPoint\"\n    $pinfo.CreateNoWindow = $true\n    $pinfo.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Hidden\n    $p = [System.Diagnostics.Process]::new()\n    $p.StartInfo = $pinfo\n    $p.Start() | Out-Null\n    $p.WaitForExit()\n    $Output = $p.StandardOutput.ReadToEnd()\n    $Errors = $p.StandardError.ReadToEnd()\n\n    if ($Errors) {\n        if ($PSBoundParameters.ErrorAction -eq 'Stop') {\n            throw $Errors\n        } else {\n            Write-Warning -Message \"Dismount-PSRegistryPath - Couldn't unmount $MountPoint. $Errors\"\n        }\n    } else {\n        if ($Output -like \"*operation completed*\") {\n            if (-not $Suppress) {\n                return $true\n            }\n        }\n    }\n    if (-not $Suppress) {\n        return $false\n    }\n}\n\n<#\nfunction Dismount-PSRegistryPath {\n    [alias('Dismount-RegistryPath')]\n    [cmdletbinding()]\n    param(\n        [Parameter(Mandatory)][string] $MountPoint,\n        [switch] $Suppress\n    )\n\n    # This is required to force removal of the mount point\n    [gc]::Collect()\n\n    # $pinfo = [System.Diagnostics.ProcessStartInfo]::new()\n    # $pinfo.FileName = \"reg.exe\"\n    # $pinfo.RedirectStandardError = $true\n    # $pinfo.RedirectStandardOutput = $true\n    # $pinfo.UseShellExecute = $false\n    # $pinfo.Arguments = \" unload $MountPoint\"\n    # $pinfo.CreateNoWindow = $true\n    # $pinfo.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Hidden\n    # $p = [System.Diagnostics.Process]::new()\n    # $p.StartInfo = $pinfo\n    # $p.Start() | Out-Null\n    # $p.WaitForExit()\n    # $Output = $p.StandardOutput.ReadToEnd()\n    # $Errors = $p.StandardError.ReadToEnd()\n\n    $p = reg unload $MountPoint 2>&1\n    #$Errors  , $Output = $p.Where({ $_ -is [System.Management.Automation.ErrorRecord] }, 'Split')\n    if ($p -is [Array] -and $p[0] -is [System.Management.Automation.ErrorRecord] -or $p -is [System.Management.Automation.ErrorRecord]) {\n        $Errors = $p | ForEach-Object { $_.ToString().Replace('System.Management.Automation.RemoteException', '') }\n    } else {\n        $Output = $p\n    }\n    if ($Errors) {\n        if ($PSBoundParameters.ErrorAction -eq 'Stop') {\n            throw $Errors\n        } else {\n            Write-Warning -Message \"Dismount-PSRegistryPath - Couldn't unmount $MountPoint. $Errors\"\n        }\n    } else {\n        if ($Output -like \"*operation completed*\") {\n            if (-not $Suppress) {\n                return $true\n            }\n        }\n    }\n    if (-not $Suppress) {\n        return $false\n    }\n}\n#>"
  },
  {
    "path": "Public/Registry/Get-PSRegistry.ps1",
    "content": "﻿function Get-PSRegistry {\n    <#\n    .SYNOPSIS\n    Get registry key values.\n\n    .DESCRIPTION\n    Get registry key values.\n\n    .PARAMETER RegistryPath\n    The registry path to get the values from.\n\n    .PARAMETER ComputerName\n    The computer to get the values from. If not specified, the local computer is used.\n\n    .PARAMETER ExpandEnvironmentNames\n    Expand environment names in the registry value.\n    By default it doesn't do that. If you want to expand environment names, use this parameter.\n\n    .EXAMPLE\n    Get-PSRegistry -RegistryPath 'HKLM\\SYSTEM\\CurrentControlSet\\Services\\Netlogon\\Parameters' -ComputerName AD1\n\n    .EXAMPLE\n    Get-PSRegistry -RegistryPath 'HKLM\\SYSTEM\\CurrentControlSet\\Services\\Netlogon\\Parameters'\n\n    .EXAMPLE\n    Get-PSRegistry -RegistryPath \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\DFSR\\Parameters\" -ComputerName AD1,AD2,AD3 | ft -AutoSize\n\n    .EXAMPLE\n    Get-PSRegistry -RegistryPath 'HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\EventLog\\Directory Service'\n\n    .EXAMPLE\n    Get-PSRegistry -RegistryPath 'HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\EventLog\\Windows PowerShell' | Format-Table -AutoSize\n\n    .EXAMPLE\n    Get-PSRegistry -RegistryPath 'HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\EventLog\\Directory Service' -ComputerName AD1 -Advanced\n\n    .EXAMPLE\n    Get-PSRegistry -RegistryPath \"HKLM:\\Software\\Microsoft\\Powershell\\1\\Shellids\\Microsoft.Powershell\\\"\n\n    .EXAMPLE\n    # Get default key and it's value\n    Get-PSRegistry -RegistryPath \"HKEY_CURRENT_USER\\Tests\" -Key \"\"\n\n    .EXAMPLE\n    # Get default key and it's value (alternative)\n    Get-PSRegistry -RegistryPath \"HKEY_CURRENT_USER\\Tests\" -DefaultKey\n\n    .NOTES\n    General notes\n    #>\n    [cmdletbinding()]\n    param(\n        [alias('Path')][string[]] $RegistryPath,\n        [string[]] $ComputerName = $Env:COMPUTERNAME,\n        [string] $Key,\n        [switch] $Advanced,\n        [switch] $DefaultKey,\n        [switch] $ExpandEnvironmentNames,\n        [Parameter(DontShow)][switch] $DoNotUnmount\n    )\n    $Script:CurrentGetCount++\n    Get-PSRegistryDictionaries\n\n    # Cleans up registry path and makes sure it's as required to be processed further\n    $RegistryPath = Resolve-PrivateRegistry -RegistryPath $RegistryPath\n\n    [Array] $Computers = Get-ComputerSplit -ComputerName $ComputerName\n\n    [Array] $RegistryTranslated = Get-PSConvertSpecialRegistry -RegistryPath $RegistryPath -Computers $ComputerName -HiveDictionary $Script:HiveDictionary -ExpandEnvironmentNames:$ExpandEnvironmentNames.IsPresent\n\n    if ($PSBoundParameters.ContainsKey(\"Key\") -or $DefaultKey) {\n        [Array] $RegistryValues = Get-PSSubRegistryTranslated -RegistryPath $RegistryTranslated -HiveDictionary $Script:HiveDictionary -Key $Key\n        foreach ($Computer in $Computers[0]) {\n            foreach ($R in $RegistryValues) {\n                Get-PSSubRegistry -Registry $R -ComputerName $Computer -ExpandEnvironmentNames:$ExpandEnvironmentNames.IsPresent\n            }\n        }\n        foreach ($Computer in $Computers[1]) {\n            foreach ($R in $RegistryValues) {\n                Get-PSSubRegistry -Registry $R -ComputerName $Computer -Remote -ExpandEnvironmentNames:$ExpandEnvironmentNames.IsPresent\n            }\n        }\n    } else {\n        [Array] $RegistryValues = Get-PSSubRegistryTranslated -RegistryPath $RegistryTranslated -HiveDictionary $Script:HiveDictionary\n        foreach ($Computer in $Computers[0]) {\n            foreach ($R in $RegistryValues) {\n                #Write-Verbose -Message \"Getting registry value from $Computer : $($R.Registry)\"\n                Get-PSSubRegistryComplete -Registry $R -ComputerName $Computer -Advanced:$Advanced -ExpandEnvironmentNames:$ExpandEnvironmentNames.IsPresent\n            }\n        }\n        foreach ($Computer in $Computers[1]) {\n            foreach ($R in $RegistryValues) {\n                Get-PSSubRegistryComplete -Registry $R -ComputerName $Computer -Remote -Advanced:$Advanced -ExpandEnvironmentNames:$ExpandEnvironmentNames.IsPresent\n            }\n        }\n    }\n    $Script:CurrentGetCount--\n    if ($Script:CurrentGetCount -eq 0) {\n        if (-not $DoNotUnmount) {\n            Unregister-MountedRegistry\n        }\n    }\n}"
  },
  {
    "path": "Public/Registry/Mount-PSRegistryPath.ps1",
    "content": "﻿function Mount-PSRegistryPath {\n    <#\n    .SYNOPSIS\n    Mounts a registry path to a specified location.\n\n    .DESCRIPTION\n    This function mounts a registry path to a specified location using the reg.exe utility.\n\n    .PARAMETER MountPoint\n    Specifies the registry mount point where the registry path will be mounted.\n\n    .PARAMETER FilePath\n    Specifies the file path of the registry hive to be mounted.\n\n    .EXAMPLE\n    Mount-PSRegistryPath -MountPoint 'HKEY_USERS\\.DEFAULT_USER111' -FilePath 'C:\\Users\\Default\\NTUSER.DAT'\n    Mounts the registry hive located at 'C:\\Users\\Default\\NTUSER.DAT' to the registry key 'HKEY_USERS\\.DEFAULT_USER111'.\n\n    .NOTES\n    This function requires administrative privileges to mount registry paths.\n    #>\n    [alias('Mount-RegistryPath')]\n    [cmdletbinding()]\n    param(\n        [Parameter(Mandatory)][string] $MountPoint,\n        [Parameter(Mandatory)][string] $FilePath\n    )\n\n    $pinfo = [System.Diagnostics.ProcessStartInfo]::new()\n    $pinfo.FileName = \"reg.exe\"\n    $pinfo.RedirectStandardError = $true\n    $pinfo.RedirectStandardOutput = $true\n    $pinfo.UseShellExecute = $false\n    $pinfo.Arguments = \" load $MountPoint $FilePath\"\n    $pinfo.CreateNoWindow = $true\n    $pinfo.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Hidden\n    $p = [System.Diagnostics.Process]::new()\n    $p.StartInfo = $pinfo\n    $p.Start() | Out-Null\n    $p.WaitForExit()\n    $Output = $p.StandardOutput.ReadToEnd()\n    $Errors = $p.StandardError.ReadToEnd()\n    if ($Errors) {\n        if ($PSBoundParameters.ErrorAction -eq 'Stop') {\n            throw $Errors\n        } else {\n            Write-Warning -Message \"Mount-PSRegistryPath - Couldn't mount $MountPoint. $Errors\"\n        }\n    } else {\n        if ($Output -like \"*operation completed*\") {\n            if (-not $Suppress) {\n                return $true\n            }\n        }\n    }\n    if (-not $Suppress) {\n        return $false\n    }\n}\n\n<#\nfunction Mount-PSRegistryPath {\n    [alias('Mount-RegistryPath')]\n    [cmdletbinding()]\n    param(\n        [Parameter(Mandatory)][string] $MountPoint,\n        [Parameter(Mandatory)][string] $FilePath\n    )\n\n    # $pinfo = [System.Diagnostics.ProcessStartInfo]::new()\n    # $pinfo.FileName = \"reg.exe\"\n    # $pinfo.RedirectStandardError = $true\n    # $pinfo.RedirectStandardOutput = $true\n    # $pinfo.UseShellExecute = $false\n    # $pinfo.Arguments = \" load $MountPoint $FilePath\"\n    # $pinfo.CreateNoWindow = $true\n    # $pinfo.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Hidden\n    # $p = [System.Diagnostics.Process]::new()\n    # $p.StartInfo = $pinfo\n    # $p.Start() | Out-Null\n    # $p.WaitForExit()\n    # $Output = $p.StandardOutput.ReadToEnd()\n    # $Errors = $p.StandardError.ReadToEnd()\n    $p = reg load $MountPoint $FilePath 2>&1\n    #$Errors  , $Output = $p.Where({ $_ -is [System.Management.Automation.ErrorRecord] }, 'Split')\n    if ($p -is [Array] -and $p[0] -is [System.Management.Automation.ErrorRecord] -or $p -is [System.Management.Automation.ErrorRecord]) {\n        $Errors = $p | ForEach-Object { $_.ToString().Replace('System.Management.Automation.RemoteException', '') }\n    } else {\n        $Output = $p\n    }\n    if ($Errors) {\n        if ($PSBoundParameters.ErrorAction -eq 'Stop') {\n            throw $Errors\n        } else {\n            Write-Warning -Message \"Mount-PSRegistryPath - Couldn't mount $MountPoint. $Errors\"\n        }\n    } else {\n        if ($Output -like \"*operation completed*\") {\n            if (-not $Suppress) {\n                return $true\n            }\n        }\n    }\n    if (-not $Suppress) {\n        return $false\n    }\n}\n#>"
  },
  {
    "path": "Public/Registry/New-PSRegistry.ps1",
    "content": "﻿function New-PSRegistry {\n    <#\n    .SYNOPSIS\n    Provides a way to create new registry paths\n\n    .DESCRIPTION\n    Provides a way to create new registry paths\n\n    .PARAMETER ComputerName\n    The computer to run the command on. Defaults to local computer.\n\n    .PARAMETER RegistryPath\n    Registry Path to Create\n\n    .PARAMETER Suppress\n    Suppresses the output of the command. By default the command outputs PSObject with the results of the operation.\n\n    .EXAMPLE\n    New-PSRegistry -RegistryPath \"HKCU:\\\\Tests1\\CurrentControlSet\\Control\\Lsa\" -Verbose -WhatIf\n\n    .EXAMPLE\n    New-PSRegistry -RegistryPath \"HKCU:\\\\Tests1\\CurrentControlSet\\Control\\Lsa\"\n\n    .NOTES\n    General notes\n    #>\n    [cmdletbinding(SupportsShouldProcess)]\n    param(\n        [string[]] $ComputerName = $Env:COMPUTERNAME,\n        [Parameter(Mandatory)][string] $RegistryPath,\n        [switch] $Suppress\n    )\n    Get-PSRegistryDictionaries\n\n    [Array] $ComputersSplit = Get-ComputerSplit -ComputerName $ComputerName\n\n    # Cleans up registry path and makes sure it's as required to be processed further\n    $RegistryPath = Resolve-PrivateRegistry -RegistryPath $RegistryPath\n\n    [Array] $RegistryTranslated = Get-PSConvertSpecialRegistry -RegistryPath $RegistryPath -Computers $ComputerName -HiveDictionary $Script:HiveDictionary\n\n    foreach ($Registry in $RegistryTranslated) {\n        $RegistryValue = Get-PrivateRegistryTranslated -RegistryPath $Registry -HiveDictionary $Script:HiveDictionary -Key $Key -ReverseTypesDictionary $Script:ReverseTypesDictionary\n\n        if ($RegistryValue.HiveKey) {\n            foreach ($Computer in $ComputersSplit[0]) {\n                # Local computer\n                New-PrivateRegistry -RegistryValue $RegistryValue -Computer $Computer -ErrorAction $ErrorActionPreference -WhatIf:$WhatIfPreference\n            }\n            foreach ($Computer in $ComputersSplit[1]) {\n                # Remote computer\n                New-PrivateRegistry -RegistryValue $RegistryValue -Computer $Computer -Remote -ErrorAction $ErrorActionPreference -WhatIf:$WhatIfPreference\n            }\n        } else {\n            if ($PSBoundParameters.ErrorAction -eq 'Stop') {\n                Unregister-MountedRegistry\n                throw\n            } else {\n                # This shouldn't really happen\n                Write-Warning \"New-PSRegistry - Setting registry to $RegistryPath have failed. Couldn't translate HIVE.\"\n            }\n        }\n    }\n    Unregister-MountedRegistry\n}"
  },
  {
    "path": "Public/Registry/Remove-PSRegistry.ps1",
    "content": "﻿function Remove-PSRegistry {\n    <#\n    .SYNOPSIS\n    Remove registry keys and folders\n\n    .DESCRIPTION\n    Remove registry keys and folders using .NET methods\n\n    .PARAMETER ComputerName\n    The computer to run the command on. Defaults to local computer.\n\n    .PARAMETER RegistryPath\n    The registry path to remove.\n\n    .PARAMETER Key\n    The registry key to remove.\n\n    .PARAMETER Recursive\n    Forces deletion of registry folder and all keys, including nested folders\n\n    .PARAMETER Suppress\n    Suppresses the output of the command. By default the command outputs PSObject with the results of the operation.\n\n    .EXAMPLE\n    Remove-PSRegistry -RegistryPath \"HKEY_CURRENT_USER\\Tests\\Ok\\MaybeNot\" -Recursive\n\n    .EXAMPLE\n    Remove-PSRegistry -RegistryPath \"HKEY_CURRENT_USER\\Tests\\Ok\\MaybeNot\" -Key \"LimitBlankPass1wordUse\"\n\n    .EXAMPLE\n    Remove-PSRegistry -RegistryPath \"HKCU:\\Tests\\Ok\"\n\n    .NOTES\n    General notes\n    #>\n    [cmdletBinding(SupportsShouldProcess)]\n    param(\n        [string[]] $ComputerName = $Env:COMPUTERNAME,\n        [Parameter(Mandatory)][string] $RegistryPath,\n        [Parameter()][string] $Key,\n        [switch] $Recursive,\n        [switch] $Suppress\n    )\n    Get-PSRegistryDictionaries\n\n    [Array] $ComputersSplit = Get-ComputerSplit -ComputerName $ComputerName\n\n    # Cleans up registry path and makes sure it's as required to be processed further\n    $RegistryPath = Resolve-PrivateRegistry -RegistryPath $RegistryPath\n\n    [Array] $RegistryTranslated = Get-PSConvertSpecialRegistry -RegistryPath $RegistryPath -Computers $ComputerName -HiveDictionary $Script:HiveDictionary\n\n    foreach ($Registry in $RegistryTranslated) {\n        $RegistryValue = Get-PrivateRegistryTranslated -RegistryPath $Registry -HiveDictionary $Script:HiveDictionary -Key $Key -ReverseTypesDictionary $Script:ReverseTypesDictionary\n\n        if ($RegistryValue.HiveKey) {\n            foreach ($Computer in $ComputersSplit[0]) {\n                # Local computer\n                Remove-PrivateRegistry -Key $Key -RegistryValue $RegistryValue -Computer $Computer -Suppress:$Suppress.IsPresent -ErrorAction $ErrorActionPreference -WhatIf:$WhatIfPreference\n            }\n            foreach ($Computer in $ComputersSplit[1]) {\n                # Remote computer\n                Remove-PrivateRegistry -Key $Key -RegistryValue $RegistryValue -Computer $Computer -Remote -Suppress:$Suppress.IsPresent -ErrorAction $ErrorActionPreference -WhatIf:$WhatIfPreference\n            }\n        } else {\n            if ($PSBoundParameters.ErrorAction -eq 'Stop') {\n                Unregister-MountedRegistry\n                throw\n            } else {\n                # This shouldn't really happen\n                Write-Warning \"Remove-PSRegistry - Removing registry $RegistryPath have failed (recursive: $($Recursive.IsPresent)). Couldn't translate HIVE.\"\n            }\n        }\n    }\n    Unregister-MountedRegistry\n}"
  },
  {
    "path": "Public/Registry/Set-PSRegistry.ps1",
    "content": "﻿function Set-PSRegistry {\n    <#\n    .SYNOPSIS\n    Sets/Updates registry entries locally and remotely using .NET methods.\n\n    .DESCRIPTION\n    Sets/Updates registry entries locally and remotely using .NET methods. If the registry path to key doesn't exists it will be created.\n\n    .PARAMETER ComputerName\n    The computer to run the command on. Defaults to local computer.\n\n    .PARAMETER RegistryPath\n    Registry Path to Update\n\n    .PARAMETER Type\n    Registry type to use. Options are:  REG_SZ, REG_EXPAND_SZ, REG_BINARY, REG_DWORD, REG_MULTI_SZ, REG_QWORD, string, expandstring, binary, dword, multistring, qword\n\n    .PARAMETER Key\n    Registry key to set. If the path to registry key doesn't exists it will be created.\n\n    .PARAMETER Value\n    Registry value to set.\n\n    .PARAMETER Suppress\n    Suppresses the output of the command. By default the command outputs PSObject with the results of the operation.\n\n    .EXAMPLE\n    Set-PSRegistry -RegistryPath 'HKLM\\SYSTEM\\CurrentControlSet\\Services\\NTDS\\Diagnostics' -Type REG_DWORD -Key \"16 LDAP Interface Events\" -Value 2 -ComputerName AD1\n\n    .EXAMPLE\n    Set-PSRegistry -RegistryPath 'HKLM\\SYSTEM\\CurrentControlSet\\Services\\NTDS\\Diagnostics' -Type REG_SZ -Key \"LDAP Interface Events\" -Value 'test' -ComputerName AD1\n\n    .EXAMPLE\n    Set-PSRegistry -RegistryPath \"HKCU:\\\\Tests\" -Key \"LimitBlankPass1wordUse\" -Value \"0\" -Type REG_DWORD\n\n    .EXAMPLE\n    Set-PSRegistry -RegistryPath \"HKCU:\\\\Tests\\MoreTests\\Tests1\" -Key \"LimitBlankPass1wordUse\" -Value \"0\" -Type REG_DWORD\n\n    .EXAMPLE\n    # Setting default value\n\n    $ValueData = [byte[]] @(\n        0, 1, 0, 0, 9, 0, 0, 0, 128, 0, 0, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3,\n        0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3,\n        0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3,\n        0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3,\n        0, 3, 0, 0, 0, 5, 0, 10, 0, 14, 0, 3, 0, 5, 0, 6, 0, 6, 0, 4, 0, 4, 0\n    )\n    Set-PSRegistry -RegistryPath \"HKEY_CURRENT_USER\\Tests\" -Key '' -Value $ValueData -Type 'NONE'\n\n    .NOTES\n    General notes\n    #>\n    [cmdletbinding(SupportsShouldProcess)]\n    param(\n        [string[]] $ComputerName = $Env:COMPUTERNAME,\n        [Parameter(Mandatory)][string] $RegistryPath,\n        [Parameter(Mandatory)][ValidateSet('REG_SZ', 'REG_NONE', 'None', 'REG_EXPAND_SZ', 'REG_BINARY', 'REG_DWORD', 'REG_MULTI_SZ', 'REG_QWORD', 'string', 'binary', 'dword', 'qword', 'multistring', 'expandstring')][string] $Type,\n        [Parameter()][string] $Key,\n        [Parameter(Mandatory)][object] $Value,\n        [switch] $Suppress\n    )\n    Unregister-MountedRegistry\n\n    Get-PSRegistryDictionaries\n\n    [Array] $ComputersSplit = Get-ComputerSplit -ComputerName $ComputerName\n\n    # Cleans up registry path and makes sure it's as required to be processed further\n    $RegistryPath = Resolve-PrivateRegistry -RegistryPath $RegistryPath\n\n    [Array] $RegistryTranslated = Get-PSConvertSpecialRegistry -RegistryPath $RegistryPath -Computers $ComputerName -HiveDictionary $Script:HiveDictionary\n\n    foreach ($Registry in $RegistryTranslated) {\n        $RegistryValue = Get-PrivateRegistryTranslated -RegistryPath $Registry -HiveDictionary $Script:HiveDictionary -Key $Key -Value $Value -Type $Type -ReverseTypesDictionary $Script:ReverseTypesDictionary\n        if ($RegistryValue.HiveKey) {\n            foreach ($Computer in $ComputersSplit[0]) {\n                # Local computer\n                Set-PrivateRegistry -RegistryValue $RegistryValue -Computer $Computer -Suppress:$Suppress.IsPresent -ErrorAction $ErrorActionPreference -WhatIf:$WhatIfPreference\n            }\n            foreach ($Computer in $ComputersSplit[1]) {\n                # Remote computer\n                Set-PrivateRegistry -RegistryValue $RegistryValue -Computer $Computer -Remote -Suppress:$Suppress.IsPresent -ErrorAction $ErrorActionPreference -WhatIf:$WhatIfPreference\n            }\n        } else {\n            if ($PSBoundParameters.ErrorAction -eq 'Stop') {\n                Unregister-MountedRegistry\n                throw\n            } else {\n                # This shouldn't really happen\n                Write-Warning \"Set-PSRegistry - Setting registry to $Registry have failed. Couldn't translate HIVE.\"\n            }\n        }\n    }\n    Unregister-MountedRegistry\n}"
  },
  {
    "path": "Public/Registry/Test-PSRegistry.ps1",
    "content": "﻿function Test-PSRegistry {\n    <#\n    .SYNOPSIS\n    Tests the existence of a specified registry key on a remote or local computer.\n\n    .DESCRIPTION\n    This function checks if a specified registry key exists on a remote or local computer.\n\n    .PARAMETER RegistryPath\n    Specifies the path to the registry key(s) to be checked.\n\n    .PARAMETER ComputerName\n    Specifies the name of the remote computer to check. Defaults to the local computer.\n\n    .PARAMETER Key\n    Specifies the specific registry key to check for existence.\n\n    .EXAMPLE\n    Test-PSRegistry -RegistryPath 'HKLM:\\Software\\Microsoft' -Key 'Windows'\n\n    Description\n    -----------\n    Checks if the 'Windows' key exists under 'HKLM:\\Software\\Microsoft' on the local computer.\n\n    .EXAMPLE\n    Test-PSRegistry -RegistryPath 'HKLM:\\Software\\Microsoft' -ComputerName 'RemoteComputer' -Key 'Windows'\n\n    Description\n    -----------\n    Checks if the 'Windows' key exists under 'HKLM:\\Software\\Microsoft' on the 'RemoteComputer'.\n\n    #>\n    [cmdletbinding()]\n    param(\n        [alias('Path')][string[]] $RegistryPath,\n        [string] $ComputerName = $Env:COMPUTERNAME,\n        [string] $Key\n    )\n    $Output = Get-PSRegistry -RegistryPath $RegistryPath -ComputerName $ComputerName\n    if ($Output.PSConnection -eq $true -and $Output.PSError -eq $false) {\n        if ($Key) {\n            if ($null -ne $Output.$Key) {\n                return $true\n            } else {\n                return $false\n            }\n        } else {\n            return $true\n        }\n    } else {\n        return $false\n    }\n}"
  },
  {
    "path": "Public/Runspaces/New-Runspace.ps1",
    "content": "function New-Runspace {\n    <#\n    .SYNOPSIS\n    Creates a new runspace pool with the specified minimum and maximum runspaces.\n\n    .DESCRIPTION\n    This function creates a new runspace pool with the specified minimum and maximum runspaces. It allows for concurrent execution of PowerShell scripts.\n\n    .PARAMETER minRunspaces\n    The minimum number of runspaces to be created in the runspace pool. Default is 1.\n\n    .PARAMETER maxRunspaces\n    The maximum number of runspaces to be created in the runspace pool. Default is the number of processors plus 1.\n\n    .EXAMPLE\n    $pool = New-Runspace -minRunspaces 2 -maxRunspaces 5\n    Creates a runspace pool with a minimum of 2 and a maximum of 5 runspaces.\n\n    .EXAMPLE\n    $pool = New-Runspace\n    Creates a runspace pool with default minimum and maximum runspaces.\n\n    #>\n    [cmdletbinding()]\n    param (\n        [int] $minRunspaces = 1,\n        [int] $maxRunspaces = [int]$env:NUMBER_OF_PROCESSORS + 1\n    )\n    $RunspacePool = [RunspaceFactory]::CreateRunspacePool($minRunspaces, $maxRunspaces)\n    #ApartmentState is not available in PowerShell 6+\n    #$RunspacePool.ApartmentState = \"MTA\"\n    $RunspacePool.Open()\n    return $RunspacePool\n}"
  },
  {
    "path": "Public/Runspaces/Start-Runspace.ps1",
    "content": "function Start-Runspace {\n    <#\n    .SYNOPSIS\n    Starts a new runspace with the provided script block, parameters, and runspace pool.\n\n    .DESCRIPTION\n    This function creates a new runspace using the specified script block, parameters, and runspace pool. It then starts the runspace and returns an object containing the runspace and its status.\n\n    .PARAMETER ScriptBlock\n    The script block to be executed in the new runspace.\n\n    .PARAMETER Parameters\n    The parameters to be passed to the script block.\n\n    .PARAMETER RunspacePool\n    The runspace pool in which the new runspace will be created.\n\n    .EXAMPLE\n    $scriptBlock = {\n        Get-Process\n    }\n    $parameters = @{\n        Name = 'explorer.exe'\n    }\n    $runspacePool = [RunspaceFactory]::CreateRunspacePool(1, 5)\n    $runspacePool.Open()\n    $result = Start-Runspace -ScriptBlock $scriptBlock -Parameters $parameters -RunspacePool $runspacePool\n    $result.Pipe | Receive-Job -Wait\n\n    This example starts a new runspace that retrieves information about the 'explorer.exe' process.\n\n    #>\n    [cmdletbinding()]\n    param (\n        [ScriptBlock] $ScriptBlock,\n        [System.Collections.IDictionary] $Parameters,\n        [System.Management.Automation.Runspaces.RunspacePool] $RunspacePool\n    )\n    if ($ScriptBlock -ne '') {\n        $runspace = [PowerShell]::Create()\n        $null = $runspace.AddScript($ScriptBlock)\n        if ($null -ne $Parameters) {\n            $null = $runspace.AddParameters($Parameters)\n        }\n        $runspace.RunspacePool = $RunspacePool\n        # return data\n        [PSCustomObject]@{\n            Pipe   = $runspace\n            Status = $runspace.BeginInvoke()\n        }\n    }\n}"
  },
  {
    "path": "Public/Runspaces/Stop-Runspace.ps1",
    "content": "function Stop-Runspace {\n    <#\n    .SYNOPSIS\n    Stops and cleans up the specified runspaces.\n\n    .DESCRIPTION\n    This function stops and cleans up the specified runspaces by checking their status and handling any errors, warnings, and verbose messages. It also provides an option for extended output.\n\n    .PARAMETER Runspaces\n    Specifies the array of runspaces to stop.\n\n    .PARAMETER FunctionName\n    Specifies the name of the function associated with the runspaces.\n\n    .PARAMETER RunspacePool\n    Specifies the runspace pool to close and dispose of.\n\n    .PARAMETER ExtendedOutput\n    Indicates whether to include extended output in the result.\n\n    .EXAMPLE\n    Stop-Runspace -Runspaces $runspaceArray -FunctionName \"MyFunction\" -RunspacePool $pool -ExtendedOutput\n    Stops the specified runspaces in the $runspaceArray associated with the function \"MyFunction\" using the runspace pool $pool and includes extended output.\n\n    #>\n    [cmdletbinding()]\n    param(\n        [Array] $Runspaces,\n        [string] $FunctionName,\n        [System.Management.Automation.Runspaces.RunspacePool] $RunspacePool,\n        [switch] $ExtendedOutput\n    )\n    #[Array] $List = while ($Runspaces.Status -ne $null) {\n    [Array] $List = While (@($Runspaces | Where-Object -FilterScript { $null -ne $_.Status }).count -gt 0) {\n        foreach ($Runspace in $Runspaces | Where-Object { $_.Status.IsCompleted -eq $true }) {\n            $Errors = foreach ($e in $($Runspace.Pipe.Streams.Error)) {\n                Write-Error -ErrorRecord $e\n                $e\n            }\n            foreach ($w in $($Runspace.Pipe.Streams.Warning)) {\n                Write-Warning -Message $w\n            }\n            foreach ($v in $($Runspace.Pipe.Streams.Verbose)) {\n                Write-Verbose -Message $v\n            }\n            if ($ExtendedOutput) {\n                @{\n                    Output = $Runspace.Pipe.EndInvoke($Runspace.Status)\n                    Errors = $Errors\n                }\n            } else {\n                $Runspace.Pipe.EndInvoke($Runspace.Status)\n            }\n            $Runspace.Status = $null\n        }\n    }\n    $RunspacePool.Close()\n    $RunspacePool.Dispose()\n    if ($List.Count -eq 1) {\n        return , $List\n    } else {\n        return $List\n    }\n}"
  },
  {
    "path": "Public/Services/Get-PSService.ps1",
    "content": "function Get-PSService {\n    <#\n    .SYNOPSIS\n    Alternative way to Get-Service\n\n    .DESCRIPTION\n    Alternative way to Get-Service which works using CIM queries\n\n    .PARAMETER ComputerName\n    ComputerName(s) to query for services\n\n    .PARAMETER Protocol\n    Protocol to use to gather services\n\n    .PARAMETER Credential\n    Alternate credentials for CIM queries. Default is current user.\n\n    .PARAMETER Service\n    Limit output to just few services\n\n    .PARAMETER All\n    Return all data without filtering\n\n    .PARAMETER Extended\n    Return more data\n\n    .EXAMPLE\n    Get-PSService -ComputerName AD1, AD2, AD3, AD4 -Service 'Dnscache', 'DNS', 'PeerDistSvc', 'WebClient', 'Netlogon'\n\n    .EXAMPLE\n    Get-PSService -ComputerName AD1, AD2 -Extended\n\n    .EXAMPLE\n    Get-PSService\n\n    .EXAMPLE\n    Get-PSService -Extended\n\n    .NOTES\n    General notes\n    #>\n    [cmdletBinding()]\n    param(\n        [alias('Computer', 'Computers')][string[]] $ComputerName = $Env:COMPUTERNAME,\n        [ValidateSet('Default', 'Dcom', 'Wsman')][string] $Protocol = 'Default',\n        [alias('Services')][string[]] $Service,\n        [switch] $All,\n        [switch] $Extended,\n        [pscredential] $Credential\n    )\n    [string] $Class = 'win32_service'\n    [string] $Properties = '*'\n    <# Disabled as per https://github.com/EvotecIT/PSSharedGoods/issues/14\n    if ($All) {\n        [string] $Properties = '*'\n    } else {\n        [string[]] $Properties = @(\n            'Name'\n            'Status'\n            'ExitCode'\n            'DesktopInteract'\n            'ErrorControl'\n            'PathName'\n            'ServiceType'\n            'StartMode'\n            'Caption'\n            'Description'\n            #'InstallDate'\n            'Started'\n            'SystemName'\n            'AcceptPause'\n            'AcceptStop'\n            'DisplayName'\n            'ServiceSpecificExitCode'\n            'StartName'\n            'State'\n            'TagId'\n            'CheckPoint'\n            'DelayedAutoStart'\n            'ProcessId'\n            'WaitHint'\n            'PSComputerName'\n        )\n    }\n    #>\n    # instead of looping multiple times we create cache for services\n    if ($Service) {\n        $CachedServices = @{}\n        foreach ($S in $Service) {\n            $CachedServices[$S] = $true\n        }\n    }\n    $Information = Get-CimData -ComputerName $ComputerName -Protocol $Protocol -Credential $Credential -Class $Class -Properties $Properties\n    if ($All) {\n        if ($Service) {\n            foreach ($Entry in $Information) {\n                if ($CachedServices[$Entry.Name]) {\n                    $Entry\n                }\n            }\n        } else {\n            $Information\n        }\n    } else {\n        foreach ($Data in $Information) {\n            # # Remember to expand if changing properties above\n            if ($Service) {\n                if (-not $CachedServices[$Data.Name]) {\n                    continue\n                }\n            }\n            $OutputService = [ordered] @{\n                ComputerName = if ($Data.PSComputerName) { $Data.PSComputerName } else { $Env:COMPUTERNAME }\n                Status       = $Data.State\n                Name         = $Data.Name\n                ServiceType  = $Data.ServiceType\n                StartType    = $Data.StartMode\n                DisplayName  = $Data.DisplayName\n            }\n            if ($Extended) {\n                $OutputServiceExtended = [ordered] @{\n                    StatusOther             = $Data.Status\n                    ExitCode                = $Data.ExitCode\n                    DesktopInteract         = $Data.DesktopInteract\n                    ErrorControl            = $Data.ErrorControl\n                    PathName                = $Data.PathName\n                    Caption                 = $Data.Caption\n                    Description             = $Data.Description\n                    #InstallDate             = $Data.InstallDate\n                    Started                 = $Data.Started\n                    SystemName              = $Data.SystemName\n                    AcceptPause             = $Data.AcceptPause\n                    AcceptStop              = $Data.AcceptStop\n                    ServiceSpecificExitCode = $Data.ServiceSpecificExitCode\n                    StartName               = $Data.StartName\n                    #State                   = $Data.State\n                    TagId                   = $Data.TagId\n                    CheckPoint              = $Data.CheckPoint\n                    DelayedAutoStart        = $Data.DelayedAutoStart\n                    ProcessId               = $Data.ProcessId\n                    WaitHint                = $Data.WaitHint\n                }\n                [PSCustomObject] ($OutputService + $OutputServiceExtended)\n            } else {\n                [PSCustomObject] $OutputService\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "Public/Services/Set-ServiceRecovery.ps1",
    "content": "function Set-ServiceRecovery {\n    <#\n    .SYNOPSIS\n    Configures the recovery options for a specified Windows service.\n\n    .DESCRIPTION\n    This function sets the recovery options for a Windows service on a remote server. It allows you to define the actions to take upon service failure and the time intervals between these actions.\n\n    .PARAMETER ServiceDisplayName\n    The display name of the service for which recovery options need to be set.\n\n    .PARAMETER Server\n    The name of the server where the service is located.\n\n    .PARAMETER action1\n    The action to take for the first failure. Default is \"restart\".\n\n    .PARAMETER time1\n    The time interval (in milliseconds) before the first action is taken. Default is 30000 milliseconds.\n\n    .PARAMETER action2\n    The action to take for the second failure. Default is \"restart\".\n\n    .PARAMETER time2\n    The time interval (in milliseconds) before the second action is taken. Default is 30000 milliseconds.\n\n    .PARAMETER actionLast\n    The action to take for subsequent failures. Default is \"restart\".\n\n    .PARAMETER timeLast\n    The time interval (in milliseconds) before the subsequent action is taken. Default is 30000 milliseconds.\n\n    .PARAMETER resetCounter\n    The time interval (in seconds) after which the failure counter is reset. Default is 4000 seconds.\n\n    .EXAMPLE\n    Set-ServiceRecovery -ServiceDisplayName \"Pulseway\" -Server \"MAIL1\"\n    Configures the recovery options for the \"Pulseway\" service on the server \"MAIL1\" with default settings.\n\n    .NOTES\n    For more information on service recovery options, refer to: https://technet.microsoft.com/en-us/library/cc742019.aspx\n    #>\n    [alias('Set-Recovery')]\n    param\n    (\n        [string] [Parameter(Mandatory = $true)] $ServiceDisplayName,\n        [string] [Parameter(Mandatory = $true)] $Server,\n        [string] $action1 = \"restart\",\n        [int] $time1 = 30000, # in miliseconds\n        [string] $action2 = \"restart\",\n        [int] $time2 = 30000, # in miliseconds\n        [string] $actionLast = \"restart\",\n        [int] $timeLast = 30000, # in miliseconds\n        [int] $resetCounter = 4000 # in seconds\n    )\n    $serverPath = \"\\\\\" + $server\n    $services = Get-CimInstance -ClassName 'Win32_Service' -ComputerName $Server | Where-Object { $_.DisplayName -imatch $ServiceDisplayName }\n    $action = $action1 + \"/\" + $time1 + \"/\" + $action2 + \"/\" + $time2 + \"/\" + $actionLast + \"/\" + $timeLast\n    foreach ($service in $services) {\n        # https://technet.microsoft.com/en-us/library/cc742019.aspx\n        $output = sc.exe $serverPath failure $($service.Name) actions= $action reset= $resetCounter\n    }\n}"
  },
  {
    "path": "Public/TestFunctionality/Find-TypesNeeded.ps1",
    "content": "function Find-TypesNeeded {\n    <#\n    .SYNOPSIS\n    Finds if specific types are needed among the required types.\n\n    .DESCRIPTION\n    This function checks if any of the specified types in $TypesNeeded are among the required types in $TypesRequired. Returns $true if any type is found, otherwise $false.\n\n    .PARAMETER TypesRequired\n    Specifies an array of types that are required.\n\n    .PARAMETER TypesNeeded\n    Specifies an array of types to check if they are needed.\n\n    .EXAMPLE\n    Find-TypesNeeded -TypesRequired @('System.String', 'System.Int32') -TypesNeeded @('System.Int32')\n    Checks if 'System.Int32' is among the required types 'System.String' and 'System.Int32'.\n\n    .EXAMPLE\n    Find-TypesNeeded -TypesRequired @('System.Management.Automation.PSCredential', 'System.Net.IPAddress') -TypesNeeded @('System.Net.IPAddress')\n    Checks if 'System.Net.IPAddress' is needed among the required types 'System.Management.Automation.PSCredential' and 'System.Net.IPAddress'.\n    #>\n    [CmdletBinding()]\n    param (\n        [Array] $TypesRequired,\n        [Array] $TypesNeeded\n    )\n    [bool] $Found = $False\n    foreach ($Type in $TypesNeeded) {\n        if ($TypesRequired -contains $Type) {\n            $Found = $true\n            break\n        }\n    }\n    return $Found\n}"
  },
  {
    "path": "Public/TestFunctionality/Get-ModulesAvailability.ps1",
    "content": "Function Get-ModulesAvailability {\n    <#\n    .SYNOPSIS\n    Checks the availability of a specified module and imports it if available.\n\n    .DESCRIPTION\n    This function checks if a specified module is available. If the module is not loaded, it attempts to import it. Returns $true if the module is successfully loaded, otherwise $false.\n\n    .PARAMETER Name\n    Specifies the name of the module to check and potentially import.\n\n    .EXAMPLE\n    Get-ModulesAvailability -Name \"AzureRM\"\n    Checks if the \"AzureRM\" module is available and imports it if not already loaded.\n\n    .EXAMPLE\n    Get-ModulesAvailability -Name \"ActiveDirectory\"\n    Checks the availability of the \"ActiveDirectory\" module and imports it if necessary.\n\n    #>\n    [cmdletBinding()]\n    param(\n        [string]$Name\n    )\n    if (-not(Get-Module -Name $Name)) {\n        if (Get-Module -ListAvailable | Where-Object { $_.Name -eq $Name }) {\n            try {\n                Import-Module -Name $Name\n                return $true\n            } catch {\n                return $false\n            }\n        } else {\n            #module not available\n            return $false\n        }\n    } else {\n        return $true\n    } #module already loaded\n}"
  },
  {
    "path": "Public/TestFunctionality/Search-Command.ps1",
    "content": "function Search-Command {\n    <#\n    .SYNOPSIS\n    Searches for a specific command by name.\n\n    .DESCRIPTION\n    This function checks if a command with the specified name exists in the current session.\n\n    .PARAMETER CommandName\n    Specifies the name of the command to search for.\n\n    .EXAMPLE\n    Search-Command -CommandName \"Get-Process\"\n    Returns $true if the command \"Get-Process\" exists, otherwise $false.\n\n    .EXAMPLE\n    Search-Command -CommandName \"UnknownCommand\"\n    Returns $false as \"UnknownCommand\" does not exist as a command.\n\n    #>\n    [cmdletbinding()]\n    param (\n        [string] $CommandName\n    )\n    return [bool](Get-Command -Name $CommandName -ErrorAction SilentlyContinue)\n}"
  },
  {
    "path": "Public/TestFunctionality/Test-AvailabilityCommands.ps1",
    "content": "function Test-AvailabilityCommands {\n    <#\n    .SYNOPSIS\n    Tests the availability of specified commands.\n\n    .DESCRIPTION\n    The Test-AvailabilityCommands function checks whether the specified commands are available in the current environment.\n\n    .PARAMETER Commands\n    Specifies an array of command names to test for availability.\n\n    .EXAMPLE\n    Test-AvailabilityCommands -Commands \"Get-Process\", \"Get-Service\"\n    This example tests the availability of the \"Get-Process\" and \"Get-Service\" commands.\n\n    .EXAMPLE\n    Test-AvailabilityCommands -Commands \"Get-Command\", \"Get-Help\"\n    This example tests the availability of the \"Get-Command\" and \"Get-Help\" commands.\n\n    #>\n    [cmdletBinding()]\n    param (\n        [string[]] $Commands\n    )\n    $CommandsStatus = foreach ($Command in $Commands) {\n        $Exists = Get-Command -Name $Command -ErrorAction SilentlyContinue\n        if ($Exists) {\n            Write-Verbose \"Test-AvailabilityCommands - Command $Command is available.\"\n        } else {\n            Write-Verbose \"Test-AvailabilityCommands - Command $Command is not available.\"\n        }\n        $Exists\n    }\n    return $CommandsStatus\n}"
  },
  {
    "path": "Public/TestFunctionality/Test-ComputerAvailability.ps1",
    "content": "function Test-ComputerAvailability {\n    <#\n    .SYNOPSIS\n    Tests the availability of specified servers using various methods.\n\n    .DESCRIPTION\n    This function tests the availability of specified servers by performing ping, WinRM, and port open tests. It provides detailed information about the availability status of each server.\n\n    .PARAMETER Servers\n    Specifies an array of server names to test.\n\n    .PARAMETER Test\n    Specifies the type of tests to perform. Valid values are 'All', 'Ping', 'WinRM', 'PortOpen', 'Ping+WinRM', 'Ping+PortOpen', 'WinRM+PortOpen'. Default is 'All'.\n\n    .PARAMETER Ports\n    Specifies an array of TCP ports to test for port open. Default is 135.\n\n    .PARAMETER PortsTimeout\n    Specifies the timeout value (in milliseconds) for testing port open. Default is 100.\n\n    .PARAMETER PingCount\n    Specifies the number of ping attempts to make. Default is 1.\n\n    .EXAMPLE\n    Test-ComputerAvailability -Servers \"Server1\", \"Server2\" -Test Ping+WinRM\n    Tests the availability of Server1 and Server2 using both ping and WinRM methods.\n\n    .EXAMPLE\n    Test-ComputerAvailability -Servers \"Server3\" -Test PortOpen -Ports 80,443 -PortsTimeout 200\n    Tests the availability of Server3 by checking if ports 80 and 443 are open within a timeout of 200 milliseconds.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [string[]] $Servers,\n        [ValidateSet('All', 'Ping', 'WinRM', 'PortOpen', 'Ping+WinRM', 'Ping+PortOpen', 'WinRM+PortOpen')] $Test = 'All',\n        [int[]] $Ports = 135,\n        [int] $PortsTimeout = 100,\n        [int] $PingCount = 1\n    )\n    $OutputList = @(\n        foreach ($Server in $Servers) {\n            $Output = [ordered] @{ }\n            $Output.ServerName = $Server\n            if ($Test -eq 'All' -or $Test -like 'Ping*') {\n                $Output.Pingable = Test-Connection -ComputerName $Server -Quiet -Count $PingCount\n            }\n            if ($Test -eq 'All' -or $Test -like '*WinRM*') {\n                $Output.WinRM = (Test-WinRM -ComputerName $Server).Status\n            }\n            if ($Test -eq 'All' -or '*PortOpen*') {\n                $Output.PortOpen = (Test-ComputerPort -Server $Server -PortTCP $Ports -Timeout $PortsTimeout).Status\n            }\n            [PSCustomObject] $Output\n        }\n    )\n    return $OutputList\n}\n\n#Test-ComputerAvailability -Servers AD1,AD2"
  },
  {
    "path": "Public/TestFunctionality/Test-ComputerPort.ps1",
    "content": "function Test-ComputerPort {\n    <#\n    .SYNOPSIS\n    Tests the connectivity of a computer on specified TCP and UDP ports.\n\n    .DESCRIPTION\n    The Test-ComputerPort function tests the connectivity of a computer on specified TCP and UDP ports. It checks if the specified ports are open and reachable on the target computer.\n\n    .PARAMETER ComputerName\n    Specifies the name of the computer to test the port connectivity.\n\n    .PARAMETER PortTCP\n    Specifies an array of TCP ports to test connectivity.\n\n    .PARAMETER PortUDP\n    Specifies an array of UDP ports to test connectivity.\n\n    .PARAMETER Timeout\n    Specifies the timeout value in milliseconds for the connection test. Default is 5000 milliseconds.\n\n    .EXAMPLE\n    Test-ComputerPort -ComputerName \"Server01\" -PortTCP 80,443 -PortUDP 53 -Timeout 3000\n    Tests the connectivity of Server01 on TCP ports 80 and 443, UDP port 53 with a timeout of 3000 milliseconds.\n\n    .EXAMPLE\n    Test-ComputerPort -ComputerName \"Server02\" -PortTCP 3389 -PortUDP 123\n    Tests the connectivity of Server02 on TCP port 3389, UDP port 123 with the default timeout of 5000 milliseconds.\n    #>\n    [CmdletBinding()]\n    param (\n        [alias('Server')][string[]] $ComputerName,\n        [int[]] $PortTCP,\n        [int[]] $PortUDP,\n        [int]$Timeout = 5000\n    )\n    begin {\n        if ($Global:ProgressPreference -ne 'SilentlyContinue') {\n            $TemporaryProgress = $Global:ProgressPreference\n            $Global:ProgressPreference = 'SilentlyContinue'\n        }\n    }\n    process {\n        foreach ($Computer in $ComputerName) {\n            foreach ($P in $PortTCP) {\n                $Output = [ordered] @{\n                    'ComputerName' = $Computer\n                    'Port'         = $P\n                    'Protocol'     = 'TCP'\n                    'Status'       = $null\n                    'Summary'      = $null\n                    'Response'     = $null\n                }\n                <#\n                $TcpClient = [System.Net.Sockets.TcpClient]::new()\n                $Connect = $TcpClient.BeginConnect($Computer, $P, $null, $null)\n                $Wait = $Connect.AsyncWaitHandle.WaitOne($Timeout, $false)\n                if (!$Wait) {\n                    $TcpClient.Close()\n                    $Output['Status'] = $false\n                    $Output['Summary'] = \"TCP $P Failed\"\n                } else {\n                    $TcpClient.EndConnect($Connect)\n                    $TcpClient.Close()\n                    $Output['Status'] = $true\n                    $Output['Summary'] = \"TCP $P Successful\"\n                }\n                $TcpClient.Close()\n                $TcpClient.Dispose()\n\n\n                #>\n\n                $TcpClient = Test-NetConnection -ComputerName $Computer -Port $P -InformationLevel Detailed -WarningAction SilentlyContinue\n                if ($TcpClient.TcpTestSucceeded) {\n                    $Output['Status'] = $TcpClient.TcpTestSucceeded\n                    $Output['Summary'] = \"TCP $P Successful\"\n                } else {\n                    $Output['Status'] = $false\n                    $Output['Summary'] = \"TCP $P Failed\"\n                    $Output['Response'] = $Warnings\n                }\n                [PSCustomObject]$Output\n            }\n            foreach ($P in $PortUDP) {\n                $Output = [ordered] @{\n                    'ComputerName' = $Computer\n                    'Port'         = $P\n                    'Protocol'     = 'UDP'\n                    'Status'       = $null\n                    'Summary'      = $null\n                }\n                $UdpClient = [System.Net.Sockets.UdpClient]::new($Computer, $P)\n                $UdpClient.Client.ReceiveTimeout = $Timeout\n                # $UdpClient.Connect($Computer, $P)\n                $Encoding = [System.Text.ASCIIEncoding]::new()\n                $byte = $Encoding.GetBytes(\"Evotec\")\n                [void]$UdpClient.Send($byte, $byte.length)\n                $RemoteEndpoint = [System.Net.IPEndPoint]::new([System.Net.IPAddress]::Any, 0)\n                try {\n                    $Bytes = $UdpClient.Receive([ref]$RemoteEndpoint)\n                    [string]$Data = $Encoding.GetString($Bytes)\n                    If ($Data) {\n                        $Output['Status'] = $true\n                        $Output['Summary'] = \"UDP $P Successful\"\n                        $Output['Response'] = $Data\n                    }\n                } catch {\n                    $Output['Status'] = $false\n                    $Output['Summary'] = \"UDP $P Failed\"\n                    $Output['Response'] = $_.Exception.Message\n                }\n                $UdpClient.Close()\n                $UdpClient.Dispose()\n                [PSCustomObject]$Output\n            }\n\n        }\n    }\n    end {\n        # Bring back setting as per default\n        if ($TemporaryProgress) {\n            $Global:ProgressPreference = $TemporaryProgress\n        }\n    }\n}\n\n\n#Test-ComputerPort -ComputerName 'AD1', 'AD2' -PortTCP  25, 88, 389, 464, 636, 5722, 9389 | Format-Table -AutoSize\n#Test-ComputerPort -ComputerName 'AD1' -PortTCP 25, 88, 389, 464, 636, 5722, 9389 -PortUDP 88, 123, 389, 464 | ft -AutoSize\n#Test-ComputerPort -ComputerName 'AD2' -PortTCP 53 -PortUDP 53 | ft -AutoSize\n#Test-ComputerPort -PortUDP 53 -ComputerName AD1,AD2 | ft -AutoSize\n\n#Test-ComputerPort -ComputerName AD1,AD7 -PortTCP 53, 3389 | ft -a"
  },
  {
    "path": "Public/TestFunctionality/Test-ConfigurationCredentials.ps1",
    "content": "function Test-ConfigurationCredentials {\n    <#\n    .SYNOPSIS\n    Tests the configuration credentials for any null or empty values.\n\n    .DESCRIPTION\n    This function tests the configuration credentials provided to ensure that no keys have null or empty values.\n\n    .PARAMETER Configuration\n    The configuration object containing the credentials to be tested.\n\n    .PARAMETER AllowEmptyKeys\n    Specifies whether empty keys are allowed to be present in the configuration.\n\n    .EXAMPLE\n    Test-ConfigurationCredentials -Configuration $Config -AllowEmptyKeys $true\n    Tests the configuration credentials in $Config allowing empty keys.\n\n    .EXAMPLE\n    Test-ConfigurationCredentials -Configuration $Config -AllowEmptyKeys $false\n    Tests the configuration credentials in $Config without allowing empty keys.\n    #>\n    [CmdletBinding()]\n    param (\n        [Object] $Configuration,\n        $AllowEmptyKeys\n    )\n    $Object = foreach ($Key in $Configuration.Keys) {\n        if ($AllowEmptyKeys -notcontains $Key -and [string]::IsNullOrWhiteSpace($Configuration.$Key)) {\n            Write-Verbose \"Test-ConfigurationCredentials - Configuration $Key is Null or Empty! Terminating\"\n            @{ Status = $false; Output = $User.SamAccountName; Extended = \"Credentials configuration $Key is Null or Empty!\" }\n        }\n    }\n    return $Object\n}"
  },
  {
    "path": "Public/TestFunctionality/Test-ForestConnectivity.ps1",
    "content": "function Test-ForestConnectivity {\n    <#\n    .SYNOPSIS\n    Tests the connectivity to the Active Directory forest.\n\n    .DESCRIPTION\n    This function tests the connectivity to the Active Directory forest by attempting to retrieve the forest information.\n\n    .EXAMPLE\n    Test-ForestConnectivity\n    Tests the connectivity to the Active Directory forest.\n\n    .PARAMETER Credential\n    Alternate credentials to attempt the forest connectivity test.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [pscredential] $Credential\n    )\n    $credentialSplat = @{}\n    if ($PSBoundParameters.ContainsKey('Credential')) {\n        $credentialSplat['Credential'] = $Credential\n    }\n    Try {\n        $null = Get-ADForest @credentialSplat\n        return $true\n    } catch {\n        #Write-Warning 'No connectivity to forest/domain.'\n        return $False\n    }\n}\n"
  },
  {
    "path": "Public/TestFunctionality/Test-Key.ps1",
    "content": "function Test-Key {\n    <#\n    .SYNOPSIS\n    Checks if a specific key exists in a configuration table.\n\n    .DESCRIPTION\n    The Test-Key function checks if a specified key exists in a given configuration table. It returns true if the key exists, and false otherwise.\n\n    .PARAMETER ConfigurationTable\n    The configuration table to search for the key.\n\n    .PARAMETER ConfigurationSection\n    The section within the configuration table where the key is located.\n\n    .PARAMETER ConfigurationKey\n    The key to check for existence in the configuration table.\n\n    .PARAMETER DisplayProgress\n    Specifies whether to display progress messages.\n\n    .EXAMPLE\n    Test-Key -ConfigurationTable $configTable -ConfigurationSection \"Section1\" -ConfigurationKey \"Key1\" -DisplayProgress $true\n    Checks if the key \"Key1\" exists in the \"Section1\" of the $configTable and displays a progress message.\n\n    .EXAMPLE\n    Test-Key -ConfigurationTable $configTable -ConfigurationKey \"Key2\"\n    Checks if the key \"Key2\" exists in the $configTable without displaying progress messages.\n    #>\n    [CmdletBinding()]\n    param(\n        $ConfigurationTable,\n        $ConfigurationSection = \"\",\n        $ConfigurationKey,\n        $DisplayProgress = $false\n    )\n    if ($null -eq $ConfigurationTable) { return $false }\n    try {\n        $value = $ConfigurationTable.ContainsKey($ConfigurationKey)\n    } catch {\n        $value = $false\n    }\n    if ($value -eq $true) {\n        if ($DisplayProgress -eq $true) {\n            Write-Color @script:WriteParameters -Text \"[i] \", \"Parameter in configuration of \", \"$ConfigurationSection.$ConfigurationKey\", \" exists.\" -Color White, White, Green, White\n        }\n        return $true\n    } else {\n        if ($DisplayProgress -eq $true) {\n            Write-Color @script:WriteParameters -Text \"[i] \", \"Parameter in configuration of \", \"$ConfigurationSection.$ConfigurationKey\", \" doesn't exist.\" -Color White, White, Red, White\n        }\n        return $false\n    }\n}"
  },
  {
    "path": "Public/TestFunctionality/Test-ModuleAvailability.ps1",
    "content": "function Test-ModuleAvailability {\n    <#\n    .SYNOPSIS\n    Tests the availability of required modules.\n\n    .DESCRIPTION\n    This function checks if the required modules are available for use.\n\n    .EXAMPLE\n    Test-ModuleAvailability\n    Checks if the 'Get-AdForest' module is available.\n\n    #>\n    [CmdletBinding()]\n    param(\n\n    )\n    if (Search-Command -CommandName 'Get-AdForest') {\n        # future use\n    } else {\n        Write-Warning 'Modules required to run not found.'\n        Exit\n    }\n}"
  },
  {
    "path": "Public/TestFunctionality/Test-WinRM.ps1",
    "content": "function Test-WinRM {\n    <#\n    .SYNOPSIS\n    Tests the WinRM connectivity on the specified computers.\n\n    .DESCRIPTION\n    The Test-WinRM function tests the WinRM connectivity on the specified computers and returns the status of the connection.\n\n    .PARAMETER ComputerName\n    Specifies the names of the computers to test WinRM connectivity on.\n\n    .EXAMPLE\n    Test-WinRM -ComputerName \"Server01\", \"Server02\"\n    Tests the WinRM connectivity on Server01 and Server02.\n\n    .EXAMPLE\n    Test-WinRM -ComputerName \"Server03\"\n    Tests the WinRM connectivity on Server03.\n\n    #>\n    [CmdletBinding()]\n    param (\n        [alias('Server')][string[]] $ComputerName\n    )\n    $Output = foreach ($Computer in $ComputerName) {\n        $Test = [PSCustomObject] @{\n            Output       = $null\n            Status       = $null\n            ComputerName = $Computer\n        }\n        try {\n            $Test.Output = Test-WSMan -ComputerName $Computer -ErrorAction Stop\n            $Test.Status = $true\n        } catch {\n            $Test.Status = $false\n        }\n        $Test\n    }\n    $Output\n}\n\n#Test-WinRM -ComputerName AD1, AD2"
  },
  {
    "path": "Public/Time/Get-TimeSettings.ps1",
    "content": "\n<#\nfunction Get-TimeSynchronization {\n    [CmdletBinding()]\n    param(\n\n    )\n    Get-Item HKLM:\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Parameters\n    Get-Item HKLM:\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Config\n    Get-Item HKLM:\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\TimeProviders\\NtpServer\n    Get-Item HKLM:\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\TimeProviders\\NtpClient\n\n}\n#>\n<#\nw32tm /config /manualpeerlist:\"0.uk.pool.ntp.org,0x1 1.uk.pool.ntp.org,0x1 2.uk.pool.ntp.org,0x1 3.uk.pool.ntp.org,0x1\"\nw32tm /config /reliable:yes\nRestart-Service -Name 'w32time'\n#>\n\n<#\nw32tm /resync /nowait\nw32tm /query /configuration\nw32tm /query /source\nw32tm /query /peers\nw32tm /query /status\nw32tm /config /syncfromflags:domhier /update\n#>\n\n<#\n    net stop w32time\n    w32tm /unregister\n    w32tm /register\n    net start w32time\n#>\n<#\n$Servers = 'localhost','127.0.0.1'\n\n$w32tm = Invoke-Command -Computer $Servers -ArgumentList $Servers -Scriptblock {\n    Param ($Servers)\n    Foreach ($Server in $Servers)\n    {\n        $Check = w32tm /monitor /computers:$Server /nowarn\n        $ICMP = (($Check | Select-String \"ICMP\")-Replace \"ICMP: \" , \"\").Trim()\n        $ICMPVal = [int]($ICMP -split \"ms\")[0]\n        $Source = w32tm /query /source\n        $Name = Hostname\n\n        Switch ($ICMPVal)\n            {\n                {$ICMPVal -le 0} {$Status = \"Optimal time synchronisation\"}\n                #you probably need another value here since you'll get no status if it is between 0 and 2m\n                {$ICMPVal -lt 100000} {$Status = \"0-2 Minute time difference\"}\n                {$ICMPVal -ge 100000} {$Status = \"Warning, 2 minutes time difference\"}\n                {$ICMPVal -ge 300000} {$Status = \"Critical. Over 5 minutes time difference!\"}\n            }\n        $String = $Name + \" - $Status \" + \"- $ICMP \" + \" - Source: $Source\"\n        Write-Output $String\n    }\n}\n\n$w32tm\n#>\n\n\nfunction Get-TimeSettings {\n    <#\n    .SYNOPSIS\n    Retrieves and displays time synchronization settings for the specified computer(s).\n\n    .DESCRIPTION\n    The Get-TimeSettings function retrieves and displays time synchronization settings for the specified computer(s). It provides information on the type of time synchronization mechanism being used, NTP server flags, cross-site synchronization flags, and announce flags.\n\n    .PARAMETER ComputerName\n    Specifies the computer(s) for which time synchronization settings are to be retrieved. If not specified, the local computer name is used.\n\n    .PARAMETER Formatted\n    Switch parameter to format the output in a structured manner.\n\n    .PARAMETER Splitter\n    Specifies the character used to split the output if Formatted parameter is used.\n\n    .EXAMPLE\n    Get-TimeSettings -ComputerName 'Server01'\n    Retrieves time synchronization settings for a single computer named 'Server01'.\n\n    .EXAMPLE\n    Get-TimeSettings -ComputerName 'Server01','Server02' -Formatted -Splitter ','\n    Retrieves time synchronization settings for multiple computers named 'Server01' and 'Server02' in a formatted output separated by commas.\n\n    #>\n    [alias('Get-TimeSynchronization')]\n    param(\n        [string[]] $ComputerName,\n        # [string] $Domain,\n        [switch] $Formatted,\n        [string] $Splitter\n    )\n    # https://icookservers.blog/2014/09/12/windows-ntp-server-cookbook/\n    # https://docs.microsoft.com/en-us/windows-server/networking/windows-time-service/windows-time-service-tools-and-settings\n    $Types = @{\n        NT5DS   = 'The time service synchronizes from the domain hierarchy.' # Use on computers that are joined to a domain.\n        NTP     = 'The time service synchronizes from the servers specified in the NtpServer registry entry.'  #Use on computers that are not joined to a domain.\n        ALLSync = 'The time service uses all the available synchronization mechanisms.'\n        NoSync  = 'The time service does not synchronize with other sources.'\n\n        # The default value on domain members is NT5DS. The default value on stand-alone clients and servers is NTP.\n    }\n\n    [flags()]\n    enum NtpServerFlags {\n        None = 0\n        SpecialInterval = 0x1 # flag indicate sync time with external server in special interval configured in “SpecialPollInterval” registry value.\n        UseAsFallbackOnly = 0x2 # use this as UseAsFallbackOnly time source – if primary is not available then sync to this server.\n        SymmetricActive = 0x4 # For more information about this mode, see Windows Time Server: 3.3 Modes of Operation.\n        Client = 0x8 # use client mode association while sync time to external time source.\n    }\n\n    $CrossSiteSyncFlags = @{\n        '0' = 'None'\n        '1' = 'PdcOnly'\n        '2' = 'All'\n\n        # Entry determines whether the service chooses synchronization partners outside the domain of the computer. The options and values are:\n        # This value is ignored if the NT5DS value is not set. The default value for domain members is 2. The default value for stand-alone clients and servers is 2.\n    }\n\n    $AnnounceFlags = @{\n        '0'  = 'Not a time server'\n        '1'  = 'Always time server'\n        '2'  = 'Automatic time server'\n        '4'  = 'Always reliable time server'\n        '8'  = 'Automatic reliable time server'\n        '10' = 'The default value for domain members is 10. The default value for stand-alone clients and servers is 10.'\n    }\n\n    if ($null -eq $ComputerName) {\n        $ComputerName = $env:COMPUTERNAME\n    }\n    foreach ($_ in $ComputerName) {\n        [bool] $AppliedGPO = $false\n        $TimeParameters = Get-PSRegistry -ComputerName $_ -RegistryPath \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\W32time\\Parameters\"\n        if ($null -eq $TimeParameters.NtpServer) {\n            $TimeParameters = Get-PSRegistry -ComputerName $_ -RegistryPath \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Parameters\"\n            $AppliedGPO = $true\n        }\n\n        $TimeConfig = Get-PSRegistry -ComputerName $_ -RegistryPath \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Config\"\n        #Get-PSRegistry -ComputerName $ComputerName -RegistryPath \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Security\"\n        $TimeNTPClient = Get-PSRegistry -ComputerName $_ -RegistryPath \"HKLM\\SOFTWARE\\Policies\\Microsoft\\W32time\\TimeProviders\\NtpClient\"\n        if ($null -eq $TimeNTPClient.CrossSiteSyncFlags) {\n            $TimeNTPClient = Get-PSRegistry -ComputerName $_ -RegistryPath \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\TimeProviders\\NTPClient\"\n        }\n        $TimeNTPServer = Get-PSRegistry -ComputerName $_ -RegistryPath \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\TimeProviders\\NTPServer\"\n        #$TimeSecureLimits = Get-PSRegistry -ComputerName $_ -RegistryPath \"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\SecureTimeLimits\"\n        $TimeVMProvider = Get-PSRegistry -ComputerName $_ -RegistryPath \"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\TimeProviders\\VMICTimeProvider\"\n        #Get-PSRegistry -ComputerName $ComputerName -RegistryPath \"HKLM\\SYSTEM\\CurrentControlSet\"\n\n        $SecureTimeSeeding = Get-PSRegistry -ComputerName $_ -RegistryPath \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Config\" -Key 'UtilizeSslTimeData'\n\n        $NtpServers = $TimeParameters.NtpServer -split ' '\n        $Ntp = foreach ($NtpServer in $NtpServers) {\n            $SplitNTP = $NtpServer -split ','\n\n            if ($SplitNTP.Count -eq 2) {\n\n                # sanity check what should be a small hex value\n                if ($flagVal = $SplitNTP[1] -as [int]) {\n                    # make sure it's within the bounds of our supported flags\n                    if ($flags = $flagVal -as [NtpServerFlags]) {\n                        $Intervals = $flags.ToString().Replace(', ', '+')\n                    } else {\n                        Write-Warning -Message \"Get-TimeSettings - NtpServer flag value `\"$flagVal`\" could not be converted to NtpServerFlags enum\"\n                        $Intervals = 'Incorrect'\n                    }\n                } else {\n                    Write-Warning -Message \"Get-TimeSettings - NtpServer flag value `\"$($SplitNTP[1])`\" could not be parsed as an integer\"\n                    $Intervals = 'Incorrect'\n                }\n\n            } else {\n                $Intervals = 'Missing'\n            }\n\n            [PSCustomObject] @{\n                NtpServer = $SplitNTP[0]\n                Intervals = $Intervals\n            }\n        }\n\n        #$FullName = Resolve-DnsName -Name $_ -ErrorAction SilentlyContinue\n\n        if ($null -eq $TimeConfig.UtilizeSslTimeData) {\n            $WSTSType = $true\n        } elseif ($TimeConfig.UtilizeSslTimeData -eq 0) {\n            $WSTSType = $false\n        } else {\n            $WSTSType = $true\n        }\n\n        if ($null -eq $SecureTimeSeeding.PSType) {\n            $WSTSStatus = $false # Windows Secure Time Seeding is enabl;ed (bad)\n            $WSTSType = $true\n        } elseif ($SecureTimeSeeding.PSType -eq 'DWord' -and $SecureTimeSeeding.PSValue -eq 0) {\n            $WSTSStatus = $false # Windows Secure Time Seeding is disabled\n            $WSTSType = $true\n        } elseif ($SecureTimeSeeding.PSType -eq 'DWord' -and $SecureTimeSeeding.PSValue -eq 1) {\n            $WSTSStatus = $true # Windows Secure Time Seeding is disabled\n            $WSTSType = $true\n        } else {\n            $WSTSStatus = $true # Windows Secure Time Seeding is enabled\n            $WSTSType = $false\n        }\n\n\n        [PSCustomObject] @{\n            ComputerName                        = $_\n            #IsPDC                       = ($PDCName -eq $FullName.Name)\n            NtpServer                           = if ($Splitter) { $Ntp.NtpServer -join $Splitter } else { $Ntp.NtpServer }\n            NtpServerIntervals                  = if ($Splitter) { $Ntp.Intervals -join $Splitter } else { $Ntp.Intervals }\n            NtpType                             = $TimeParameters.Type\n            NtpTypeComment                      = $Types[\"$($TimeParameters.Type)\"]\n            AppliedGPO                          = $AppliedGPO\n            VMTimeProvider                      = [bool] $TimeVMProvider.Enabled\n            # Windows Secure Time Seeding (UtilizeSslTimeData)\n            WindowsSecureTimeSeeding            = $WSTSStatus\n            WindowsSecureTimeSeedingTypeCorrect = $WSTSType\n            AnnounceFlags                       = $TimeConfig.AnnounceFlags\n            AnnounceFlagsComment                = $AnnounceFlags[\"$($TimeConfig.AnnounceFlags)\"]\n            NtpServerEnabled                    = [bool]$TimeNTPServer.Enabled\n            NtpServerInputProvider              = [bool]$TimeNTPServer.InputProvider\n            MaxPosPhaseCorrection               = $TimeConfig.MaxPosPhaseCorrection\n            MaxnegPhaseCorrection               = $TimeConfig.MaxnegPhaseCorrection\n            MaxAllowedPhaseOffset               = $TimeConfig.MaxAllowedPhaseOffset\n            MaxPollInterval                     = $TimeConfig.MaxPollInterval\n            MinPollInterval                     = $TimeConfig.MinPollInterval\n            UpdateInterval                      = $TimeConfig.UpdateInterval\n            ResolvePeerBackoffMinutes           = $TimeNTPClient.ResolvePeerBackoffMinutes\n            ResolvePeerBackoffMaxTimes          = $TimeNTPClient.ResolvePeerBackoffMaxTimes\n            SpecialPollInterval                 = $TimeNTPClient.SpecialPollInterval\n            EventLogFlags                       = $TimeConfig.EventLogFlags\n            NtpClientEnabled                    = [bool] $TimeNTPClient.Enabled\n            NtpClientCrossSiteSyncFlags         = $CrossSiteSyncFlags[\"$($TimeNTPClient.CrossSiteSyncFlags)\"]\n            NtpClientInputProvider              = [bool] $TimeNTPClient.InputProvider\n            TimeNTPClient                       = $TimeNTPClient.SpecialPollInterval\n        }\n    }\n}\n\n#Get-TimeSettings -ComputerName DC1, AD1 | Format-List *WindowsSecureTimeSeeding*\n\n#Get-PSRegistry -ComputerName AD1 -RegistryPath \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Parameters\"\n#Get-PSRegistry -ComputerName AD1 -RegistryPath \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\W32time\\Parameters\"\n\n#Get-PSRegistry -ComputerName DC1 -RegistryPath \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Parameters\"\n#Get-PSRegistry -ComputerName DC1 -RegistryPath \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\W32time\\Parameters\"\n\n\n#$ComputersDC = @( 'AD1', 'AD2', 'AD3', 'DC1', 'EVOWIN', 'ADPreview2019')\n\n#Get-PSRegistry -ComputerName AD1 -RegistryPath \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Parameters\", \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Config\"\n#Get-PSRegistry -ComputerName EVOWIN -RegistryPath \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Security\"\n#Get-PSRegistry -ComputerName AD1 -RegistryPath \"HKLM\\SYSTEM\\CurrentControlSet\"\n\n\n<#\nGet-PSRegistry -ComputerName $ComputersDC -RegistryPath \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Parameters\" | ft -AutoSize *\nGet-PSRegistry -ComputerName $ComputersDC -RegistryPath \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Config\" | ft -AutoSize *\nGet-PSRegistry -ComputerName $ComputersDC -RegistryPath \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\TimeProviders\\NTPClient\" | ft -AutoSize *\nGet-PSRegistry -ComputerName $ComputersDC -RegistryPath \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\TimeProviders\\NTPServer\" | ft -AutoSize *\nGet-PSRegistry -ComputerName $ComputersDC -RegistryPath \"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\TimeProviders\\VMICTimeProvider\" | ft -AutoSize *\nGet-PSRegistry -ComputerName $ComputersDC -RegistryPath \"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\SecureTimeLimits\" | ft -AutoSize *\nGet-PSRegistry -ComputerName $ComputersDC -RegistryPath \"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\SecureTimeLimits\\RunTime\" | ft -AutoSize *\n#>\n\n# https://www.mczerniawski.pl/hyperv/proper-time-configuration-for-virtualized-dc/\n#https://docs.microsoft.com/en-us/powershell/scripting/samples/working-with-registry-entries?view=powershell-6\n# https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc773263(v=ws.10)\n# HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\TimeProviders\\VMICTimeProvider\n\n\n\n\n#$ComputersDC = @('EVOWIN', 'ADPreview2019')\n\n#Get-TimeSetttings -ComputerName $ComputersDC | Out-HtmlView\n#get-TimeSetttings -ComputerName $ComputersDC | ft -a *"
  },
  {
    "path": "Public/Time/Get-TimeZoneAdvanced.ps1",
    "content": "function Get-TimeZoneAdvanced {\n    <#\n    .SYNOPSIS\n    Retrieves the time zone information for the specified computer(s).\n\n    .DESCRIPTION\n    This function retrieves the time zone information for the specified computer(s) including the computer name, time zone caption, and current local time.\n\n    .PARAMETER ComputerName\n    Specifies the name(s) of the computer(s) to retrieve the time zone information from. Default is the local computer.\n\n    .PARAMETER Credential\n    Specifies the credentials to use for accessing remote computers.\n\n    .EXAMPLE\n    Get-TimeZoneAdvanced\n    # Retrieves time zone information for the local computer.\n\n    .EXAMPLE\n    Get-TimeZoneAdvanced -ComputerName \"Server01\", \"Server02\" -Credential $cred\n    # Retrieves time zone information for Server01 and Server02 using specified credentials.\n\n    #>\n    param(\n        [string[]]$ComputerName = $Env:COMPUTERNAME,\n        [System.Management.Automation.PSCredential] $Credential = [System.Management.Automation.PSCredential]::Empty\n    )\n    foreach ($computer in $computerName) {\n        $TimeZone = Get-WmiObject -Class win32_timezone -ComputerName $computer -Credential $Credential\n        $LocalTime = Get-WmiObject -Class win32_localtime -ComputerName $computer -Credential $Credential\n        $Output = @{\n            'ComputerName' = $localTime.__SERVER;\n            'TimeZone'     = $timeZone.Caption;\n            'CurrentTime'  = (Get-Date -Day $localTime.Day -Month $localTime.Month);\n        }\n        $Object = New-Object -TypeName PSObject -Property $Output\n        Write-Output $Object\n    }\n}"
  },
  {
    "path": "Public/Time/Get-TimeZoneLegacy.ps1",
    "content": "function Get-TimeZoneLegacy () {\n    <#\n    .SYNOPSIS\n    Retrieves the standard name of the current time zone.\n\n    .DESCRIPTION\n    The Get-TimeZoneLegacy function retrieves the standard name of the current time zone using the legacy method.\n\n    .EXAMPLE\n    Get-TimeZoneLegacy\n    # Output: \"Pacific Standard Time\"\n\n    #>\n    return ([System.TimeZone]::CurrentTimeZone).StandardName\n}\n"
  },
  {
    "path": "Public/Time/Measure-Collection.ps1",
    "content": "﻿function Measure-Collection {\n    <#\n    .SYNOPSIS\n    Measures the execution time of a script block and outputs the duration.\n\n    .DESCRIPTION\n    This function measures the time taken to execute a given script block and outputs the duration in days, hours, minutes, seconds, milliseconds, and ticks.\n\n    .PARAMETER Name\n    Specifies the name of the measurement.\n\n    .PARAMETER ScriptBlock\n    Specifies the script block to be executed and measured.\n\n    .EXAMPLE\n    Measure-Collection -Name \"Example\" -ScriptBlock { Start-Sleep -Seconds 5 }\n    # Outputs: Name: Example, 0 days, 0 hours, 0 minutes, 5 seconds, 0 milliseconds, ticks 5000000\n\n    .EXAMPLE\n    Measure-Collection -Name \"Another Example\" -ScriptBlock { Get-Process }\n    # Outputs: Name: Another Example, 0 days, 0 hours, 0 minutes, X seconds, Y milliseconds, ticks Z\n\n    #>\n    param(\n        [string] $Name,\n        [ScriptBlock] $ScriptBlock\n    )\n    $Time = [System.Diagnostics.Stopwatch]::StartNew()\n    Invoke-Command -ScriptBlock $ScriptBlock\n    $Time.Stop()\n    \"Name: $Name, $($Time.Elapsed.Days) days, $($Time.Elapsed.Hours) hours, $($Time.Elapsed.Minutes) minutes, $($Time.Elapsed.Seconds) seconds, $($Time.Elapsed.Milliseconds) milliseconds, ticks $($Time.Elapsed.Ticks)\"\n}"
  },
  {
    "path": "Public/Time/Set-TimeSynchronization.ps1",
    "content": "function Set-TimeSynchronization {\n    <#\n    .SYNOPSIS\n    Configures time synchronization settings on the local machine.\n\n    .DESCRIPTION\n    This function sets up time synchronization on the local machine by configuring the time source, server type, NTP settings, and time correction parameters.\n\n    .PARAMETER TimeSource\n    Specifies the time source to synchronize with. Default is 'time.windows.com'.\n\n    .PARAMETER MaxPosPhaseCorrection\n    Specifies the maximum positive time correction in seconds. Default is 86400 seconds (24 hours).\n\n    .PARAMETER MaxnegPhaseCorrection\n    Specifies the maximum negative time correction in seconds. Default is 86400 seconds (24 hours).\n\n    .PARAMETER PollInterval\n    Specifies the poll interval in seconds. Default is 1800 seconds (30 minutes).\n\n    .EXAMPLE\n    Set-TimeSynchronization -TimeSource 'time.windows.com' -MaxPosPhaseCorrection 86400 -MaxnegPhaseCorrection 86400 -PollInterval 1800\n    Configures time synchronization using default settings.\n\n    .EXAMPLE\n    Set-TimeSynchronization -TimeSource 'pool.ntp.org' -MaxPosPhaseCorrection 43200 -MaxnegPhaseCorrection 43200 -PollInterval 3600\n    Configures time synchronization with a different time source and shorter time correction limits.\n\n    #>\n    param(\n        [string[]] $TimeSource = 'time.windows.com',\n        [int] $MaxPosPhaseCorrection = 86400,\n        [int] $MaxnegPhaseCorrection = 86400,\n        [int] $PollInterval = 1800\n    )\n    ## set external time source\n    ## set server type to NTP\n    Set-ItemProperty -Path HKLM:\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Parameters -Name Type -Value 'NTP'\n    Set-ItemProperty -Path HKLM:\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Config -Name AnnounceFlags -Value 5\n    ## Enable NTP server\n    Set-ItemProperty -Path HKLM:\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\TimeProviders\\NtpServer -Name Enabled -Value 1\n    ## Specify Time source\n    Set-ItemProperty -Path HKLM:\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Parameters -Name NtpServer -Value \"$TimeSource,0x1\"\n    ## Set poll interval in seconds - every 30 minutes\n    Set-ItemProperty -Path HKLM:\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\TimeProviders\\NtpClient -Name SpecialPollInterval -Value $PollInterval\n    ## set max +/- time corrections in seconds - 24 hours\n    Set-ItemProperty -Path HKLM:\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Config -Name MaxPosPhaseCorrection -Value $MaxPosPhaseCorrection\n    Set-ItemProperty -Path HKLM:\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Config -Name MaxnegPhaseCorrection -Value $MaxnegPhaseCorrection\n\n    Stop-Service -Name W32Time\n    Start-Service -Name W32Time\n}"
  },
  {
    "path": "Public/Time/Start-TimeLog.ps1",
    "content": "function Start-TimeLog {\n    <#\n    .SYNOPSIS\n    Starts a new stopwatch for logging time.\n\n    .DESCRIPTION\n    This function starts a new stopwatch that can be used for logging time durations.\n\n    .EXAMPLE\n    Start-TimeLog\n    Starts a new stopwatch for logging time.\n\n    #>\n    [CmdletBinding()]\n    param()\n    [System.Diagnostics.Stopwatch]::StartNew()\n}"
  },
  {
    "path": "Public/Time/Stop-TimeLog.ps1",
    "content": "function Stop-TimeLog {\n    <#\n    .SYNOPSIS\n    Stops the stopwatch and returns the elapsed time in a specified format.\n\n    .DESCRIPTION\n    The Stop-TimeLog function stops the provided stopwatch and returns the elapsed time in a specified format. The function can output the elapsed time as a single string or an array of days, hours, minutes, seconds, and milliseconds.\n\n    .PARAMETER Time\n    Specifies the stopwatch object to stop and retrieve the elapsed time from.\n\n    .PARAMETER Option\n    Specifies the format in which the elapsed time should be returned. Valid values are 'OneLiner' (default) or 'Array'.\n\n    .PARAMETER Continue\n    Indicates whether the stopwatch should continue running after retrieving the elapsed time.\n\n    .EXAMPLE\n    $stopwatch = [System.Diagnostics.Stopwatch]::StartNew()\n    # Perform some operations\n    Stop-TimeLog -Time $stopwatch\n    # Output: \"0 days, 0 hours, 0 minutes, 5 seconds, 123 milliseconds\"\n\n    .EXAMPLE\n    $stopwatch = [System.Diagnostics.Stopwatch]::StartNew()\n    # Perform some operations\n    Stop-TimeLog -Time $stopwatch -Option Array\n    # Output: [\"0 days\", \"0 hours\", \"0 minutes\", \"5 seconds\", \"123 milliseconds\"]\n    #>\n    [CmdletBinding()]\n    param (\n        [Parameter(ValueFromPipeline = $true)][System.Diagnostics.Stopwatch] $Time,\n        [ValidateSet('OneLiner', 'Array')][string] $Option = 'OneLiner',\n        [switch] $Continue\n    )\n    Begin {}\n    Process {\n        if ($Option -eq 'Array') {\n            $TimeToExecute = \"$($Time.Elapsed.Days) days\", \"$($Time.Elapsed.Hours) hours\", \"$($Time.Elapsed.Minutes) minutes\", \"$($Time.Elapsed.Seconds) seconds\", \"$($Time.Elapsed.Milliseconds) milliseconds\"\n        } else {\n            $TimeToExecute = \"$($Time.Elapsed.Days) days, $($Time.Elapsed.Hours) hours, $($Time.Elapsed.Minutes) minutes, $($Time.Elapsed.Seconds) seconds, $($Time.Elapsed.Milliseconds) milliseconds\"\n        }\n    }\n    End {\n        if (-not $Continue) {\n            $Time.Stop()\n        }\n        return $TimeToExecute\n    }\n}"
  },
  {
    "path": "Public/Vizualization/Show-Array.ps1",
    "content": "function Show-Array {\n    <#\n    .SYNOPSIS\n    Displays the elements of an ArrayList with optional type information.\n\n    .DESCRIPTION\n    The Show-Array function displays each element of the provided ArrayList. Optionally, it can also show the type of each element.\n\n    .PARAMETER List\n    Specifies the ArrayList containing the elements to display.\n\n    .PARAMETER WithType\n    Switch parameter to include type information along with each element.\n\n    .EXAMPLE\n    $myList = New-Object System.Collections.ArrayList\n    $myList.Add(\"Apple\")\n    $myList.Add(42)\n    Show-Array -List $myList\n    # Output:\n    # Apple\n    # 42\n\n    .EXAMPLE\n    $myList = New-Object System.Collections.ArrayList\n    $myList.Add(\"Banana\")\n    $myList.Add(3.14)\n    Show-Array -List $myList -WithType\n    # Output:\n    # Banana (Type: String)\n    # 3.14 (Type: Double)\n    #>\n    [CmdletBinding()]\n    param(\n        [System.Collections.ArrayList] $List,\n        [switch] $WithType\n    )\n    foreach ($Element in $List) {\n        $Type = Get-ObjectType -Object $Element\n        if ($WithType) {\n            Write-Output \"$Element (Type: $($Type.ObjectTypeName))\"\n        } else {\n            Write-Output $Element\n        }\n    }\n}"
  },
  {
    "path": "Public/Vizualization/Show-DataInVerbose.ps1",
    "content": "function Show-DataInVerbose {\n    <#\n    .SYNOPSIS\n    Displays the properties of an object in a verbose manner.\n\n    .DESCRIPTION\n    This function takes an object as input and displays each property of the object in a verbose format.\n\n    .PARAMETER Object\n    Specifies the object whose properties will be displayed.\n\n    .EXAMPLE\n    $data = [PSCustomObject]@{\n        Name = \"John Doe\"\n        Age = 30\n        City = \"New York\"\n    }\n    Show-DataInVerbose -Object $data\n\n    Description:\n    Displays the properties of the $data object in a verbose manner.\n\n    #>\n    [CmdletBinding()]\n    param(\n        [Object] $Object\n    )\n    foreach ($O in $Object) {\n        foreach ($E in $O.PSObject.Properties) {\n            $FieldName = $E.Name\n            $FieldValue = $E.Value\n            Write-Verbose \"Display-DataInVerbose - FieldName: $FieldName FieldValue: $FieldValue\"\n        }\n    }\n}\n"
  },
  {
    "path": "Public/Vizualization/Show-TableVisualization.ps1",
    "content": "function Show-TableVisualization {\n    <#\n    .SYNOPSIS\n    Displays a table visualization of the input object.\n\n    .DESCRIPTION\n    The Show-TableVisualization function displays a table visualization of the input object using Format-Table. It also provides additional information about the table data.\n\n    .PARAMETER Object\n    Specifies the input object to be visualized as a table.\n\n    .EXAMPLE\n    PS C:\\> Get-Process | Show-TableVisualization\n    Displays a table visualization of the processes retrieved by Get-Process.\n\n    .EXAMPLE\n    PS C:\\> $data = Get-Service | Where-Object { $_.Status -eq 'Running' } | Select-Object Name, DisplayName, Status\n    PS C:\\> $data | Show-TableVisualization\n    Displays a table visualization of the selected service data.\n\n    #>\n    [CmdletBinding()]\n    param (\n        [parameter(ValueFromPipelineByPropertyName, ValueFromPipeline)] $Object\n    )\n    if ($Color) { Write-Color \"[i] This is how table looks like in Format-Table\" -Color Yellow }\n    Write-Verbose '[i] This is how table looks like in Format-Table'\n    $Object | Format-Table -AutoSize\n    $Data = Format-PSTable $Object #-Verbose\n\n    Write-Verbose \"[i] Rows Count $($Data.Count) Column Count $($Data[0].Count)\"\n    $RowNr = 0\n    if ($Color) { Write-Color \"[i] Presenting table after conversion\" -Color Yellow }\n    foreach ($Row in $Data) {\n        $ColumnNr = 0\n        foreach ($Column in $Row) {\n            Write-Verbose \"Row: $RowNr Column: $ColumnNr Data: $Column\"\n            $ColumnNr++\n        }\n        $RowNr++\n    }\n}"
  },
  {
    "path": "Public/XML/Save-XML.ps1",
    "content": "function Save-XML {\n    <#\n    .SYNOPSIS\n    Saves an XML document to a specified file path.\n\n    .DESCRIPTION\n    This function saves an XML document to a specified file path using UTF-8 encoding without BOM.\n\n    .PARAMETER FilePath\n    Specifies the path where the XML document will be saved.\n\n    .PARAMETER xml\n    Specifies the XML document to be saved.\n\n    .EXAMPLE\n    Save-XML -FilePath \"C:\\Documents\\example.xml\" -xml $xmlDocument\n    Saves the XML document $xmlDocument to the file \"example.xml\" located in the \"C:\\Documents\" directory.\n\n    #>\n    param (\n        [string] $FilePath,\n        [System.Xml.XmlNode] $xml\n    )\n    $utf8WithoutBom = New-Object System.Text.UTF8Encoding($false)\n    $writer = New-Object System.IO.StreamWriter($FilePath, $false, $utf8WithoutBom)\n    $xml.Save( $writer )\n    $writer.Close()\n}"
  },
  {
    "path": "Public/XML/Set-XML.ps1",
    "content": "function Set-XML {\n    <#\n    .SYNOPSIS\n    Sets a specific node value in an XML file.\n\n    .DESCRIPTION\n    This function sets the value of a specified node in an XML file at the given path.\n\n    .PARAMETER FilePath\n    The path to the XML file.\n\n    .PARAMETER Paths\n    An array of paths to navigate through the XML structure.\n\n    .PARAMETER Node\n    The name of the node to set the value for.\n\n    .PARAMETER Value\n    The value to set for the specified node.\n\n    .EXAMPLE\n    Set-XML -FilePath \"C:\\example.xml\" -Paths \"Root\", \"Child\" -Node \"Value\" -Value \"NewValue\"\n    Sets the value of the \"Value\" node under \"Root/Child\" path in the XML file to \"NewValue\".\n\n    .NOTES\n    File encoding is assumed to be UTF-8.\n\n    #>\n    param (\n        [string] $FilePath,\n        [string[]]$Paths,\n        [string] $Node,\n        [string] $Value\n    )\n    [xml]$xmlDocument = Get-Content -Path $FilePath -Encoding UTF8\n    $XmlElement = $xmlDocument\n    foreach ($Path in $Paths) {\n        $XmlElement = $XmlElement.$Path\n    }\n    $XmlElement.$Node = $Value\n    $xmlDocument.Save($FilePath)\n    # Save-XML -FilePath $FilePath -xml $xmlDocument\n}"
  },
  {
    "path": "Readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://www.powershellgallery.com/packages/PSSharedGoods\"><img src=\"https://img.shields.io/powershellgallery/v/PSSharedGoods.svg\"></a>\n  <a href=\"https://www.powershellgallery.com/packages/PSSharedGoods\"><img src=\"https://img.shields.io/powershellgallery/v/PSSharedGoods.svg?label=powershell%20gallery%20preview&colorB=yellow&include_prereleases\"></a>\n  <a href=\"https://github.com/EvotecIT/PSSharedGoods\"><img src=\"https://img.shields.io/github/license/EvotecIT/PSSharedGoods.svg\"></a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.powershellgallery.com/packages/PSSharedGoods\"><img src=\"https://img.shields.io/powershellgallery/p/PSSharedGoods.svg\"></a>\n  <a href=\"https://github.com/EvotecIT/PSSharedGoods\"><img src=\"https://img.shields.io/github/languages/top/evotecit/PSSharedGoods.svg\"></a>\n  <a href=\"https://github.com/EvotecIT/PSSharedGoods\"><img src=\"https://img.shields.io/github/languages/code-size/evotecit/PSSharedGoods.svg\"></a>\n  <a href=\"https://www.powershellgallery.com/packages/PSSharedGoods\"><img src=\"https://img.shields.io/powershellgallery/dt/PSSharedGoods.svg\"></a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://twitter.com/PrzemyslawKlys\"><img src=\"https://img.shields.io/twitter/follow/PrzemyslawKlys.svg?label=Twitter%20%40PrzemyslawKlys&style=social\"></a>\n  <a href=\"https://evotec.xyz/hub\"><img src=\"https://img.shields.io/badge/Blog-evotec.xyz-2A6496.svg\"></a>\n  <a href=\"https://www.linkedin.com/in/pklys\"><img src=\"https://img.shields.io/badge/LinkedIn-pklys-0077B5.svg?logo=LinkedIn\"></a>\n</p>\n\n# PSSharedGoods - PowerShell Module\n\nPSSharedGoods is a little PowerShell Module that primary purpose is to be useful for multiple tasks, unrelated to each other. I've created this module as \"a glue\" between my other modules. I've noticed the more I build my modules, the more I use the same stuff and it became apparent I've two choices. Keep 3 or more versions of the same function across all my modules or export functions to separate module and bundle this module together. I chose the second option. This module currently is used by following modules\n\n- [PSWriteWord](https://evotec.xyz/hub/scripts/pswriteword-powershell-module/) - module to create Microsoft Word documents without Word being installed.\n- [PSWriteExcel](https://evotec.xyz/hub/scripts/pswriteexcel-powershell-module/) - cross-platform module to create Microsoft Excel documents without Excel being installed.\n- [PSWinDocumentation](https://evotec.xyz/hub/scripts/pswindocumentation-powershell-module/) - module to build documentation for Active Directory, Office 365 (Azure AD, Exchange Online), Exchange, Teams\n- [PSWinReporting](https://evotec.xyz/hub/scripts/pswinreporting-powershell-module/) - module to create reports and provide monitoring of Security Events\n- [PSAutomator](https://evotec.xyz/hub/scripts/psautomator-powershell-module/) - proof-of-concept module for onboarding, offboarding and business as usual\n- Many others - just review other GitHub projects of mine\n\nMore information can be found on a dedicated page for [PSSharedGoods](https://evotec.xyz/hub/scripts/pssharedgoods-powershell-module/) module."
  },
  {
    "path": "Tests/Compare-MultipleObjects.Tests.ps1",
    "content": "﻿$Object15 = [PSCustomObject] @{\n    \"Name\"        = \"Przemyslaw Klys\"\n    \"Age\"         = \"30\"\n    \"Test\"        = $null\n    \"EmptyArray\"  = @()\n    \"EmptyArray1\" = @()\n    \"Address\"     = @{\n        \"Street\"  = \"Kwiatowa\"\n        \"City\"    = \"Warszawa\"\n        \"Country\" = [ordered] @{\n            \"Name\" = \"Poland\"\n        }\n        List      = @(\n            [PSCustomObject] @{\n                \"Name\" = \"Adam Klys\"\n                \"Age\"  = \"32\"\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Justyna Klys\"\n                \"Age\"  = \"33\"\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Justyna Klys\"\n                \"Age\"  = 30\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Justyna Klys\"\n                \"Age\"  = $null\n            }\n        )\n    }\n    ListTest      = @(\n        [PSCustomObject] @{\n            \"Name\" = \"Sława Klys\"\n            \"Age\"  = \"33\"\n        }\n    )\n}\n$Object16 = [PSCustomObject] @{\n    \"Name\"       = \"Przemyslaw Klys\"\n    \"Age\"        = \"30\"\n    \"Test\"       = $null\n    \"EmptyArray\" = @()\n    \"Address\"    = @{\n        \"Street\"  = \"Kwiatowa\"\n        \"City\"    = \"Warszawa\"\n        \"Country\" = [ordered] @{\n            \"Name\" = \"Gruzja\"\n        }\n        List      = @(\n            [PSCustomObject] @{\n                \"Name\" = \"Adam Klys\"\n                \"Age\"  = \"32\"\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Pankracy Klys\"\n                \"Age\"  = \"33\"\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Justyna Klys\"\n                \"Age\"  = 30\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Justyna Klys\"\n                \"Age\"  = $null\n            }\n        )\n    }\n    ListTest     = @(\n        [PSCustomObject] @{\n            \"Name\" = \"Sława Klys\"\n            \"Age\"  = \"33\"\n        }\n    )\n}\n\n$PSDefaultParameterValues = @{\n    \"It:TestCases\" = @{\n        Object1 = $Object15\n        Object2 = $Object16\n    }\n}\n\nDescribe -Name 'Testing ConvertTo-FlatObject' {\n    It 'PSCustomObject Conversion' {\n        $result = Compare-MultipleObjects -Objects $Object1, $Object2\n        $result[0].Status | Should -Be $false\n        $result[1].Status | Should -Be $true\n        $result[2].Status | Should -Be $true\n        $result[2].\"Source\" | Should -Be 30\n        $result[2].\"1\" | Should -Be 30\n        $result[3].Status | Should -Be $true\n        $result[4].Status | Should -Be $true\n        $result[5].Status | Should -Be $false\n        $result[6].Status | Should -Be $null\n        $result[7].Status | Should -Be $null\n        $result.count | Should -Be 8\n    }\n    It 'OrderedObject Conversion' {\n        $result = Compare-MultipleObjects -Objects $Object1, $Object2 -FlattenObject\n        $result[0].Status | Should -Be $false\n        $result[1].Status | Should -Be $true\n        $result[2].Status | Should -Be $true\n        $result[2].\"Source\" | Should -Be 30\n        $result[2].\"1\" | Should -Be 30\n        $result[3].Status | Should -Be $true\n        $result[4].Status | Should -Be $true\n        $result[5].Status | Should -Be $false\n        $result[6].Status | Should -Be $false\n        $result[8].Status | Should -Be $true\n        $result[9].Status | Should -Be $true\n        $result[10].Status | Should -Be $false\n        $result[11].Status | Should -Be $true\n        $result[12].Status | Should -Be $true\n        $result[13].Status | Should -Be $true\n        $result[14].Status | Should -Be $true\n        $result[15].Status | Should -Be $true\n        $result[16].Status | Should -Be $true\n        $result[17].Name | Should -be \"ListTest.1.Name\"\n        $result[17].Status | Should -Be $true\n        $result[18].Status | Should -Be $true\n        $result[18].Name | Should -be \"ListTest.1.Age\"\n        $result.count | Should -Be 19\n    }\n}"
  },
  {
    "path": "Tests/Convert-Identity.Tests.ps1",
    "content": "﻿Describe -Name 'Testing Convert-Identity' {\n    It 'Easy Tests' {\n        $Identity = @(\n            'S-1-5-4'\n            'S-1-5-4'\n            'S-1-5-11'\n            'S-1-5-32-549'\n            'S-1-5-32-550'\n            'S-1-5-32-548'\n            'S-1-5-64-10'\n            'S-1-5-64-14'\n            'S-1-5-64-21'\n            'S-1-5-18'\n            'S-1-5-19'\n            'S-1-5-32-544'\n            'S-1-5-20-20-10-51' # Wrong SID\n            'S-1-5-21-853615985-2870445339-3163598659-512'\n            'S-1-5-21-3661168273-3802070955-2987026695-512'\n            'S-1-5-21-1928204107-2710010574-1926425344-512'\n            'CN=Test Test 2,OU=Users,OU=Production,DC=ad,DC=evotec,DC=pl'\n            'Test Local Group'\n            'przemyslaw.klys@evotec.pl'\n            'test2'\n            'NT AUTHORITY\\NETWORK'\n            'NT AUTHORITY\\SYSTEM'\n            'S-1-5-21-853615985-2870445339-3163598659-519'\n            'TEST\\some'\n            'EVOTECPL\\Domain Admins'\n            'NT AUTHORITY\\INTERACTIVE'\n            'INTERACTIVE'\n            'EVOTEC\\Domain Admins'\n            'EVOTECPL\\Domain Admins'\n            'Test\\Domain Admins'\n            'CN=S-1-5-21-1928204107-2710010574-1926425344-512,CN=ForeignSecurityPrincipals,DC=ad,DC=evotec,DC=xyz' # Valid\n            'CN=S-1-5-21-1928204107-2710010574-512,CN=ForeignSecurityPrincipals,DC=ad,DC=evotec,DC=xyz' # not valid\n            'CN=S-1-5-21-1928204107-2710010574-1926425344-512,CN=ForeignSecurityPrincipals,DC=ad,DC=evotec,DC=xyz' # cached\n        )\n        $TestOutput = Convert-Identity -Identity $Identity -Verbose\n        $TestOutput.Count | Should -Be $Identity.Count\n    }\n    It 'Easy Tests From Pipeline' {\n        $Identity = @(\n            'S-1-5-4'\n            'S-1-5-4'\n            'S-1-5-11'\n            'S-1-5-32-549'\n            'S-1-5-32-550'\n            'S-1-5-32-548'\n            'S-1-5-64-10'\n            'S-1-5-64-14'\n            'S-1-5-64-21'\n            'S-1-5-18'\n            'S-1-5-19'\n            'S-1-5-32-544'\n            'S-1-5-20-20-10-51' # Wrong SID\n            'S-1-5-21-853615985-2870445339-3163598659-512'\n            'S-1-5-21-3661168273-3802070955-2987026695-512'\n            'S-1-5-21-1928204107-2710010574-1926425344-512'\n            'CN=Test Test 2,OU=Users,OU=Production,DC=ad,DC=evotec,DC=pl'\n            'Test Local Group'\n            'przemyslaw.klys@evotec.pl'\n            'test2'\n            'NT AUTHORITY\\NETWORK'\n            'NT AUTHORITY\\SYSTEM'\n            'S-1-5-21-853615985-2870445339-3163598659-519'\n            'TEST\\some'\n            'EVOTECPL\\Domain Admins'\n            'NT AUTHORITY\\INTERACTIVE'\n            'INTERACTIVE'\n            'EVOTEC\\Domain Admins'\n            'EVOTECPL\\Domain Admins'\n            'Test\\Domain Admins'\n            'CN=S-1-5-21-1928204107-2710010574-1926425344-512,CN=ForeignSecurityPrincipals,DC=ad,DC=evotec,DC=xyz' # Valid\n            'CN=S-1-5-21-1928204107-2710010574-512,CN=ForeignSecurityPrincipals,DC=ad,DC=evotec,DC=xyz' # not valid\n            'CN=S-1-5-21-1928204107-2710010574-1926425344-512,CN=ForeignSecurityPrincipals,DC=ad,DC=evotec,DC=xyz' # cached\n        )\n        $TestOutput = $Identity | Convert-Identity -Verbose\n        $TestOutput.Count | Should -Be $Identity.Count\n    }\n}\n"
  },
  {
    "path": "Tests/ConvertFrom-DistinguishedName.Tests.ps1",
    "content": "﻿Describe -Name 'Testing ConvertFrom-DistinguishedName' {\n    It 'ToOrganizationalUnit Conversion' {\n        $DistinguishedName = @(\n            'CN=Przemyslaw Klys,OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=ITR03_AD Admins,OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=SADM Testing 2,OU=Special,OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=Test My\\, User,OU=US,OU=ITR01,DC=ad,DC=evotec,DC=xyz'\n            'CN=Weird Name\\, with $\\,.,OU=SE2,OU=SE,OU=ITR01,DC=ad,DC=evotec,DC=xyz'\n            'CN=Administrator,CN=Users,DC=ad,DC=evotec,DC=pl'\n            'CN=Builtin,DC=ad,DC=evotec,DC=pl'\n            'CN=Certificate Service DCOM Access,CN=Builtin,DC=ad,DC=evotec,DC=pl'\n            \"CN=Four-PRINT-CLAY-SHIP-0004,CN=Four-PRINT,OU=FourServers,DC=FourAnyway,DC=com\"\n        )\n        $Output = ConvertFrom-DistinguishedName -ToOrganizationalUnit -DistinguishedName $DistinguishedName\n        $Output | Should -Be @(\n            'OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Special,OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=US,OU=ITR01,DC=ad,DC=evotec,DC=xyz'\n            'OU=SE2,OU=SE,OU=ITR01,DC=ad,DC=evotec,DC=xyz'\n            'CN=Users,DC=ad,DC=evotec,DC=pl'\n            'DC=ad,DC=evotec,DC=pl'\n            'CN=Builtin,DC=ad,DC=evotec,DC=pl'\n            \"OU=FourServers,DC=FourAnyway,DC=com\"\n        )\n    }\n    It 'ToOrganizationalUnit Conversion - Pipeline' {\n        $DistinguishedName = @(\n            'CN=Przemyslaw Klys,OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=ITR03_AD Admins,OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=SADM Testing 2,OU=Special,OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            \"CN=Four-PRINT-CLAY-SHIP-0004,CN=Four-PRINT,OU=FourServers,DC=FourAnyway,DC=com\"\n        )\n        $Output = $DistinguishedName | ConvertFrom-DistinguishedName -ToOrganizationalUnit\n        $Output | Should -Be @(\n            'OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Special,OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            \"OU=FourServers,DC=FourAnyway,DC=com\"\n        )\n    }\n    It 'ToDC Conversion' {\n        $DistinguishedName = @(\n            'CN=Przemyslaw Klys,OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=ITR03_AD Admins,OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=SADM Testing 2,OU=Special,OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            \"CN=Four-PRINT-CLAY-SHIP-0004,CN=Four-PRINT,OU=FourServers,DC=FourAnyway,DC=com\"\n        )\n        $Output = ConvertFrom-DistinguishedName -ToDC -DistinguishedName $DistinguishedName\n        $Output | Should -Be @(\n            'DC=ad,DC=evotec,DC=xyz'\n            'DC=ad,DC=evotec,DC=xyz'\n            'DC=ad,DC=evotec,DC=xyz'\n            'DC=FourAnyway,DC=com'\n        )\n    }\n    It 'ToDC Conversion - Pipeline' {\n        $DistinguishedName = @(\n            'CN=Przemyslaw Klys,OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=ITR03_AD Admins,OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=SADM Testing 2,OU=Special,OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            \"CN=Four-PRINT-CLAY-SHIP-0004,CN=Four-PRINT,OU=FourServers,DC=FourAnyway,DC=com\"\n        )\n        $Output = $DistinguishedName | ConvertFrom-DistinguishedName -ToDC\n        $Output | Should -Be @(\n            'DC=ad,DC=evotec,DC=xyz'\n            'DC=ad,DC=evotec,DC=xyz'\n            'DC=ad,DC=evotec,DC=xyz'\n            'DC=FourAnyway,DC=com'\n        )\n    }\n    It 'ToDomainCN Conversion' {\n        $DistinguishedName = @(\n            'CN=Przemyslaw Klys,OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=ITR03_AD Admins,OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=SADM Testing 2,OU=Special,OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            \"CN=Four-PRINT-CLAY-SHIP-0004,CN=Four-PRINT,OU=FourServers,DC=FourAnyway,DC=com\"\n        )\n        $Output = ConvertFrom-DistinguishedName -ToDomainCN -DistinguishedName $DistinguishedName\n        $Output | Should -Be @(\n            'ad.evotec.xyz'\n            'ad.evotec.xyz'\n            'ad.evotec.xyz'\n            'FourAnyway.com'\n        )\n    }\n    It 'ToDomainCN Conversion - Pipeline' {\n        $DistinguishedName = @(\n            'CN=Przemyslaw Klys,OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=ITR03_AD Admins,OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=SADM Testing 2,OU=Special,OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz'\n        )\n        $Output = $DistinguishedName | ConvertFrom-DistinguishedName -ToDomainCN\n        $Output | Should -Be @(\n            'ad.evotec.xyz'\n            'ad.evotec.xyz'\n            'ad.evotec.xyz'\n        )\n    }\n    It 'ToMultipleOU Conversion - Pipeline' {\n        $DistinguishedName = @(\n            'OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Special,OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            \"CN=Four-PRINT-CLAY-SHIP-0004,CN=Four-PRINT,OU=FourServers,DC=FourAnyway,DC=com\"\n        )\n        $Output = $DistinguishedName | ConvertFrom-DistinguishedName -ToMultipleOrganizationalUnit\n        $Output | Should -Be @(\n            'OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=FourServers,DC=FourAnyway,DC=com'\n        )\n    }\n    It 'ToMultipleOU Conversion with Parent - Pipeline' {\n        $DistinguishedName = @(\n            'OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Special,OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            \"CN=Four-PRINT-CLAY-SHIP-0004,CN=Four-PRINT,OU=FourServers,DC=FourAnyway,DC=com\"\n        )\n        $Output = $DistinguishedName | ConvertFrom-DistinguishedName -ToMultipleOrganizationalUnit -IncludeParent\n        $Output | Should -Be @(\n            'OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Special,OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Production,DC=ad,DC=evotec,DC=xyz'\n            \"OU=FourServers,DC=FourAnyway,DC=com\"\n        )\n    }\n    It 'ToLastName Conversion' {\n        $DistinguishedName = @(\n            'CN=Windows Authorization Access Group,CN=Builtin,DC=ad,DC=evotec,DC=xyz'\n            'CN=Mmm,DC=elo,CN=nee,DC=RootDNSServers,CN=MicrosoftDNS,CN=System,DC=ad,DC=evotec,DC=xyz'\n            'CN=e6d5fd00-385d-4e65-b02d-9da3493ed850,CN=Operations,CN=DomainUpdates,CN=System,DC=ad,DC=evotec,DC=xyz'\n            'OU=Domain Controllers,DC=ad,DC=evotec,DC=pl'\n            'OU=Microsoft Exchange Security Groups,DC=ad,DC=evotec,DC=xyz'\n            'CN=Przemyslaw Klys,OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=ITR03_AD Admins,OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=SADM Testing 2,OU=Special,OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz'\n        )\n\n        $Output = ConvertFrom-DistinguishedName -DistinguishedName $DistinguishedName -ToLastName\n        $Output | Should -Be @(\n            'Windows Authorization Access Group'\n            'Mmm'\n            'e6d5fd00-385d-4e65-b02d-9da3493ed850'\n            'Domain Controllers'\n            'Microsoft Exchange Security Groups'\n            'Przemyslaw Klys'\n            'ITR03_AD Admins'\n            'SADM Testing 2'\n        )\n    }\n    It 'ToLastName Conversion -Pipeline' {\n        $DistinguishedName = @(\n            'CN=Windows Authorization Access Group,CN=Builtin,DC=ad,DC=evotec,DC=xyz'\n            'CN=Mmm,DC=elo,CN=nee,DC=RootDNSServers,CN=MicrosoftDNS,CN=System,DC=ad,DC=evotec,DC=xyz'\n            'CN=e6d5fd00-385d-4e65-b02d-9da3493ed850,CN=Operations,CN=DomainUpdates,CN=System,DC=ad,DC=evotec,DC=xyz'\n            'OU=Domain Controllers,DC=ad,DC=evotec,DC=pl'\n            'OU=Microsoft Exchange Security Groups,DC=ad,DC=evotec,DC=xyz'\n            'CN=Przemyslaw Klys,OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=ITR03_AD Admins,OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=SADM Testing 2,OU=Special,OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz'\n        )\n\n        $Output = $DistinguishedName | ConvertFrom-DistinguishedName -ToLastName\n        $Output | Should -Be @(\n            'Windows Authorization Access Group'\n            'Mmm'\n            'e6d5fd00-385d-4e65-b02d-9da3493ed850'\n            'Domain Controllers'\n            'Microsoft Exchange Security Groups'\n            'Przemyslaw Klys'\n            'ITR03_AD Admins'\n            'SADM Testing 2'\n        )\n    }\n\n    It 'ToContainer Conversion' {\n        $DistinguishedName = @(\n            'CN=Users,DC=ad,DC=evotec,DC=xyz'\n            'CN=Group Policy Creator Owners,CN=Users,DC=ad,DC=evotec,DC=xyz'\n            'CN=Admin,OU=Servers,DC=ad,DC=evotec,DC=xyz'\n            'OU=Servers,DC=ad,DC=evotec,DC=xyz'\n            'CN=Windows Authorization Access Group,CN=Builtin,DC=ad,DC=evotec,DC=xyz'\n            'CN=e6d5fd00-385d-4e65-b02d-9da3493ed850,CN=Operations,CN=DomainUpdates,CN=System,DC=ad,DC=evotec,DC=xyz'\n            'OU=Domain Controllers,DC=ad,DC=evotec,DC=pl'\n            'OU=Microsoft Exchange Security Groups,DC=ad,DC=evotec,DC=xyz'\n            'CN=Przemyslaw Klys,OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=ITR03_AD Admins,OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=SADM Testing 2,OU=Special,OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz'\n        )\n\n        $Output = $DistinguishedName | ConvertFrom-DistinguishedName -ToContainer\n        $Output | Should -Be @(\n            'CN=Users,DC=ad,DC=evotec,DC=xyz',\n            'CN=Users,DC=ad,DC=evotec,DC=xyz',\n            'OU=Servers,DC=ad,DC=evotec,DC=xyz',\n            'OU=Servers,DC=ad,DC=evotec,DC=xyz',\n            'CN=Builtin,DC=ad,DC=evotec,DC=xyz',\n            'CN=Operations,CN=DomainUpdates,CN=System,DC=ad,DC=evotec,DC=xyz',\n            'OU=Domain Controllers,DC=ad,DC=evotec,DC=pl',\n            'OU=Microsoft Exchange Security Groups,DC=ad,DC=evotec,DC=xyz',\n            'OU=Users,OU=Production,DC=ad,DC=evotec,DC=xyz',\n            'OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Special,OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz'\n        )\n    }\n}"
  },
  {
    "path": "Tests/ConvertFrom-ObjectToString.Tests.ps1",
    "content": "#\n# These tests are made for visual inspection of the output of ConvertFrom-ObjectToString\n# Inside a pipeline they are useful to see that their running\nDescribe \"ConvertFrom-ObjectToString\" {\n    It \"Converts an object to hashtable\" {\n        $Object = [PSCustomObject]@{\n            Nothing  = $null\n            List     = @('a', $null, 'c')\n            'List 2' = @(1, 2, 3)\n            Hash     = @{ String = \"content\"; Int = 1 }\n            Name     = 'John'\n            Age      = 30\n            Float    = 1.234\n            Now      = Get-Date -Year 2020 -Month 1 -Day 1 -Hour 12 -Minute 34 -Second 56\n        }\n        $Object | ConvertFrom-ObjectToString -OutputType Hashtable -InformationVariable informationVariable\n        $CatchOutput = $informationVariable -join \"`r`n\"\n        $TestOutput = [scriptblock]::Create($CatchOutput).Invoke()\n        $TestOutput.Nothing | Should -BeExactly $Object.Nothing\n        $TestOutput.List | Should -BeExactly $Object.List\n        $TestOutput.'List 2' | Should -BeExactly $Object.'List 2'\n        $TestOutput.Hash.String | Should -BeExactly $Object.Hash.String\n        $TestOutput.Hash.Int | Should -BeExactly $Object.Hash.Int\n        $TestOutput.Name | Should -BeExactly $Object.Name\n        $TestOutput.Age | Should -BeExactly $Object.Age\n        $TestOutput.Float | Should -BeExactly $Object.Float\n\n        $Expectation = @'\n\n@{\n    Nothing = $null\n    List = @('a', $null, 'c')\n    'List 2' = @(1, 2, 3)\n    Hash = @{String = 'content'; Int = 1}\n    Name = 'John'\n    Age = 30\n    Float = 1.234\n    Now = '2020-01-01 12:34:56'\n}\n'@\n        $Expectation = $Expectation -split \"`r`n\"\n        for ($i = 1; $i -lt $Expectation.Length; $i++) {\n            $Expectation[$i] | Should -BeExactly $informationVariable[$i].ToString()\n        }\n\n    }\n    It \"Converts an object as ordered hashtable using excludes\" {\n        $Object = [PSCustomObject]@{\n            Nothing  = $null\n            List     = @('a', $null, 'c', 1)\n            'List 2' = @(1, 2, 3)\n            Hash     = @{ String = \"content\"; Int = 1 }\n            Name     = 'John'\n            Age      = 30\n            Float    = 1.234\n        }\n        $Object | ConvertFrom-ObjectToString -OutputType Ordered -ExcludeProperties 'Nothing', 'List 2' -InformationVariable informationVariable\n        $CatchOutput = $informationVariable -join \"`r`n\"\n        $TestOutput = [scriptblock]::Create($CatchOutput).Invoke()\n        $TestOutput.List | Should -BeExactly $Object.List\n        $TestOutput.Hash.String | Should -BeExactly $Object.Hash.String\n        $TestOutput.Hash.Int | Should -BeExactly $Object.Hash.Int\n        $TestOutput.Name | Should -BeExactly $Object.Name\n        $TestOutput.Age | Should -BeExactly $Object.Age\n        $TestOutput.Float | Should -BeExactly $Object.Float\n        $TestOutput.Keys -notcontains 'List 2' | Should -BeExactly $true\n        $TestOutput.Keys -notcontains 'Nothing' | Should -BeExactly $true\n\n        $Expectation = @'\n\n[Ordered] @{\n    List = @('a', $null, 'c', 1)\n    Hash = @{String = 'content'; Int = 1}\n    Name = 'John'\n    Age = 30\n    Float = 1.234\n}\n'@\n        $Expectation = $Expectation -split \"`r`n\"\n        for ($i = 1; $i -lt $Expectation.Length; $i++) {\n            $Expectation[$i] | Should -BeExactly $informationVariable[$i].ToString()\n        }\n\n    }\n    It \"Converts a hashtable number as string, quote all property names\" {\n        $Object = [ordered] @{\n            Nothing  = $null\n            List     = @('a', $null, 'c')\n            'List 2' = @(1, 2, 3)\n            Hash     = @{ String = \"content\"; Int = 1 }\n            Name     = [string[]]::new(4)\n            Age      = 30\n        }\n        $object.Name[0] = 'John'\n        $object.Name[1] = 'Paul'\n        $object.Name[2] = 'George'\n        $object.Name[3] = 'Ringo'\n        $Object | ConvertFrom-ObjectToString -OutputType Hashtable -NumbersAsString -QuotePropertyNames -InformationVariable informationVariable\n        $CatchOutput = $informationVariable -join \"`r`n\"\n        $TestOutput = [scriptblock]::Create($CatchOutput).Invoke()\n        $TestOutput.List | Should -BeExactly $Object.List\n        $TestOutput.Hash.String | Should -BeExactly $Object.Hash.String\n        $TestOutput.Hash.Int | Should -BeExactly $Object.Hash.Int\n        $TestOutput.Name | Should -BeExactly $Object.Name\n        $TestOutput.Age | Should -BeExactly $Object.Age\n        $TestOutput.Float | Should -BeExactly $Object.Float\n\n        $Expectation = @'\n\n@{\n    'Nothing' = $null\n    'List' = @('a', $null, 'c')\n    'List 2' = @('1', '2', '3')\n    'Hash' = @{'String' = 'content'; 'Int' = '1'}\n    'Name' = @('John', 'Paul', 'George', 'Ringo')\n    'Age' = '30'\n}\n'@\n        $Expectation = $Expectation -split \"`r`n\"\n        for ($i = 1; $i -lt $Expectation.Length; $i++) {\n            $Expectation[$i] | Should -BeExactly $informationVariable[$i].ToString()\n        }\n    }\n}\n"
  },
  {
    "path": "Tests/ConvertFrom-Sid.Tests.ps1",
    "content": "﻿Describe -Name 'Testing ConvertFrom-SID' {\n    It 'OnlyWellKnownAdministrative - Given 2 sids, only 1 should return' {\n        $SIDs = @(\n            'S-1-5-18'\n            'S-1-5-19'\n        )\n        $OutputPS = ConvertFrom-SID -SID $SIDs -OnlyWellKnownAdministrative\n        $ExpectedResult = [PSCustomObject] @{\n            Name  = 'NT AUTHORITY\\SYSTEM';\n            SID   = 'S-1-5-18';\n            Type  = 'WellKnownAdministrative';\n            Error = ''\n        }\n        $OutputPS.Error | Should -be $ExpectedResult.Error\n        $OutputPS.SID | Should -be $ExpectedResult.SID\n        $OutputPS.Type | Should -be $ExpectedResult.Type\n        $OutputPS.Name | Should -be $ExpectedResult.Name\n    }\n}\nDescribe -Name 'Testing ConvertFrom-SID' {\n    It 'OnlyWellKnown - Given 3 sids, only 2 should return' {\n        $SIDs = @(\n            'S-1-5-18'\n            'S-1-5-19'\n            'S-1-5-20-20-10-51'\n        )\n        $OutputPS = ConvertFrom-SID -SID $SIDs -OnlyWellKnown\n        $ExpectedResult0 = [PSCustomObject] @{\n            Name  = 'NT AUTHORITY\\SYSTEM';\n            SID   = 'S-1-5-18';\n            Type  = 'WellKnownAdministrative';\n            Error = ''\n        }\n        $ExpectedResult1 = [PSCustomObject] @{\n            Name  = 'NT AUTHORITY\\LOCAL SERVICE'\n            SID   = 'S-1-5-19'\n            Type  = 'WellKnownGroup'\n            Error = ''\n        }\n        $OutputPS[0].Error | Should -be $ExpectedResult0.Error\n        $OutputPS[0].SID | Should -be $ExpectedResult0.SID\n        $OutputPS[0].Type | Should -be $ExpectedResult0.Type\n        $OutputPS[0].Name | Should -be $ExpectedResult0.Name\n        $OutputPS[1].Error | Should -be $ExpectedResult1.Error\n        $OutputPS[1].SID | Should -be $ExpectedResult1.SID\n        $OutputPS[1].Type | Should -be $ExpectedResult1.Type\n        $OutputPS[1].Name | Should -be $ExpectedResult1.Name\n    }\n}\nDescribe -Name 'Testing ConvertFrom-SID - return as NotAdministrative' {\n    It 'Given 3 sids, 3 should return' {\n        $SIDs = @(\n            'S-1-5-18'\n            'S-1-5-19'\n            'S-1-5-20-20-10-51'\n        )\n        $OutputPS = ConvertFrom-SID -SID $SIDs -DoNotResolve\n        $ExpectedResult0 = [PSCustomObject] @{\n            Name  = 'NT AUTHORITY\\SYSTEM';\n            SID   = 'S-1-5-18';\n            Type  = 'WellKnownAdministrative';\n            Error = ''\n        }\n        $ExpectedResult1 = [PSCustomObject] @{\n            Name  = 'NT AUTHORITY\\LOCAL SERVICE'\n            SID   = 'S-1-5-19'\n            Type  = 'WellKnownGroup'\n            Error = ''\n        }\n        # Do not resolve means return as 'NotAdministrative'\n        $ExpectedResult2 = [PSCustomObject] @{\n            Name  = 'S-1-5-20-20-10-51'\n            SID   = 'S-1-5-20-20-10-51'\n            Type  = 'NotAdministrative'\n            Error = ''\n        }\n        $OutputPS[0].Error | Should -be $ExpectedResult0.Error\n        $OutputPS[0].SID | Should -be $ExpectedResult0.SID\n        $OutputPS[0].Type | Should -be $ExpectedResult0.Type\n        $OutputPS[0].Name | Should -be $ExpectedResult0.Name\n        $OutputPS[1].Error | Should -be $ExpectedResult1.Error\n        $OutputPS[1].SID | Should -be $ExpectedResult1.SID\n        $OutputPS[1].Type | Should -be $ExpectedResult1.Type\n        $OutputPS[1].Name | Should -be $ExpectedResult1.Name\n        $OutputPS[2].Error | Should -be $ExpectedResult2.Error\n        $OutputPS[2].SID | Should -be $ExpectedResult2.SID\n        $OutputPS[2].Type | Should -be $ExpectedResult2.Type\n        $OutputPS[2].Name | Should -be $ExpectedResult2.Name\n    }\n}\n\nDescribe -Name 'Testing ConvertFrom-SID' {\n    It 'Given 3 sids, 3 should return - Try Resolve and Fail' {\n        $SIDs = @(\n            'S-1-5-18'\n            'S-1-5-19'\n            'S-1-5-20-20-10-51'\n        )\n        $OutputPS = ConvertFrom-SID -SID $SIDs\n        $ExpectedResult0 = [PSCustomObject] @{\n            Name  = 'NT AUTHORITY\\SYSTEM';\n            SID   = 'S-1-5-18';\n            Type  = 'WellKnownAdministrative';\n            Error = ''\n        }\n        $ExpectedResult1 = [PSCustomObject] @{\n            Name  = 'NT AUTHORITY\\LOCAL SERVICE'\n            SID   = 'S-1-5-19'\n            Type  = 'WellKnownGroup'\n            Error = ''\n        }\n        # Try to resolve and fail\n        $ExpectedResult2 = [PSCustomObject] @{\n            Name = 'S-1-5-20-20-10-51'\n            SID  = 'S-1-5-20-20-10-51'\n            Type = 'Unknown'\n        }\n        $OutputPS[0].Error | Should -be $ExpectedResult0.Error\n        $OutputPS[0].SID | Should -be $ExpectedResult0.SID\n        $OutputPS[0].Type | Should -be $ExpectedResult0.Type\n        $OutputPS[0].Name | Should -be $ExpectedResult0.Name\n        $OutputPS[1].Error | Should -be $ExpectedResult1.Error\n        $OutputPS[1].SID | Should -be $ExpectedResult1.SID\n        $OutputPS[1].Type | Should -be $ExpectedResult1.Type\n        $OutputPS[1].Name | Should -be $ExpectedResult1.Name\n        $OutputPS[2].Error | Should -not -BeNullOrEmpty\n        $OutputPS[2].SID | Should -be $ExpectedResult2.SID\n        $OutputPS[2].Type | Should -be $ExpectedResult2.Type\n        $OutputPS[2].Name | Should -be $ExpectedResult2.Name\n    }\n}\nDescribe -Name 'Testing ConvertFrom-SID' {\n    It 'Given 3 sids, 3 should return - Return Administrative' {\n        $SIDs = @(\n            'S-1-5-18'\n            'S-1-5-19'\n            'S-1-5-20-20-10-51'\n            'S-1-5-21-853615985-2870445339-3163598659-512'\n            'S-1-5-21-3661168273-3802070955-2987026695-512'\n            'S-1-5-21-1928204107-2710010574-1926425344-512'\n        )\n        $OutputPS = ConvertFrom-SID -SID $SIDs\n        $ExpectedResult0 = [PSCustomObject] @{\n            Name  = 'NT AUTHORITY\\SYSTEM';\n            SID   = 'S-1-5-18';\n            Type  = 'WellKnownAdministrative';\n            Error = ''\n        }\n        $ExpectedResult1 = [PSCustomObject] @{\n            Name  = 'NT AUTHORITY\\LOCAL SERVICE'\n            SID   = 'S-1-5-19'\n            Type  = 'WellKnownGroup'\n            Error = ''\n        }\n        # Try to resolve and fail\n        $ExpectedResult2 = [PSCustomObject] @{\n            Name = 'S-1-5-20-20-10-51'\n            SID  = 'S-1-5-20-20-10-51'\n            Type = 'Unknown'\n        }\n        # locally from AD it will be Administrative, on CI - Unknown\n        $ExpectedDomainAdmins = 'Administrative', 'Unknown'\n        $OutputPS[0].Error | Should -be $ExpectedResult0.Error\n        $OutputPS[0].SID | Should -be $ExpectedResult0.SID\n        $OutputPS[0].Type | Should -be $ExpectedResult0.Type\n        $OutputPS[0].Name | Should -be $ExpectedResult0.Name\n        $OutputPS[1].Error | Should -be $ExpectedResult1.Error\n        $OutputPS[1].SID | Should -be $ExpectedResult1.SID\n        $OutputPS[1].Type | Should -be $ExpectedResult1.Type\n        $OutputPS[1].Name | Should -be $ExpectedResult1.Name\n        $OutputPS[2].Error | Should -not -BeNullOrEmpty\n        $OutputPS[2].SID | Should -be $ExpectedResult2.SID\n        $OutputPS[2].Type | Should -be $ExpectedResult2.Type\n        $OutputPS[2].Name | Should -be $ExpectedResult2.Name\n\n        $OutputPS[3].Type | Should -BeIn $ExpectedDomainAdmins\n        $OutputPS[4].Type | Should -BeIn $ExpectedDomainAdmins\n        $OutputPS[5].Type | Should -BeIn $ExpectedDomainAdmins\n    }\n}\n\n"
  },
  {
    "path": "Tests/ConvertTo-DistinguishedName.Tests.ps1",
    "content": "﻿Describe -Name 'Testing ConvertTo-DistinguishedName' {\n    It 'ToObject Conversion - Pipeline' {\n        $CanonicalObjects = @(\n            'ad.evotec.xyz/Production/Groups/Security/ITR03_AD Admins'\n            'ad.evotec.xyz/Production/Accounts/Special/SADM Testing 2'\n        )\n        $Output = $CanonicalObjects | ConvertTo-DistinguishedName -ToObject\n        $Output | Should -be @(\n            'CN=ITR03_AD Admins,OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=SADM Testing 2,OU=Special,OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz'\n        )\n    }\n    It 'ToObject Conversion' {\n        $CanonicalObjects = @(\n            'ad.evotec.xyz/Production/Groups/Security/ITR03_AD Admins'\n            'ad.evotec.xyz/Production/Accounts/Special/SADM Testing 2'\n        )\n        $Output = ConvertTo-DistinguishedName -ToObject -CanonicalName $CanonicalObjects\n        $Output | Should -be @(\n            'CN=ITR03_AD Admins,OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'CN=SADM Testing 2,OU=Special,OU=Accounts,OU=Production,DC=ad,DC=evotec,DC=xyz'\n        )\n    }\n    It 'ToOU Conversion - Pipeline' {\n        $CanonicalOU = @(\n            'ad.evotec.xyz/Production/Groups/Security/NetworkAdministration'\n            'ad.evotec.xyz/Production'\n        )\n        $Output = $CanonicalOU | ConvertTo-DistinguishedName -ToOU\n        $Output | Should -be @(\n            'OU=NetworkAdministration,OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Production,DC=ad,DC=evotec,DC=xyz'\n        )\n    }\n    It 'ToOU Conversion' {\n        $CanonicalOU = @(\n            'ad.evotec.xyz/Production/Groups/Security/NetworkAdministration'\n            'ad.evotec.xyz/Production'\n        )\n        $Output = ConvertTo-DistinguishedName -ToOU -CanonicalName $CanonicalOU\n        $Output | Should -be @(\n            'OU=NetworkAdministration,OU=Security,OU=Groups,OU=Production,DC=ad,DC=evotec,DC=xyz'\n            'OU=Production,DC=ad,DC=evotec,DC=xyz'\n        )\n    }\n    It 'ToDomain Conversion' {\n        $CanonicalDomain = @(\n            'ad.evotec.xyz/Production/Groups/Security/ITR03_AD Admins'\n            'ad.evotec.pl'\n            'ad.evotec.xyz'\n            'test.evotec.pl'\n            'ad.evotec.xyz/Production'\n        )\n        $Output = $CanonicalDomain | ConvertTo-DistinguishedName -ToDomain\n        $Output | Should -be @(\n            'DC=ad,DC=evotec,DC=xyz'\n            'DC=ad,DC=evotec,DC=pl'\n            'DC=ad,DC=evotec,DC=xyz'\n            'DC=test,DC=evotec,DC=pl'\n            'DC=ad,DC=evotec,DC=xyz'\n        )\n    }\n    It 'ToDomain Conversion' {\n        $CanonicalDomain = @(\n            'ad.evotec.xyz/Production/Groups/Security/ITR03_AD Admins'\n            'ad.evotec.pl'\n            'ad.evotec.xyz'\n            'test.evotec.pl'\n            'ad.evotec.xyz/Production'\n        )\n        $Output = ConvertTo-DistinguishedName -ToDomain -CanonicalName $CanonicalDomain\n        $Output | Should -be @(\n            'DC=ad,DC=evotec,DC=xyz'\n            'DC=ad,DC=evotec,DC=pl'\n            'DC=ad,DC=evotec,DC=xyz'\n            'DC=test,DC=evotec,DC=pl'\n            'DC=ad,DC=evotec,DC=xyz'\n        )\n    }\n}"
  },
  {
    "path": "Tests/ConvertTo-FlatObject.Tests.ps1",
    "content": "﻿$OrderedObject = [ordered] @{\n    \"Name\"    = \"Przemyslaw Klys\"\n    \"Age\"     = \"30\"\n    \"Address\" = @{\n        \"Street\"  = \"Kwiatowa\"\n        \"City\"    = \"Warszawa\"\n\n        \"Country\" = [ordered] @{\n            \"Name\" = \"Poland\"\n        }\n        List      = @(\n            [PSCustomObject] @{\n                \"Name\" = \"Adam Klys\"\n                \"Age\"  = \"32\"\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Justyna Klys\"\n                \"Age\"  = \"33\"\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Justyna Klys\"\n                \"Age\"  = 30\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Justyna Klys\"\n                \"Age\"  = $null\n            }\n        )\n    }\n    TestEmpty = @()\n    ListTest  = @(\n        [PSCustomObject] @{\n            \"Name\" = \"Justyna Klys\"\n            \"Age\"  = \"33\"\n        }\n    )\n}\n\n\n$PSCustomObject = [PSCustomObject] @{\n    \"Name\"    = \"Przemyslaw Klys\"\n    \"Age\"     = \"30\"\n    \"Address\" = @{\n        \"Street\"  = \"Kwiatowa\"\n        \"City\"    = \"Warszawa\"\n\n        \"Country\" = [ordered] @{\n            \"Name\" = \"Poland\"\n        }\n        List      = @(\n            [PSCustomObject] @{\n                \"Name\" = \"Adam Klys\"\n                \"Age\"  = \"32\"\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Justyna Klys\"\n                \"Age\"  = \"33\"\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Justyna Klys\"\n                \"Age\"  = 30\n            }\n            [PSCustomObject] @{\n                \"Name\" = \"Justyna Klys\"\n                \"Age\"  = $null\n            }\n        )\n    }\n    TestEmpty = @()\n    ListTest  = @(\n        [PSCustomObject] @{\n            \"Name\" = \"Justyna Klys\"\n            \"Age\"  = \"33\"\n        }\n    )\n}\n\n$PSDefaultParameterValues = @{\n    \"It:TestCases\" = @{\n        PSCustomObject  = $PSCustomObject\n        OrderedObject   = $OrderedObject\n    }\n}\n\nDescribe -Name 'Testing ConvertTo-FlatObject' {\n    It 'PSCustomObject Conversion' {\n        $result = ConvertTo-FlatObject $PSCustomObject\n        $result.Name | Should -Be \"Przemyslaw Klys\"\n        $result.Age | Should -Be \"30\"\n        $result.\"Address.Street\" | Should -Be \"Kwiatowa\"\n        $result.\"Address.Country.Name\" | Should -Be \"Poland\"\n        $result.\"Address.City\" | Should -Be \"Warszawa\"\n        $result.\"Address.List.1.Name\" | Should -Be \"Adam Klys\"\n        $result.\"Address.List.1.Age\" | Should -Be \"32\"\n        $result.\"Address.List.1.Age\".GetType().Name | Should -Be 'string'\n        $result.\"Address.List.2.Name\" | Should -Be \"Justyna Klys\"\n        $result.\"Address.List.2.Age\" | Should -Be \"33\"\n        $result.\"Address.List.2.Age\".GetType().Name | Should -Be 'string'\n        $result.\"Address.List.3.Name\" | Should -Be \"Justyna Klys\"\n        $result.\"Address.List.3.Age\" | Should -Be 30\n        $result.\"Address.List.3.Age\".GetType().Name | Should -Be 'int32'\n        $result.\"Address.List.4.Name\" | Should -Be \"Justyna Klys\"\n        $result.\"Address.List.4.Age\" | Should -Be $null\n        $result.\"Address.Street\" | Should -Be \"Kwiatowa\"\n        $result.\"ListTest.1.Name\" | Should -Be \"Justyna Klys\"\n        $result.\"ListTest.1.Age\" | Should -Be 33\n        $result.\"TestEmpty\" | Should -Be @()\n    }\n    It 'OrderedObject Conversion' {\n        $result = ConvertTo-FlatObject $PSCustomObject\n        $result.Name | Should -Be \"Przemyslaw Klys\"\n        $result.Age | Should -Be \"30\"\n        $result.\"Address.Street\" | Should -Be \"Kwiatowa\"\n        $result.\"Address.Country.Name\" | Should -Be \"Poland\"\n        $result.\"Address.City\" | Should -Be \"Warszawa\"\n        $result.\"Address.List.1.Name\" | Should -Be \"Adam Klys\"\n        $result.\"Address.List.1.Age\" | Should -Be \"32\"\n        $result.\"Address.List.1.Age\".GetType().Name | Should -Be 'string'\n        $result.\"Address.List.2.Name\" | Should -Be \"Justyna Klys\"\n        $result.\"Address.List.2.Age\" | Should -Be \"33\"\n        $result.\"Address.List.2.Age\".GetType().Name | Should -Be 'string'\n        $result.\"Address.List.3.Name\" | Should -Be \"Justyna Klys\"\n        $result.\"Address.List.3.Age\" | Should -Be 30\n        $result.\"Address.List.3.Age\".GetType().Name | Should -Be 'int32'\n        $result.\"Address.List.4.Name\" | Should -Be \"Justyna Klys\"\n        $result.\"Address.List.4.Age\" | Should -Be $null\n        $result.\"Address.Street\" | Should -Be \"Kwiatowa\"\n        $result.\"ListTest.1.Name\" | Should -Be \"Justyna Klys\"\n        $result.\"ListTest.1.Age\" | Should -Be 33\n        $result.\"TestEmpty\" | Should -Be @()\n    }\n}"
  },
  {
    "path": "Tests/ConvertTo-JsonLiteral.Tests.ps1",
    "content": "﻿Enum Fruit{\n    Apple = 29\n    Pear = 30\n    Kiwi = 31\n}\n\n$ArrayGeneric = [System.Collections.Generic.List[string]]::new()\n$ArrayGeneric.Add(\"Apple\")\n$ArrayGeneric.Add(\"Pear\")\n$ArrayGeneric.Add(\"Kiwi\")\n\n$ArrayGenericDouble = [System.Collections.Generic.List[double]]::new()\n$ArrayGenericDouble.Add(29.0)\n$ArrayGenericDouble.Add(30.0)\n$ArrayGenericDouble.Add(31.4)\n\n$DateTime = Get-Date\n$PSCustomObject = [PSCustomObject] @{\n    Int                    = '1'\n    Bool                   = $false\n    Date                   = $DateTime\n    Enum                   = [Fruit]::Kiwi\n    String                 = 'This a test, or maybe not;'\n    NewLine                = 'Test,' + [System.Environment]::NewLine + 'test2'\n    Quotes                 = 'OIo*`*sd\"`'\n    PathWithTrail          = 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n    PathWithoutSpaces      = 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n    PathWithSpaces         = \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    PathWithNetwork        = \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    PathWithNetworkAndDots = \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    EmptyArray             = @()\n    EmptyList              = [System.Collections.Generic.List[string]]::new()\n    ArrayGeneric       = $ArrayGeneric\n    ArrayGenericDouble = $ArrayGenericDouble\n    HashTable              = @{\n        NumberAgain       = 2\n        OrderedDictionary = [ordered] @{\n            String    = 'test'\n            HashTable = @{\n                StringAgain = \"oops\"\n            }\n        }\n        Array             = @(\n            'C:\\Users\\1Password.exe'\n            \"C:\\Users\\Ooops.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        )\n        ArrayGeneric       = $ArrayGeneric\n        ArrayGenericDouble = $ArrayGenericDouble\n    }\n    OrderedDictionary      = [ordered] @{\n        NumberAgain       = 2\n        OrderedDictionary = [ordered] @{\n            String    = 'test'\n            HashTable = @{\n                StringAgain = \"oops\"\n            }\n        }\n        Array             = @(\n            'C:\\Users\\1Password.exe'\n            \"C:\\Users\\Ooops.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        )\n        ArrayGeneric       = $ArrayGeneric\n        ArrayGenericDouble = $ArrayGenericDouble\n    }\n}\n\n$HashTableObject = @{\n    Int                    = '1'\n    Bool                   = $false\n    Date                   = $DateTime\n    Enum                   = [Fruit]::Kiwi\n    String                 = 'This a test, or maybe not;'\n    NewLine                = 'Test,' + [System.Environment]::NewLine + 'test2'\n    Quotes                 = 'OIo*`*sd\"`'\n    PathWithTrail          = 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n    PathWithoutSpaces      = 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n    PathWithSpaces         = \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    PathWithNetwork        = \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    PathWithNetworkAndDots = \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    EmptyArray             = @()\n    EmptyList              = [System.Collections.Generic.List[string]]::new()\n    HashTable              = @{\n        NumberAgain       = 2\n        OrderedDictionary = [ordered] @{\n            String    = 'test'\n            HashTable = @{\n                StringAgain = \"oops\"\n            }\n        }\n        Array             = @(\n            'C:\\Users\\1Password.exe'\n            \"C:\\Users\\Ooops.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        )\n    }\n    OrderedDictionary      = [ordered] @{\n        NumberAgain       = 2\n        OrderedDictionary = [ordered] @{\n            String    = 'test'\n            HashTable = @{\n                StringAgain = \"oops\"\n            }\n        }\n        Array             = @(\n            'C:\\Users\\1Password.exe'\n            \"C:\\Users\\Ooops.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        )\n    }\n}\n\n$OrderedObject = [ordered] @{\n    Int                    = '1'\n    Bool                   = $false\n    Date                   = $DateTime\n    Enum                   = [Fruit]::Kiwi\n    String                 = 'This a test, or maybe not;'\n    NewLine                = 'Test,' + [System.Environment]::NewLine + 'test2'\n    Quotes                 = 'OIo*`*sd\"`'\n    PathWithTrail          = 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n    PathWithoutSpaces      = 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n    PathWithSpaces         = \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    PathWithNetwork        = \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    PathWithNetworkAndDots = \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    EmptyArray             = @()\n    EmptyList              = [System.Collections.Generic.List[string]]::new()\n    HashTable              = @{\n        NumberAgain       = 2\n        OrderedDictionary = [ordered] @{\n            String    = 'test'\n            HashTable = @{\n                StringAgain = \"oops\"\n            }\n        }\n        Array             = @(\n            'C:\\Users\\1Password.exe'\n            \"C:\\Users\\Ooops.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        )\n    }\n    OrderedDictionary      = [ordered] @{\n        NumberAgain       = 2\n        OrderedDictionary = [ordered] @{\n            String    = 'test'\n            HashTable = @{\n                StringAgain = \"oops\"\n            }\n        }\n        Array             = @(\n            'C:\\Users\\1Password.exe'\n            \"C:\\Users\\Ooops.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        )\n    }\n}\n\n$PSDefaultParameterValues = @{\n    \"It:TestCases\" = @{\n        PSCustomObject  = $PSCustomObject\n        OrderedObject   = $OrderedObject\n        HashTableObject = $HashTableObject\n        DateTime        = $DateTime\n    }\n}\n\n#$PSCustomObject | ConvertTo-JsonLiteral -Depth 5 -NumberAsString\n#return\n\nDescribe -Name 'Testing ConvertTo-JsonLiteral' {\n    It 'PSCustomObject Conversion' {\n        $Json = ConvertTo-JsonLiteral -Object $PSCustomObject -NumberAsString -BoolAsString\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson.Int | Should -Be '1'\n        $FromJson.Bool | Should -Be 'False'\n        $FromJson.Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson.Enum | Should -Be 'Kiwi'\n        $FromJson.String | Should -Be 'This a test, or maybe not;'\n        $FromJson.PathWithTrail | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n        $FromJson.PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson.PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson.EmptyList | Should -Be ''\n\n    }\n    It 'PSCustomObject Conversion with ArrayJoin' {\n        $Json = ConvertTo-JsonLiteral -Object $PSCustomObject -NumberAsString -BoolAsString -ArrayJoin -ArrayJoinString \",\" -Depth 5\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson.Int | Should -Be '1'\n        $FromJson.Bool | Should -Be 'False'\n        $FromJson.Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson.Enum | Should -Be 'Kiwi'\n        $FromJson.String | Should -Be 'This a test, or maybe not;'\n        $FromJson.PathWithTrail | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n        $FromJson.PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson.PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson.EmptyList | Should -Be ''\n        $FromJson.HashTable.ArrayGeneric | Should -Be \"Apple,Pear,Kiwi\"\n        $FromJson.HashTable.ArrayGenericDouble | Should -Be \"29,30,31.4\"\n        $FromJson.ArrayGeneric | Should -Be \"Apple,Pear,Kiwi\"\n        $FromJson.ArrayGenericDouble | Should -Be \"29,30,31.4\"\n    }\n    It 'Ordered Dictionary Conversion' {\n        $Json = ConvertTo-JsonLiteral -Object $OrderedObject -NumberAsString -BoolAsString\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson.Int | Should -Be '1'\n        $FromJson.Bool | Should -Be 'False'\n        $FromJson.Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson.Enum | Should -Be 'Kiwi'\n        $FromJson.String | Should -Be 'This a test, or maybe not;'\n        $FromJson.PathWithTrail | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n        $FromJson.PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson.PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson.EmptyList | Should -Be ''\n    }\n    It 'Hashtable Conversion' {\n        $Json = ConvertTo-JsonLiteral -Object $HashTableObject -NumberAsString -BoolAsString\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson.Int | Should -Be '1'\n        $FromJson.Bool | Should -Be 'False'\n        $FromJson.Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson.Enum | Should -Be 'Kiwi'\n        $FromJson.String | Should -Be 'This a test, or maybe not;'\n        $FromJson.PathWithTrail | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n        $FromJson.PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson.PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson.EmptyList | Should -Be ''\n    }\n}\n\nDescribe -Name 'Testing ConvertTo-JsonLiteral Pipeline' {\n    It 'PSCustomObject Conversion' {\n        $Json = $PSCustomObject | ConvertTo-JsonLiteral -NumberAsString -BoolAsString\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson.Int | Should -Be '1'\n        $FromJson.Bool | Should -Be 'False'\n        $FromJson.Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson.Enum | Should -Be 'Kiwi'\n        $FromJson.String | Should -Be 'This a test, or maybe not;'\n        $FromJson.PathWithTrail | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n        $FromJson.PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson.PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson.EmptyList | Should -Be ''\n    }\n    It 'Ordered Dictionary Conversion' {\n        $Json = $OrderedObject | ConvertTo-JsonLiteral -NumberAsString -BoolAsString\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson.Int | Should -Be '1'\n        $FromJson.Bool | Should -Be 'False'\n        $FromJson.Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson.Enum | Should -Be 'Kiwi'\n        $FromJson.String | Should -Be 'This a test, or maybe not;'\n        $FromJson.PathWithTrail | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n        $FromJson.PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson.PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson.EmptyList | Should -Be ''\n    }\n    It 'Hashtable Conversion' {\n        $Json = $HashTableObject | ConvertTo-JsonLiteral -NumberAsString -BoolAsString\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson.Int | Should -Be '1'\n        $FromJson.Bool | Should -Be 'False'\n        $FromJson.Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson.Enum | Should -Be 'Kiwi'\n        $FromJson.String | Should -Be 'This a test, or maybe not;'\n        $FromJson.PathWithTrail | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n        $FromJson.PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson.PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson.EmptyList | Should -Be ''\n    }\n}\n\nDescribe -Name 'Testing ConvertTo-JsonLiteral Array' {\n    It 'PSCustomObject Conversion' {\n        $Json = ConvertTo-JsonLiteral -Object $PSCustomObject, $PSCustomObject -NumberAsString -BoolAsString\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson[0].Int | Should -Be '1'\n        $FromJson[0].Bool | Should -Be 'False'\n        $FromJson[0].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[0].Enum | Should -Be 'Kiwi'\n        $FromJson[0].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[1].Int | Should -Be '1'\n        $FromJson[1].Bool | Should -Be 'False'\n        $FromJson[1].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[1].Enum | Should -Be 'Kiwi'\n        $FromJson[1].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[0].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[0].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[1].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[1].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[0].EmptyList | Should -Be ''\n        $FromJson[1].EmptyList | Should -Be ''\n    }\n    It 'Ordered Dictionary Conversion' {\n        $Json = ConvertTo-JsonLiteral -Object $OrderedObject, $OrderedObject -NumberAsString -BoolAsString\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson[0].Int | Should -Be '1'\n        $FromJson[0].Bool | Should -Be 'False'\n        $FromJson[0].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[0].Enum | Should -Be 'Kiwi'\n        $FromJson[0].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[1].Int | Should -Be '1'\n        $FromJson[1].Bool | Should -Be 'False'\n        $FromJson[1].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[1].Enum | Should -Be 'Kiwi'\n        $FromJson[1].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[0].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[0].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[1].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[1].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[0].EmptyList | Should -Be ''\n        $FromJson[1].EmptyList | Should -Be ''\n    }\n    It 'Hashtable Conversion' {\n        $Json = ConvertTo-JsonLiteral -Object $HashTableObject, $HashTableObject -NumberAsString -BoolAsString\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson[0].Int | Should -Be '1'\n        $FromJson[0].Bool | Should -Be 'False'\n        $FromJson[0].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[0].Enum | Should -Be 'Kiwi'\n        $FromJson[0].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[1].Int | Should -Be '1'\n        $FromJson[1].Bool | Should -Be 'False'\n        $FromJson[1].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[1].Enum | Should -Be 'Kiwi'\n        $FromJson[1].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[0].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[0].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[1].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[1].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[0].EmptyList | Should -Be ''\n        $FromJson[1].EmptyList | Should -Be ''\n    }\n}\n\nDescribe -Name 'Testing ConvertTo-JsonLiteral Array Pipeline' {\n    It 'PSCustomObject Conversion' {\n        $Json = $PSCustomObject, $PSCustomObject | ConvertTo-JsonLiteral -NumberAsString -BoolAsString\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson[0].Int | Should -Be '1'\n        $FromJson[0].Bool | Should -Be 'False'\n        $FromJson[0].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[0].Enum | Should -Be 'Kiwi'\n        $FromJson[0].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[1].Int | Should -Be '1'\n        $FromJson[1].Bool | Should -Be 'False'\n        $FromJson[1].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[1].Enum | Should -Be 'Kiwi'\n        $FromJson[1].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[0].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[0].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[1].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[1].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[0].EmptyList | Should -Be ''\n        $FromJson[1].EmptyList | Should -Be ''\n    }\n    It 'Ordered Dictionary Conversion' {\n        $Json = $OrderedObject, $OrderedObject | ConvertTo-JsonLiteral -NumberAsString -BoolAsString\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson[0].Int | Should -Be '1'\n        $FromJson[0].Bool | Should -Be 'False'\n        $FromJson[0].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[0].Enum | Should -Be 'Kiwi'\n        $FromJson[0].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[1].Int | Should -Be '1'\n        $FromJson[1].Bool | Should -Be 'False'\n        $FromJson[1].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[1].Enum | Should -Be 'Kiwi'\n        $FromJson[1].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[0].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[0].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[1].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[1].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[0].EmptyList | Should -Be ''\n        $FromJson[1].EmptyList | Should -Be ''\n    }\n    It 'Hashtable Conversion' {\n        $Json = $HashTableObject, $HashTableObject | ConvertTo-JsonLiteral -NumberAsString -BoolAsString\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson[0].Int | Should -Be '1'\n        $FromJson[0].Bool | Should -Be 'False'\n        $FromJson[0].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[0].Enum | Should -Be 'Kiwi'\n        $FromJson[0].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[1].Int | Should -Be '1'\n        $FromJson[1].Bool | Should -Be 'False'\n        $FromJson[1].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[1].Enum | Should -Be 'Kiwi'\n        $FromJson[1].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[0].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[0].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[1].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[1].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[0].EmptyList | Should -Be ''\n        $FromJson[1].EmptyList | Should -Be ''\n    }\n}\nDescribe -Name 'Testing ConvertTo-JsonLiteral (bool as bool/number as number)' {\n    It 'PSCustomObject Conversion' {\n        $Json = ConvertTo-JsonLiteral -Object $PSCustomObject\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson.Int | Should -Be 1\n        $FromJson.Bool | Should -Be $false\n        $FromJson.Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson.Enum | Should -Be 'Kiwi'\n        $FromJson.String | Should -Be 'This a test, or maybe not;'\n        $FromJson.NewLine | Should -Be ( -join ('Test,', [System.Environment]::NewLine, 'test2'))\n        $FromJson.Quotes | Should -Be 'OIo*`*sd\"`'\n        $FromJson.PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson.PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson.EmptyList | Should -Be ''\n    }\n    It 'Ordered Dictionary Conversion' {\n        $Json = ConvertTo-JsonLiteral -Object $OrderedObject\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson.Int | Should -Be 1\n        $FromJson.Bool | Should -Be $false\n        $FromJson.Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson.Enum | Should -Be 'Kiwi'\n        $FromJson.String | Should -Be 'This a test, or maybe not;'\n        $FromJson.NewLine | Should -Be ( -join ('Test,', [System.Environment]::NewLine, 'test2'))\n        $FromJson.Quotes | Should -Be 'OIo*`*sd\"`'\n        $FromJson.PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson.PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson.EmptyList | Should -Be ''\n    }\n    It 'Hashtable Conversion' {\n        $Json = ConvertTo-JsonLiteral -Object $HashTableObject\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson.Int | Should -Be 1\n        $FromJson.Bool | Should -Be $false\n        $FromJson.Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson.Enum | Should -Be 'Kiwi'\n        $FromJson.String | Should -Be 'This a test, or maybe not;'\n        $FromJson.NewLine | Should -Be ( -join ('Test,', [System.Environment]::NewLine, 'test2'))\n        $FromJson.Quotes | Should -Be 'OIo*`*sd\"`'\n        $FromJson.PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson.PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson.EmptyList | Should -Be ''\n    }\n}\nDescribe -Name 'Testing ConvertTo-JsonLiteral string type' {\n    It 'string type conversion' {\n        # Generally it should not throw\n        $ConvertedObject = [string] | ConvertTo-JsonLiteral | ConvertFrom-Json\n        #$ConvertedObject.Module | Should -Be 'CommonLanguageRuntimeLibrary'\n        $ConvertedObject.Namespace | Should -Be 'System'\n    }\n}\n\nDescribe -Name 'Testing ConvertTo-JsonLiteral Depth 5' {\n    It 'PSCustomObject Conversion' {\n        $Converted = $PSCustomObject | ConvertTo-JsonLiteral -Depth 5 | ConvertFrom-Json\n        $Converted.HashTable.OrderedDictionary.HashTable.StringAgain | Should -Be 'oops'\n        $Converted.HashTable.Array[1] | Should -Be \"C:\\Users\\Ooops.exe\"\n    }\n    It 'Ordered Conversion' {\n        $Converted = $OrderedObject | ConvertTo-JsonLiteral -Depth 5 | ConvertFrom-Json\n        $Converted.HashTable.OrderedDictionary.HashTable.StringAgain | Should -Be 'oops'\n        $Converted.HashTable.Array[1] | Should -Be \"C:\\Users\\Ooops.exe\"\n    }\n    It 'HashTable Conversion' {\n        $Converted = $HashTableObject | ConvertTo-JsonLiteral -Depth 5 | ConvertFrom-Json\n        $Converted.HashTable.OrderedDictionary.HashTable.StringAgain | Should -Be 'oops'\n        $Converted.HashTable.Array[1] | Should -Be \"C:\\Users\\Ooops.exe\"\n    }\n}\nDescribe -Name 'Testing ConvertTo-JsonLiteral Depth 1' {\n    It 'PSCustomObject Conversion' {\n        $Converted = $PSCustomObject | ConvertTo-JsonLiteral -Depth 1 -NumberAsString -BoolAsString | ConvertFrom-Json\n        $Converted.HashTable.OrderedDictionary.HashTable.StringAgain | Should -Not -Be 'oops'\n        $Converted.HashTable.OrderedDictionary = \"System.Collections.Specialized.OrderedDictionary\"\n        $Converted.HashTable.NumberAgain = \"2\"\n        $Converted.HashTable.Array | Should -Be \"C:\\Users\\1Password.exe C:\\Users\\Ooops.exe \\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe \\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $Converted.EmptyArray | Should -Be @()\n        $Converted.EmptyList | Should -Be @()\n    }\n    It 'Ordered Conversion' {\n        $Converted = $OrderedObject | ConvertTo-JsonLiteral -Depth 1 -NumberAsString -BoolAsString | ConvertFrom-Json\n        $Converted.HashTable.OrderedDictionary.HashTable.StringAgain | Should -Not -Be 'oops'\n        $Converted.HashTable.OrderedDictionary = \"System.Collections.Specialized.OrderedDictionary\"\n        $Converted.HashTable.NumberAgain = \"2\"\n        $Converted.HashTable.Array | Should -Be \"C:\\Users\\1Password.exe C:\\Users\\Ooops.exe \\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe \\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $Converted.EmptyArray | Should -Be @()\n        $Converted.EmptyList | Should -Be @()\n    }\n    It 'HashTable Conversion' {\n        $Converted = $HashTableObject | ConvertTo-JsonLiteral -Depth 1 -NumberAsString -BoolAsString | ConvertFrom-Json\n        $Converted.HashTable.OrderedDictionary.HashTable.StringAgain | Should -Not -Be 'oops'\n        $Converted.HashTable.OrderedDictionary = \"System.Collections.Specialized.OrderedDictionary\"\n        $Converted.HashTable.NumberAgain = \"2\"\n        $Converted.HashTable.Array | Should -Be \"C:\\Users\\1Password.exe C:\\Users\\Ooops.exe \\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe \\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $Converted.EmptyArray | Should -Be @()\n        $Converted.EmptyList | Should -Be @()\n    }\n}\nDescribe -Name 'Testing ConvertTo-JsonLiteral NewLines' {\n    It 'Converts the same way ConvertTo-JSON' {\n        $DataTable3 = @(\n            [PSCustomObject] @{\n                'Test1'        = 'Test' + [System.Environment]::NewLine + 'test3';\n                'Test2'        = 'Test' + [System.Environment]::NewLine + 'test3' + \"`n test\"\n                'Test3'        = 'Test' + [System.Environment]::NewLine + 'test3' + \"`r`n test\"\n                'Test4'        = 'Test' + [System.Environment]::NewLine + 'test3' + \"`r test\"\n                'Test5'        = 'Test' + \"`r`n\" + 'test3' + \"test\"\n                'Test6'        = @\"\n                Test1\n                Test2\n                Test3\n\n                Test4\n\"@\n                'Test7'        = 'Test' + \"`n`n\" + \"Oops \\n\\n\"\n                'Test8\"Oopps\"' = 'MyTest \"Ofcourse\"'\n                \"Test9'Ooops'\" = \"MyTest 'Ofcourse'\"\n            }\n        )\n\n        $Output1 = $DataTable3 | ConvertTo-JsonLiteral | ConvertFrom-Json\n        $Output2 = $DataTable3 | ConvertTo-Json | ConvertFrom-Json\n        $Output1.Test1 | Should -Be $Output2.Test1\n        $Output1.Test2 | Should -Be $Output2.Test2\n        $Output1.Test3 | Should -Be $Output2.Test3\n        $Output1.Test4 | Should -Be $Output2.Test4\n        $Output1.Test5 | Should -Be $Output2.Test5\n        $Output1.Test6 | Should -Be $Output2.Test6\n        $Output1.'Test8\"Oopps\"' | Should -Be $Output2.'Test8\"Oopps\"'\n        $Output1.\"Test9'Ooops'\" | Should -Be $Output2.\"Test9'Ooops'\"\n    }\n}\n\n\nDescribe -Name 'Testing ConvertTo-JsonLiteral Using Force' {\n    It 'Forces convesion according to first object in array' {\n        $DataTable3 = @(\n            [PSCustomObject] @{\n                'property1' = 'Test1'\n                'property2' = 'Test2'\n            }\n            [PSCustomObject] @{\n                'Property1' = 'Test1'\n                'Property2' = 'Test2'\n                'Property3' = 'Test3'\n            }\n        )\n\n        $Output1 = $DataTable3 | ConvertTo-JsonLiteral -Force | ConvertFrom-Json\n        $Output1[0].PSObject.Properties.Name.Count | Should -Be 2\n        $Output1[1].PSObject.Properties.Name.Count | Should -Be 2\n    }\n    It 'Forces convesion according to first object in array' {\n        $DataTable3 = @(\n            [PSCustomObject] @{\n                'Property1' = 'Test1'\n                'Property2' = 'Test2'\n                'Property3' = 'Test3'\n            }\n            [PSCustomObject] @{\n                'property1' = 'Test1'\n                'property2' = 'Test2'\n            }\n        )\n        $Output1 = $DataTable3 | ConvertTo-JsonLiteral -Force | ConvertFrom-Json\n        $Output1[0].PSObject.Properties.Name.Count | Should -Be 3\n        $Output1[1].PSObject.Properties.Name.Count | Should -Be 3\n        ($Output1[1].PSObject.Properties.Name)[0] | Should -BeExactly 'Property1' # checks case\n        ($Output1[1].PSObject.Properties.Name)[1] | Should -BeExactly 'Property2' # checks case\n    }\n}\n\n\nDescribe -Name 'Testing ConvertTo-JsonLiteral Using Force' {\n    It 'Forces convesion according to first object in array' {\n        $DataTable3 = @(\n            [PSCustomObject] @{\n                'property1' = 'Test1'\n                'property2' = 'Test2'\n                'property3' = @(\n                    [PSCustomObject] @{\n                        'Property1' = 'Test1'\n                        'Property2' = 'Test2'\n                        'Property3' = 'Test3'\n                    }\n                    [PSCustomObject] @{\n                        'Property1' = 'Test1'\n                        'Property2' = 'Test2'\n                        'Property3' = 'Test3'\n                    }\n                    [PSCustomObject] @{\n                        'property1' = 'Test1'\n                        'property2' = 'Test2'\n                        'property3' = 'Test3'\n                    }\n                )\n            }\n            [PSCustomObject] @{\n                'Property1' = 'Test1'\n                'Property2' = 'Test2'\n            }\n        )\n\n        $Output1 = $DataTable3 | ConvertTo-JsonLiteral -Force -Depth 2 | ConvertFrom-Json\n        $Output1[0].PSObject.Properties.Name.Count | Should -Be 3\n        $Output1[1].PSObject.Properties.Name.Count | Should -Be 3\n        $Output1[0].property3[0].PSObject.Properties.Name.Count | Should -Be 3\n        $Output1[0].property3[1].PSObject.Properties.Name.Count | Should -Be 3\n        $Output1[0].property3[2].PSObject.Properties.Name.Count | Should -Be 3\n        ($Output1[0].property3[0].PSObject.Properties.Name)[0] | Should -BeExactly 'Property1'\n        ($Output1[0].property3[0].PSObject.Properties.Name)[1] | Should -BeExactly 'Property2'\n        ($Output1[0].property3[1].PSObject.Properties.Name)[0] | Should -BeExactly 'Property1'\n        ($Output1[0].property3[1].PSObject.Properties.Name)[1] | Should -BeExactly 'Property2'\n        ($Output1[0].property3[2].PSObject.Properties.Name)[0] | Should -BeExactly 'Property1'\n        ($Output1[0].property3[2].PSObject.Properties.Name)[1] | Should -BeExactly 'Property2'\n    }\n}\n\nDescribe -Name 'Testing ConvertTo-JsonLiteral with more escaping check' {\n    It 'Makes sure escaping is done properly' {\n        $DataTable3 = @(\n            [PSCustomObject] @{\n                'Tree Parent?'                                      = 'Testing Tree ?'\n                'Other Tree (Rigth)'                                = 'Ok You mean Me (Test)'\n                'Hierarchy Table Recaluculation interval (minutes)' = \"\\\\*\\NETLOGON\"\n                \"Test\"                                              = \"\\\\Ooops\\C$\\Windows\\System32\\config\\netlogon.dns\"\n                \"\\\\*\\SYSVOL\"                                        = 'Test me \\\\*\\SYSVOL and \\\\*\\NETLOGON shares.'\n                \"\\\\*\\NETLOGON\"                                      = 'Test me \\\\*\\SYSVOL and \\\\*\\NETLOGON shares.'\n                'Test^'                                             = 'Oops1'\n                \"Hello+Motto\"                                       = 'Oops2'\n                'Hello|Motto'                                       = 'Oops3'\n                'Hello{Value}'                                      = 'Oops4'\n                'Hello$Value'                                       = 'Oops5'\n                'Hello.Value'                                       = 'Oops6'\n                'Hello Value'                                       = 'Oops7.Test'\n            }\n        )\n\n        $Output1 = $DataTable3 | ConvertTo-JsonLiteral | ConvertFrom-Json\n        $Output1[0].PSObject.Properties.Name.Count | Should -Be 13\n        $Output1[0].'Tree Parent?' | Should -BeExactly 'Testing Tree ?'\n        $Output1[0].'Other Tree (Rigth)' | Should -BeExactly 'Ok You mean Me (Test)'\n        $Output1[0].'Hierarchy Table Recaluculation interval (minutes)' | Should -BeExactly '\\\\*\\NETLOGON'\n        $Output1[0].'Test' | Should -BeExactly '\\\\Ooops\\C$\\Windows\\System32\\config\\netlogon.dns'\n        $Output1[0].'\\\\*\\SYSVOL' | Should -BeExactly 'Test me \\\\*\\SYSVOL and \\\\*\\NETLOGON shares.'\n        $Output1[0].'\\\\*\\NETLOGON' | Should -BeExactly 'Test me \\\\*\\SYSVOL and \\\\*\\NETLOGON shares.'\n        $Output1[0].'Test^' | Should -BeExactly 'Oops1'\n        $Output1[0].'Hello+Motto' | Should -BeExactly 'Oops2'\n        $Output1[0].'Hello|Motto' | Should -BeExactly 'Oops3'\n        $Output1[0].'Hello{Value}' | Should -BeExactly 'Oops4'\n        $Output1[0].'Hello$Value' | Should -BeExactly 'Oops5'\n        $Output1[0].'Hello.Value' | Should -BeExactly 'Oops6'\n        $Output1[0].'Hello Value' | Should -BeExactly 'Oops7.Test'\n    }\n}\n\n\nDescribe -Name 'Testing ConvertTo-JsonLiteral against int/double' {\n    It 'Make sure int/double works' {\n        $DataTable3 = @(\n            [PSCustomObject] @{\n                Test1 = 1\n                Test2 = 1.2\n                Test3 = 1.2, 1.3, 1.4\n                Test4 = 1, 2, 3, 4, 5\n                Test5 = 1, 1.2, 1.3, 4\n            }\n        )\n\n        $Output1 = $DataTable3 | ConvertTo-JsonLiteral -Depth 2 | ConvertFrom-Json\n        $Output1[0].'Test1' | Should -BeExactly 1\n        $Output1[0].'Test2' | Should -BeExactly 1.2\n        $Output1[0].'Test3' | Should -BeExactly @(1.2, 1.3, 1.4)\n        $Output1[0].'Test4' | Should -BeExactly @(1, 2, 3, 4, 5)\n        $Output1[0].'Test5' | Should -BeExactly @(1, 1.2, 1.3, 4)\n    }\n}"
  },
  {
    "path": "Tests/ConvertTo-NormalizedString.Tests.ps1",
    "content": "﻿Describe -Name 'Testing ConvertTo-NormalizedString' {\n    It 'Different strings' {\n        \"äöüß\" | ConvertTo-NormalizedString | Should -Be \"aeoeuess\"\n        \"Yağız Barın\" | ConvertTo-NormalizedString | Should -Be \"Yagiz Barin\"\n        ConvertTo-NormalizedString -String \"café\" | Should -Be \"cafe\"\n        \"café\" | ConvertTo-NormalizedString | Should -Be \"cafe\"\n        'Helène' | ConvertTo-NormalizedString | Should -Be \"Helene\"\n        \"Przemysław Kłys and Helène\" | ConvertTo-NormalizedString | Should -Be \"Przemyslaw Klys and Helene\"\n        \"kłys\" | ConvertTo-NormalizedString | Should -Be \"klys\"\n        \"ąęćśł\" | ConvertTo-NormalizedString | Should -Be \"aecsl\"\n        \"Michael Roßbach\" | ConvertTo-NormalizedString | Should -Be \"Michael Rossbach\"\n        \"öüóőúéáűí\" | ConvertTo-NormalizedString | Should -Be \"oeueooueaui\"\n        \"ß\" | ConvertTo-NormalizedString | Should -Be \"ss\"\n        \"Un été de Raphaël\" | ConvertTo-NormalizedString | Should -Be \"Un ete de Raphael\"\n        (\"äâûê\", \"éèà\", \"ùçä\") | ConvertTo-NormalizedString | Should -Be \"aeaue\", \"eea\", \"ucae\"\n        \"Fore ðære mærðe…\" | ConvertTo-NormalizedString | Should -Be \"Fore daere maerde...\"\n        \"ABC-abc-ČŠŽ-čšž\" | ConvertTo-NormalizedString | Should -Be \"ABC-abc-CSZ-csz\"\n        'ç' | ConvertTo-NormalizedString | Should -Be 'c'\n        'Ç' | ConvertTo-NormalizedString | Should -Be 'C'\n        \"Æ×Þ°±ß…\" | ConvertTo-NormalizedString | Should -Be \"aeXthopss...\"\n    }\n}"
  },
  {
    "path": "Tests/ConvertTo-PrettyObject.Tests.ps1",
    "content": "﻿enum Fruit{\n    Apple = 29\n    Pear = 30\n    Kiwi = 31\n}\n\n$ArrayGeneric = [System.Collections.Generic.List[string]]::new()\n$ArrayGeneric.Add(\"Apple\")\n$ArrayGeneric.Add(\"Pear\")\n$ArrayGeneric.Add(\"Kiwi\")\n\n$ArrayGenericDouble = [System.Collections.Generic.List[double]]::new()\n$ArrayGenericDouble.Add(29.0)\n$ArrayGenericDouble.Add(30.0)\n$ArrayGenericDouble.Add(31.4)\n\n$DateTime = Get-Date\n$PSCustomObject = [PSCustomObject] @{\n    Int                    = '1'\n    Bool                   = $false\n    Date                   = $DateTime\n    Enum                   = [Fruit]::Kiwi\n    String                 = 'This a test, or maybe not;'\n    NewLine                = 'Test,' + [System.Environment]::NewLine + 'test2'\n    Quotes                 = 'OIo*`*sd\"`'\n    PathWithTrail          = 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n    PathWithoutSpaces      = 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n    PathWithSpaces         = \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    PathWithNetwork        = \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    PathWithNetworkAndDots = \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    EmptyArray             = @()\n    EmptyList              = [System.Collections.Generic.List[string]]::new()\n    ArrayGeneric           = $ArrayGeneric\n    ArrayGenericDouble     = $ArrayGenericDouble\n    HashTable              = @{\n        NumberAgain        = 2\n        OrderedDictionary  = [ordered] @{\n            String    = 'test'\n            HashTable = @{\n                StringAgain = \"oops\"\n            }\n        }\n        Array              = @(\n            'C:\\Users\\1Password.exe'\n            \"C:\\Users\\Ooops.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        )\n        ArrayGeneric       = $ArrayGeneric\n        ArrayGenericDouble = $ArrayGenericDouble\n    }\n    OrderedDictionary      = [ordered] @{\n        NumberAgain        = 2\n        OrderedDictionary  = [ordered] @{\n            String    = 'test'\n            HashTable = @{\n                StringAgain = \"oops\"\n            }\n        }\n        Array              = @(\n            'C:\\Users\\1Password.exe'\n            \"C:\\Users\\Ooops.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        )\n        ArrayGeneric       = $ArrayGeneric\n        ArrayGenericDouble = $ArrayGenericDouble\n    }\n}\n\n$HashTableObject = @{\n    Int                    = '1'\n    Bool                   = $false\n    Date                   = $DateTime\n    Enum                   = [Fruit]::Kiwi\n    String                 = 'This a test, or maybe not;'\n    NewLine                = 'Test,' + [System.Environment]::NewLine + 'test2'\n    Quotes                 = 'OIo*`*sd\"`'\n    PathWithTrail          = 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n    PathWithoutSpaces      = 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n    PathWithSpaces         = \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    PathWithNetwork        = \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    PathWithNetworkAndDots = \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    EmptyArray             = @()\n    EmptyList              = [System.Collections.Generic.List[string]]::new()\n    HashTable              = @{\n        NumberAgain       = 2\n        OrderedDictionary = [ordered] @{\n            String    = 'test'\n            HashTable = @{\n                StringAgain = \"oops\"\n            }\n        }\n        Array             = @(\n            'C:\\Users\\1Password.exe'\n            \"C:\\Users\\Ooops.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        )\n    }\n    OrderedDictionary      = [ordered] @{\n        NumberAgain       = 2\n        OrderedDictionary = [ordered] @{\n            String    = 'test'\n            HashTable = @{\n                StringAgain = \"oops\"\n            }\n        }\n        Array             = @(\n            'C:\\Users\\1Password.exe'\n            \"C:\\Users\\Ooops.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        )\n    }\n}\n\n$OrderedObject = [ordered] @{\n    Int                    = '1'\n    Bool                   = $false\n    Date                   = $DateTime\n    Enum                   = [Fruit]::Kiwi\n    String                 = 'This a test, or maybe not;'\n    NewLine                = 'Test,' + [System.Environment]::NewLine + 'test2'\n    Quotes                 = 'OIo*`*sd\"`'\n    PathWithTrail          = 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n    PathWithoutSpaces      = 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n    PathWithSpaces         = \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    PathWithNetwork        = \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    PathWithNetworkAndDots = \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n    EmptyArray             = @()\n    EmptyList              = [System.Collections.Generic.List[string]]::new()\n    HashTable              = @{\n        NumberAgain       = 2\n        OrderedDictionary = [ordered] @{\n            String    = 'test'\n            HashTable = @{\n                StringAgain = \"oops\"\n            }\n        }\n        Array             = @(\n            'C:\\Users\\1Password.exe'\n            \"C:\\Users\\Ooops.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        )\n    }\n    OrderedDictionary      = [ordered] @{\n        NumberAgain       = 2\n        OrderedDictionary = [ordered] @{\n            String    = 'test'\n            HashTable = @{\n                StringAgain = \"oops\"\n            }\n        }\n        Array             = @(\n            'C:\\Users\\1Password.exe'\n            \"C:\\Users\\Ooops.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n            \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        )\n    }\n}\n\n$PSDefaultParameterValues = @{\n    \"It:TestCases\" = @{\n        PSCustomObject  = $PSCustomObject\n        OrderedObject   = $OrderedObject\n        HashTableObject = $HashTableObject\n        DateTime        = $DateTime\n    }\n}\n\nDescribe -Name 'Testing ConvertTo-PrettyObject' {\n    It 'PSCustomObject Conversion' {\n        $Json = ConvertTo-PrettyObject -Object $PSCustomObject -NumberAsString -BoolAsString | ConvertTo-Json\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson.Int | Should -Be '1'\n        $FromJson.Bool | Should -Be 'False'\n        $FromJson.Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson.Enum | Should -Be 'Kiwi'\n        $FromJson.String | Should -Be 'This a test, or maybe not;'\n        $FromJson.PathWithTrail | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n        $FromJson.PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson.PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson.EmptyList | Should -Be ''\n\n    }\n    It 'PSCustomObject Conversion with ArrayJoin' {\n        $Json = ConvertTo-PrettyObject -Object $PSCustomObject -NumberAsString -BoolAsString -ArrayJoin -ArrayJoinString \",\" | ConvertTo-Json\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson.Int | Should -Be '1'\n        $FromJson.Bool | Should -Be 'False'\n        $FromJson.Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson.Enum | Should -Be 'Kiwi'\n        $FromJson.String | Should -Be 'This a test, or maybe not;'\n        $FromJson.PathWithTrail | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n        $FromJson.PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson.PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson.EmptyList | Should -Be ''\n        $FromJson.ArrayGeneric | Should -Be \"Apple,Pear,Kiwi\"\n        $FromJson.ArrayGenericDouble | Should -Be \"29,30,31.4\"\n    }\n    It 'Ordered Dictionary Conversion' {\n        $Json = ConvertTo-PrettyObject -Object $OrderedObject -NumberAsString -BoolAsString | ConvertTo-Json\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson.Int | Should -Be '1'\n        $FromJson.Bool | Should -Be 'False'\n        $FromJson.Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson.Enum | Should -Be 'Kiwi'\n        $FromJson.String | Should -Be 'This a test, or maybe not;'\n        $FromJson.PathWithTrail | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n        $FromJson.PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson.PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson.EmptyList | Should -Be ''\n    }\n    It 'Hashtable Conversion' {\n        $Json = ConvertTo-PrettyObject -Object $HashTableObject -NumberAsString -BoolAsString | ConvertTo-Json\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson.Int | Should -Be '1'\n        $FromJson.Bool | Should -Be 'False'\n        $FromJson.Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson.Enum | Should -Be 'Kiwi'\n        $FromJson.String | Should -Be 'This a test, or maybe not;'\n        $FromJson.PathWithTrail | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n        $FromJson.PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson.PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson.EmptyList | Should -Be ''\n    }\n}\n\nDescribe -Name 'Testing ConvertTo-PrettyObject Pipeline' {\n    It 'PSCustomObject Conversion' {\n        $Json = $PSCustomObject | ConvertTo-PrettyObject -NumberAsString -BoolAsString | ConvertTo-Json\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson.Int | Should -Be '1'\n        $FromJson.Bool | Should -Be 'False'\n        $FromJson.Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson.Enum | Should -Be 'Kiwi'\n        $FromJson.String | Should -Be 'This a test, or maybe not;'\n        $FromJson.PathWithTrail | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n        $FromJson.PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson.PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson.EmptyList | Should -Be ''\n    }\n    It 'Ordered Dictionary Conversion' {\n        $Json = $OrderedObject | ConvertTo-PrettyObject -NumberAsString -BoolAsString | ConvertTo-Json\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson.Int | Should -Be '1'\n        $FromJson.Bool | Should -Be 'False'\n        $FromJson.Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson.Enum | Should -Be 'Kiwi'\n        $FromJson.String | Should -Be 'This a test, or maybe not;'\n        $FromJson.PathWithTrail | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n        $FromJson.PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson.PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson.EmptyList | Should -Be ''\n    }\n    It 'Hashtable Conversion' {\n        $Json = $HashTableObject | ConvertTo-PrettyObject -NumberAsString -BoolAsString | ConvertTo-Json\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson.Int | Should -Be '1'\n        $FromJson.Bool | Should -Be 'False'\n        $FromJson.Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson.Enum | Should -Be 'Kiwi'\n        $FromJson.String | Should -Be 'This a test, or maybe not;'\n        $FromJson.PathWithTrail | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe\\'\n        $FromJson.PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson.PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson.EmptyList | Should -Be ''\n    }\n}\n\nDescribe -Name 'Testing ConvertTo-PrettyObject Array' {\n    It 'PSCustomObject Conversion' {\n        $Json = ConvertTo-PrettyObject -Object $PSCustomObject, $PSCustomObject -NumberAsString -BoolAsString | ConvertTo-Json\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson[0].Int | Should -Be '1'\n        $FromJson[0].Bool | Should -Be 'False'\n        $FromJson[0].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[0].Enum | Should -Be 'Kiwi'\n        $FromJson[0].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[1].Int | Should -Be '1'\n        $FromJson[1].Bool | Should -Be 'False'\n        $FromJson[1].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[1].Enum | Should -Be 'Kiwi'\n        $FromJson[1].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[0].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[0].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[1].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[1].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[0].EmptyList | Should -Be ''\n        $FromJson[1].EmptyList | Should -Be ''\n    }\n    It 'Ordered Dictionary Conversion' {\n        $Json = ConvertTo-PrettyObject -Object $OrderedObject, $OrderedObject -NumberAsString -BoolAsString | ConvertTo-Json\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson[0].Int | Should -Be '1'\n        $FromJson[0].Bool | Should -Be 'False'\n        $FromJson[0].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[0].Enum | Should -Be 'Kiwi'\n        $FromJson[0].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[1].Int | Should -Be '1'\n        $FromJson[1].Bool | Should -Be 'False'\n        $FromJson[1].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[1].Enum | Should -Be 'Kiwi'\n        $FromJson[1].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[0].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[0].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[1].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[1].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[0].EmptyList | Should -Be ''\n        $FromJson[1].EmptyList | Should -Be ''\n    }\n    It 'Hashtable Conversion' {\n        $Json = ConvertTo-PrettyObject -Object $HashTableObject, $HashTableObject -NumberAsString -BoolAsString | ConvertTo-Json\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson[0].Int | Should -Be '1'\n        $FromJson[0].Bool | Should -Be 'False'\n        $FromJson[0].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[0].Enum | Should -Be 'Kiwi'\n        $FromJson[0].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[1].Int | Should -Be '1'\n        $FromJson[1].Bool | Should -Be 'False'\n        $FromJson[1].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[1].Enum | Should -Be 'Kiwi'\n        $FromJson[1].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[0].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[0].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[1].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[1].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[0].EmptyList | Should -Be ''\n        $FromJson[1].EmptyList | Should -Be ''\n    }\n}\n\nDescribe -Name 'Testing ConvertTo-JsonLiteral Array Pipeline' {\n    It 'PSCustomObject Conversion' {\n        $Json = $PSCustomObject, $PSCustomObject | ConvertTo-PrettyObject -NumberAsString -BoolAsString | ConvertTo-Json\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson[0].Int | Should -Be '1'\n        $FromJson[0].Bool | Should -Be 'False'\n        $FromJson[0].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[0].Enum | Should -Be 'Kiwi'\n        $FromJson[0].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[1].Int | Should -Be '1'\n        $FromJson[1].Bool | Should -Be 'False'\n        $FromJson[1].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[1].Enum | Should -Be 'Kiwi'\n        $FromJson[1].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[0].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[0].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[1].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[1].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[0].EmptyList | Should -Be ''\n        $FromJson[1].EmptyList | Should -Be ''\n    }\n    It 'Ordered Dictionary Conversion' {\n        $Json = $OrderedObject, $OrderedObject | ConvertTo-PrettyObject -NumberAsString -BoolAsString | ConvertTo-Json\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson[0].Int | Should -Be '1'\n        $FromJson[0].Bool | Should -Be 'False'\n        $FromJson[0].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[0].Enum | Should -Be 'Kiwi'\n        $FromJson[0].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[1].Int | Should -Be '1'\n        $FromJson[1].Bool | Should -Be 'False'\n        $FromJson[1].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[1].Enum | Should -Be 'Kiwi'\n        $FromJson[1].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[0].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[0].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[1].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[1].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[0].EmptyList | Should -Be ''\n        $FromJson[1].EmptyList | Should -Be ''\n    }\n    It 'Hashtable Conversion' {\n        $Json = $HashTableObject, $HashTableObject | ConvertTo-PrettyObject -NumberAsString -BoolAsString | ConvertTo-Json\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson[0].Int | Should -Be '1'\n        $FromJson[0].Bool | Should -Be 'False'\n        $FromJson[0].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[0].Enum | Should -Be 'Kiwi'\n        $FromJson[0].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[1].Int | Should -Be '1'\n        $FromJson[1].Bool | Should -Be 'False'\n        $FromJson[1].Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson[1].Enum | Should -Be 'Kiwi'\n        $FromJson[1].String | Should -Be 'This a test, or maybe not;'\n        $FromJson[0].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[0].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson[1].PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[1].PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson[0].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[1].EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson[0].EmptyList | Should -Be ''\n        $FromJson[1].EmptyList | Should -Be ''\n    }\n}\nDescribe -Name 'Testing ConvertTo-JsonLiteral (bool as bool/number as number)' {\n    It 'PSCustomObject Conversion' {\n        $Json = ConvertTo-PrettyObject -Object $PSCustomObject | ConvertTo-Json\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson.Int | Should -Be 1\n        $FromJson.Bool | Should -Be $false\n        $FromJson.Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson.Enum | Should -Be 'Kiwi'\n        $FromJson.String | Should -Be 'This a test, or maybe not;'\n        $FromJson.NewLine | Should -Be ( -join ('Test,', [System.Environment]::NewLine, 'test2'))\n        $FromJson.Quotes | Should -Be 'OIo*`*sd\"`'\n        $FromJson.PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson.PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson.EmptyList | Should -Be ''\n    }\n    It 'Ordered Dictionary Conversion' {\n        $Json = ConvertTo-PrettyObject -Object $OrderedObject | ConvertTo-Json\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson.Int | Should -Be 1\n        $FromJson.Bool | Should -Be $false\n        $FromJson.Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson.Enum | Should -Be 'Kiwi'\n        $FromJson.String | Should -Be 'This a test, or maybe not;'\n        $FromJson.NewLine | Should -Be ( -join ('Test,', [System.Environment]::NewLine, 'test2'))\n        $FromJson.Quotes | Should -Be 'OIo*`*sd\"`'\n        $FromJson.PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson.PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson.EmptyList | Should -Be ''\n    }\n    It 'Hashtable Conversion' {\n        $Json = ConvertTo-PrettyObject -Object $HashTableObject | ConvertTo-Json\n        $FromJson = $Json | ConvertFrom-Json\n        $FromJson.Int | Should -Be 1\n        $FromJson.Bool | Should -Be $false\n        $FromJson.Date | Should -Be $DateTime.ToString(\"yyyy-MM-dd HH:mm:ss\")\n        $FromJson.Enum | Should -Be 'Kiwi'\n        $FromJson.String | Should -Be 'This a test, or maybe not;'\n        $FromJson.NewLine | Should -Be ( -join ('Test,', [System.Environment]::NewLine, 'test2'))\n        $FromJson.Quotes | Should -Be 'OIo*`*sd\"`'\n        $FromJson.PathWithoutSpaces | Should -Be 'C:\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\app\\7\\1Password.exe'\n        $FromJson.PathWithSpaces | Should -Be \"C:\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetwork | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.PathWithNetworkAndDots | Should -Be \"\\\\EvoWin\\c$\\Users\\przemyslaw.klys\\AppData\\Local\\1password\\This is other\\7\\1Password.exe\"\n        $FromJson.EmptyArray | Should -Be '' # when no depth, no array at all.\n        $FromJson.EmptyList | Should -Be ''\n    }\n}\nDescribe -Name 'Testing  | ConvertTo-PrettyObject string type' {\n    It 'string type conversion' {\n        # Generally it should not throw\n        $ConvertedObject = [string] | ConvertTo-PrettyObject | ConvertTo-Json | ConvertFrom-Json\n        #$ConvertedObject.Module | Should -Be 'CommonLanguageRuntimeLibrary'\n        $ConvertedObject.Namespace | Should -Be 'System'\n    }\n}\n\n\n\nDescribe -Name 'Testing ConvertTo-PrettyObject NewLines' {\n    It 'Converts the same way ConvertTo-JSON' {\n        $DataTable3 = @(\n            [PSCustomObject] @{\n                'Test1'        = 'Test' + [System.Environment]::NewLine + 'test3'\n                'Test2'        = 'Test' + [System.Environment]::NewLine + 'test3' + \"`n test\"\n                'Test3'        = 'Test' + [System.Environment]::NewLine + 'test3' + \"`r`n test\"\n                'Test4'        = 'Test' + [System.Environment]::NewLine + 'test3' + \"`r test\"\n                'Test5'        = 'Test' + \"`r`n\" + 'test3' + \"test\"\n                'Test6'        = @\"\n                Test1\n                Test2\n                Test3\n\n                Test4\n\"@\n                'Test7'        = 'Test' + \"`n`n\" + \"Oops \\n\\n\"\n                'Test8\"Oopps\"' = 'MyTest \"Ofcourse\"'\n                \"Test9'Ooops'\" = \"MyTest 'Ofcourse'\"\n            }\n        )\n\n        $Output1 = $DataTable3 | ConvertTo-PrettyObject | ConvertTo-Json | ConvertFrom-Json\n        $Output2 = $DataTable3 | ConvertTo-Json | ConvertFrom-Json\n        $Output1.Test1 | Should -Be $Output2.Test1\n        $Output1.Test2 | Should -Be $Output2.Test2\n        $Output1.Test3 | Should -Be $Output2.Test3\n        $Output1.Test4 | Should -Be $Output2.Test4\n        $Output1.Test5 | Should -Be $Output2.Test5\n        $Output1.Test6 | Should -Be $Output2.Test6\n        $Output1.'Test8\"Oopps\"' | Should -Be $Output2.'Test8\"Oopps\"'\n        $Output1.\"Test9'Ooops'\" | Should -Be $Output2.\"Test9'Ooops'\"\n    }\n}\n\n\nDescribe -Name 'Testing ConvertTo-PrettyObject Using Force' {\n    It 'Forces convesion according to first object in array' {\n        $DataTable3 = @(\n            [PSCustomObject] @{\n                'property1' = 'Test1'\n                'property2' = 'Test2'\n            }\n            [PSCustomObject] @{\n                'Property1' = 'Test1'\n                'Property2' = 'Test2'\n                'Property3' = 'Test3'\n            }\n        )\n\n        $Output1 = $DataTable3 | ConvertTo-PrettyObject -Force | ConvertTo-Json | ConvertFrom-Json\n        $Output1[0].PSObject.Properties.Name.Count | Should -Be 2\n        $Output1[1].PSObject.Properties.Name.Count | Should -Be 2\n    }\n    It 'Forces convesion according to first object in array' {\n        $DataTable3 = @(\n            [PSCustomObject] @{\n                'Property1' = 'Test1'\n                'Property2' = 'Test2'\n                'Property3' = 'Test3'\n            }\n            [PSCustomObject] @{\n                'property1' = 'Test1'\n                'property2' = 'Test2'\n            }\n        )\n        $Output1 = $DataTable3 | ConvertTo-PrettyObject -Force | ConvertTo-Json | ConvertFrom-Json\n        $Output1[0].PSObject.Properties.Name.Count | Should -Be 3\n        $Output1[1].PSObject.Properties.Name.Count | Should -Be 3\n        ($Output1[1].PSObject.Properties.Name)[0] | Should -BeExactly 'Property1' # checks case\n        ($Output1[1].PSObject.Properties.Name)[1] | Should -BeExactly 'Property2' # checks case\n    }\n}\n\n\nDescribe -Name 'Testing ConvertTo-PrettyObject Using Force' {\n    It 'Forces convesion according to first object in array' {\n        $DataTable3 = @(\n            [PSCustomObject] @{\n                'property1' = 'Test1'\n                'property2' = 'Test2'\n                'property3' = @(\n                    [PSCustomObject] @{\n                        'Property1' = 'Test1'\n                        'Property2' = 'Test2'\n                        'Property3' = 'Test3'\n                    }\n                    [PSCustomObject] @{\n                        'Property1' = 'Test1'\n                        'Property2' = 'Test2'\n                        'Property3' = 'Test3'\n                    }\n                    [PSCustomObject] @{\n                        'property1' = 'Test1'\n                        'property2' = 'Test2'\n                        'property3' = 'Test3'\n                    }\n                )\n            }\n            [PSCustomObject] @{\n                'Property1' = 'Test1'\n                'Property2' = 'Test2'\n            }\n        )\n\n        $Output1 = $DataTable3 | ConvertTo-PrettyObject -Force | ConvertTo-Json | ConvertFrom-Json\n        $Output1[0].PSObject.Properties.Name.Count | Should -Be 3\n        $Output1[1].PSObject.Properties.Name.Count | Should -Be 3\n    }\n}\n\nDescribe -Name 'Testing ConvertTo-PrettyObject with more escaping check' {\n    It 'Makes sure escaping is done properly' {\n        $DataTable3 = @(\n            [PSCustomObject] @{\n                'Tree Parent?'                                      = 'Testing Tree ?'\n                'Other Tree (Rigth)'                                = 'Ok You mean Me (Test)'\n                'Hierarchy Table Recaluculation interval (minutes)' = \"\\\\*\\NETLOGON\"\n                \"Test\"                                              = \"\\\\Ooops\\C$\\Windows\\System32\\config\\netlogon.dns\"\n                \"\\\\*\\SYSVOL\"                                        = 'Test me \\\\*\\SYSVOL and \\\\*\\NETLOGON shares.'\n                \"\\\\*\\NETLOGON\"                                      = 'Test me \\\\*\\SYSVOL and \\\\*\\NETLOGON shares.'\n                'Test^'                                             = 'Oops1'\n                \"Hello+Motto\"                                       = 'Oops2'\n                'Hello|Motto'                                       = 'Oops3'\n                'Hello{Value}'                                      = 'Oops4'\n                'Hello$Value'                                       = 'Oops5'\n                'Hello.Value'                                       = 'Oops6'\n                'Hello Value'                                       = 'Oops7.Test'\n            }\n        )\n\n        $Output1 = $DataTable3 | ConvertTo-PrettyObject | ConvertTo-Json | ConvertFrom-Json\n        $Output1[0].PSObject.Properties.Name.Count | Should -Be 13\n        $Output1[0].'Tree Parent?' | Should -BeExactly 'Testing Tree ?'\n        $Output1[0].'Other Tree (Rigth)' | Should -BeExactly 'Ok You mean Me (Test)'\n        $Output1[0].'Hierarchy Table Recaluculation interval (minutes)' | Should -BeExactly '\\\\*\\NETLOGON'\n        $Output1[0].'Test' | Should -BeExactly '\\\\Ooops\\C$\\Windows\\System32\\config\\netlogon.dns'\n        $Output1[0].'\\\\*\\SYSVOL' | Should -BeExactly 'Test me \\\\*\\SYSVOL and \\\\*\\NETLOGON shares.'\n        $Output1[0].'\\\\*\\NETLOGON' | Should -BeExactly 'Test me \\\\*\\SYSVOL and \\\\*\\NETLOGON shares.'\n        $Output1[0].'Test^' | Should -BeExactly 'Oops1'\n        $Output1[0].'Hello+Motto' | Should -BeExactly 'Oops2'\n        $Output1[0].'Hello|Motto' | Should -BeExactly 'Oops3'\n        $Output1[0].'Hello{Value}' | Should -BeExactly 'Oops4'\n        $Output1[0].'Hello$Value' | Should -BeExactly 'Oops5'\n        $Output1[0].'Hello.Value' | Should -BeExactly 'Oops6'\n        $Output1[0].'Hello Value' | Should -BeExactly 'Oops7.Test'\n    }\n}\n\n\nDescribe -Name 'Testing ConvertTo-PrettyObject against int/double' {\n    It 'Make sure int/double works' {\n        $DataTable3 = @(\n            [PSCustomObject] @{\n                Test1 = 1\n                Test2 = 1.2\n                Test3 = 1.2, 1.3, 1.4\n                Test4 = 1, 2, 3, 4, 5\n                Test5 = 1, 1.2, 1.3, 4\n            }\n        )\n\n        $Output1 = $DataTable3 | ConvertTo-PrettyObject | ConvertTo-Json | ConvertFrom-Json\n        $Output1[0].'Test1' | Should -BeExactly 1\n        $Output1[0].'Test2' | Should -BeExactly 1.2\n        $Output1[0].'Test3' | Should -BeExactly '1.2 1.3 1.4'\n        $Output1[0].'Test4' | Should -BeExactly '1 2 3 4 5'\n        $Output1[0].'Test5' | Should -BeExactly '1 1.2 1.3 4'\n    }\n}\n\nDescribe -Name 'Testing ConvertTo-PrettyObject with comprehensive null and empty input handling' {\n    It 'Handles null input without throwing errors' {\n        {\n            $result = $null | ConvertTo-PrettyObject\n        } | Should -Not -Throw\n\n        $result = $null | ConvertTo-PrettyObject\n        $result | Should -BeNullOrEmpty\n    }\n\n    It 'Handles empty array without throwing errors' {\n        {\n            $result = @() | ConvertTo-PrettyObject\n        } | Should -Not -Throw\n\n        $result = @() | ConvertTo-PrettyObject\n        $result | Should -BeNullOrEmpty\n    }\n\n    It 'Handles array with only null elements without throwing errors' {\n        {\n            $result = @($null, $null, $null) | ConvertTo-PrettyObject\n        } | Should -Not -Throw\n\n        $result = @($null, $null, $null) | ConvertTo-PrettyObject\n        $result | Should -BeNullOrEmpty\n    }\n\n    It 'Handles mixed array with null and valid PSCustomObject correctly' {\n        $testObject = [PSCustomObject]@{\n            Name  = \"TestName\"\n            Value = 42\n            Date  = Get-Date \"2023-01-01\"\n        }\n\n        {\n            $result = @($null, $testObject, $null) | ConvertTo-PrettyObject\n        } | Should -Not -Throw\n\n        $result = @($null, $testObject, $null) | ConvertTo-PrettyObject\n        $result | Should -Not -BeNullOrEmpty\n        $result.Count | Should -Be 1\n        $result.Name | Should -Be \"TestName\"\n        $result.Value | Should -Be 42\n        $result.Date | Should -Be \"2023-01-01 00:00:00\"\n    }\n\n    It 'Handles empty hashtable without throwing errors' {\n        {\n            $result = @{} | ConvertTo-PrettyObject\n        } | Should -Not -Throw\n\n        $result = @{} | ConvertTo-PrettyObject\n        $result | Should -Not -BeNullOrEmpty\n        $result.PSObject.Properties.Count | Should -Be 0\n    }\n\n    It 'Handles hashtable with null values correctly' {\n        $hashTable = @{\n            Property1 = $null\n            Property2 = \"ValidValue\"\n            Property3 = $null\n        }\n\n        {\n            $result = $hashTable | ConvertTo-PrettyObject\n        } | Should -Not -Throw\n\n        $result = $hashTable | ConvertTo-PrettyObject\n        $result | Should -Not -BeNullOrEmpty\n        $result.Property1 | Should -Be \"\"\n        $result.Property2 | Should -Be \"ValidValue\"\n        $result.Property3 | Should -Be \"\"\n    }\n\n    It 'Handles PSCustomObject with null properties correctly' {\n        $customObject = [PSCustomObject]@{\n            NullProperty        = $null\n            StringProperty      = \"Test\"\n            EmptyStringProperty = \"\"\n            NumberProperty      = 123\n        }\n\n        {\n            $result = $customObject | ConvertTo-PrettyObject\n        } | Should -Not -Throw\n\n        $result = $customObject | ConvertTo-PrettyObject\n        $result | Should -Not -BeNullOrEmpty\n        $result.NullProperty | Should -Be \"\"\n        $result.StringProperty | Should -Be \"Test\"\n        $result.EmptyStringProperty | Should -Be \"\"\n        $result.NumberProperty | Should -Be 123\n    }\n\n    It 'Handles array with mixed null objects and hashtables' {\n        $testData = @(\n            $null,\n            @{ Key1 = \"Value1\"; Key2 = $null },\n            $null,\n            [PSCustomObject]@{ Prop1 = \"Test\"; Prop2 = $null },\n            $null\n        )\n\n        {\n            $result = $testData | ConvertTo-PrettyObject\n        } | Should -Not -Throw\n\n        $result = $testData | ConvertTo-PrettyObject\n        $result | Should -Not -BeNullOrEmpty\n        $result.Count | Should -Be 2\n        $result[0].Key1 | Should -Be \"Value1\"\n        $result[0].Key2 | Should -Be \"\"\n        $result[1].Prop1 | Should -Be \"Test\"\n        $result[1].Prop2 | Should -Be \"\"\n    }\n\n    It 'Handles Force parameter with null first object' {\n        $testData = @(\n            $null,\n            [PSCustomObject]@{ Property1 = \"Test1\"; Property2 = \"Test2\" },\n            [PSCustomObject]@{ Property1 = \"Test3\"; Property3 = \"Test4\" }\n        )\n\n        {\n            $result = $testData | ConvertTo-PrettyObject -Force\n        } | Should -Not -Throw\n\n        $result = $testData | ConvertTo-PrettyObject -Force\n        $result | Should -Not -BeNullOrEmpty\n        $result.Count | Should -Be 2\n        $result[0].Property1 | Should -Be \"Test1\"\n        $result[0].Property2 | Should -Be \"Test2\"\n        $result[1].Property1 | Should -Be \"Test3\"\n    }\n\n    It 'Handles null parameter directly (not through pipeline)' {\n        {\n            $result = ConvertTo-PrettyObject -Object $null\n        } | Should -Not -Throw\n\n        $result = ConvertTo-PrettyObject -Object $null\n        $result | Should -BeNullOrEmpty\n    }\n\n    It 'Handles mixed array with various null scenarios' {\n        $testData = @(\n            $null,\n            @{},  # Empty hashtable\n            $null,\n            [PSCustomObject]@{},  # Empty PSCustomObject\n            $null,\n            [PSCustomObject]@{ ValidProp = \"Test\" },\n            $null\n        )\n\n        {\n            $result = $testData | ConvertTo-PrettyObject\n        } | Should -Not -Throw\n\n        $result = $testData | ConvertTo-PrettyObject\n        $result | Should -Not -BeNullOrEmpty\n        $result.Count | Should -Be 3  # Empty hashtable, empty PSCustomObject, and valid PSCustomObject\n\n        # First result should be the empty hashtable (should create object with no properties)\n        $result[0].PSObject.Properties.Count | Should -Be 0\n\n        # Second result should be the empty PSCustomObject (should create object with no properties)\n        $result[1].PSObject.Properties.Count | Should -Be 0\n\n        # Third result should be the valid PSCustomObject\n        $result[2].ValidProp | Should -Be \"Test\"\n    }\n\n    It 'Handles hashtable with only null and empty values' {\n        $hashTable = @{\n            NullValue   = $null\n            EmptyString = \"\"\n            EmptyArray  = @()\n            EmptyList   = [System.Collections.Generic.List[string]]::new()\n        }\n\n        {\n            $result = $hashTable | ConvertTo-PrettyObject\n        } | Should -Not -Throw\n\n        $result = $hashTable | ConvertTo-PrettyObject\n        $result | Should -Not -BeNullOrEmpty\n        $result.NullValue | Should -Be \"\"\n        $result.EmptyString | Should -Be \"\"\n        $result.EmptyArray | Should -Be \"\"\n        $result.EmptyList | Should -Be \"\"\n    }\n\n    It 'Handles PSCustomObject with complex null scenarios' {\n        $customObject = [PSCustomObject]@{\n            NullValue   = $null\n            EmptyArray  = @()\n            NestedNull  = [PSCustomObject]@{ InnerNull = $null }\n            ValidString = \"Test\"\n        }\n\n        {\n            $result = $customObject | ConvertTo-PrettyObject\n        } | Should -Not -Throw\n\n        $result = $customObject | ConvertTo-PrettyObject\n        $result | Should -Not -BeNullOrEmpty\n        $result.NullValue | Should -Be \"\"\n        $result.EmptyArray | Should -Be \"\"\n        $result.NestedNull | Should -Be \"@{InnerNull=}\"  # Nested objects become string representation\n        $result.ValidString | Should -Be \"Test\"\n    }\n\n    It 'Handles array with null elements between valid objects using ArrayJoin' {\n        $testData = @(\n            $null,\n            [PSCustomObject]@{\n                Name   = \"Test1\"\n                Values = @(\"A\", \"B\", \"C\")\n            },\n            $null,\n            [PSCustomObject]@{\n                Name   = \"Test2\"\n                Values = @(\"D\", \"E\", \"F\")\n            },\n            $null\n        )\n\n        {\n            $result = $testData | ConvertTo-PrettyObject -ArrayJoin -ArrayJoinString \",\"\n        } | Should -Not -Throw\n\n        $result = $testData | ConvertTo-PrettyObject -ArrayJoin -ArrayJoinString \",\"\n        $result | Should -Not -BeNullOrEmpty\n        $result.Count | Should -Be 2\n        $result[0].Name | Should -Be \"Test1\"\n        $result[0].Values | Should -Be \"A,B,C\"\n        $result[1].Name | Should -Be \"Test2\"\n        $result[1].Values | Should -Be \"D,E,F\"\n    }\n}"
  },
  {
    "path": "Tests/Copy-DictionaryManual.Tests.ps1",
    "content": "﻿Import-Module $PSScriptRoot\\..\\PSsharedGoods.psd1 -Force\n\nDescribe -Name 'Copy-DictionaryManual' {\n    It 'Nested Object' {\n        $Object = [ordered] @{\n            String        = 'test'\n            AnotherObject = [ordered] @{\n                Value1 = 1\n                Value2 = 2\n                Value3 = 2\n                Value4 = 2\n                Value5 = @{\n                    MoreValue1 = 1\n                    MoreValue2 = 2\n                }\n                Value6 = {\n                    New-HTMLPanel {\n                        New-HTMLText -Text 'Following chart presents Group Policy owners and whether they are administrative and consistent. By design an owner of Group Policy should be Domain Admins or Enterprise Admins group only to prevent malicious takeover. ', `\n                            \"It's also important that owner in Active Directory matches owner on SYSVOL (file system).\" -FontSize 10pt\n                        New-HTMLList -Type Unordered {\n                            New-HTMLListItem -Text 'Administrative Owners: ', $GpoZaurrOwners['Variables']['IsAdministrative'] -FontWeight normal, bold\n                            New-HTMLListItem -Text 'Non-Administrative Owners: ', $GpoZaurrOwners['Variables']['IsNotAdministrative'] -FontWeight normal, bold\n                            New-HTMLListItem -Text \"Owners consistent in AD and SYSVOL: \", $GpoZaurrOwners['Variables']['IsConsistent'] -FontWeight normal, bold\n                            New-HTMLListItem -Text \"Owners not-consistent in AD and SYSVOL: \", $GpoZaurrOwners['Variables']['IsNotConsistent'] -FontWeight normal, bold\n                        } -FontSize 10pt\n                        New-HTMLChart {\n                            New-ChartBarOptions -Type barStacked\n                            New-ChartLegend -Name 'Yes', 'No' -Color PaleGreen, Orchid\n                            New-ChartBar -Name 'Is administrative' -Value $GpoZaurrOwners['Variables']['IsAdministrative'], $GpoZaurrOwners['Variables']['IsNotAdministrative']\n                            New-ChartBar -Name 'Is consistent' -Value $GpoZaurrOwners['Variables']['IsConsistent'], $GpoZaurrOwners['Variables']['IsNotConsistent']\n                        } -Title 'Group Policy Owners' -TitleAlignment center\n                    }\n                }\n            }\n            SomethingElse = [PSCustomObject] @{\n                Value1 = 1\n                Value2 = 2\n            }\n            ScriptBlock   = {\n                Get-ChildItem\n            }\n        }\n\n        $NewObject = Copy-DictionaryManual -Dictionary $Object\n        $NewObject.SomethingElse.Value1 = 5\n        $NewObject.AnotherObject.Value1 = 5\n        $NewObject.AnotherObject.Value5.MoreValue1 = 5\n        $Object.AddedObject = 5\n\n        $NewObject.AnotherObject.Value1 | Should -Be 5\n        $NewObject.SomethingElse.Value1 | Should -Be 5\n        $Object.SomethingElse.Value1 | Should -Be 1\n        $Object.AnotherObject.Value1 | Should -Be 1\n\n        $NewObject.AnotherObject.Value5.MoreValue1 | Should -Be 5\n        $Object.AnotherObject.Value5.MoreValue1 | Should -Be 1\n\n        $NewObject.AnotherObject.Keys | Should -Be @(\n            'Value1'\n            'Value2'\n            'Value3'\n            'Value4'\n            'Value5'\n            'Value6'\n        )\n        $Object.AnotherObject.Keys | Should -Be @(\n            'Value1'\n            'Value2'\n            'Value3'\n            'Value4'\n            'Value5'\n            'Value6'\n        )\n        $Object.AddedObject | Should -Be 5\n        $NewObject.AddedObject | Should -Be $null\n\n        # Below doesn't work anymore since binary formatter is gone\n        # Doing this manually has it's own problems, but using \n\n        #(& $Object.ScriptBlock).GetType().Name | Should -be 'Object[]'\n\n        #(& $NewObject.ScriptBlock).GetType().Name | Should -be 'Object[]'\n\n        #$Object.AnotherObject.Value6.GetType().Name | Should -be 'ScriptBlock'\n        #$NewObject.AnotherObject.Value6.GetType().Name | Should -be 'ScriptBlock'\n    }\n}"
  },
  {
    "path": "Tests/Format-ToTitleCase.Tests.ps1",
    "content": "Describe -Name 'Testing Format-ToTitleCase' {\n    It 'Test very long sentence and removee some special chars and spaces' {\n        $String = Format-ToTitleCase -Text \"This is my thing: That - No I don't want all chars\" -RemoveWhiteSpace -RemoveChar ',', '-', \"'\", '\\(', '\\)', ':'\n        $String | Should -BeExactly 'ThisIsMyThingThatNoIDontWantAllChars'\n    }\n    It 'Test long sentance and remove spaces' {\n        Format-ToTitleCase -Text 'This is my thing' -RemoveWhiteSpace | Should -BeExactly 'ThisIsMyThing'\n    }\n    It 'Test pipeline with 2 strings' {\n        $String = 'me i feel', 'not feel' | Format-ToTitleCase\n        $String[0] | Should -BeExactly 'Me I Feel'\n        $String[1] | Should -BeExactly 'Not Feel'\n    }\n    It 'Testing long string' {\n        $String = 'me i feel good' | Format-ToTitleCase\n        $String | Should -BeExactly 'Me I Feel Good'\n    }\n    It 'Testing short string' {\n        Format-ToTitleCase 'MerRe' | Should -BeExactly 'Merre'\n    }\n}"
  },
  {
    "path": "Tests/Format-Transpose.Tests.ps1",
    "content": "﻿Describe -Name 'Testing Format-TransposeTable' {\n    It 'Object conversion' {\n        $T = [PSCustomObject] @{\n            Test   = 1\n            Test2  = 7\n            Ole    = 'bole'\n            Trolle = 'A'\n            Alle   = 'sd'\n        }\n        $Output = Format-TransposeTable -Object @($T)\n        $Output[0].Name | Should -BeExactly 'Test'\n        $Output[1].Name | Should -BeExactly 'Test2'\n        $Output[2].Name | Should -BeExactly 'Ole'\n        $Output[3].Name | Should -BeExactly 'Trolle'\n        $Output[4].Name | Should -BeExactly 'Alle'\n        $Output[0].'Object 0' | Should -BeExactly 1\n        $Output[1].'Object 0' | Should -BeExactly 7\n        $Output[2].'Object 0' | Should -BeExactly 'bole'\n        $Output[3].'Object 0' | Should -BeExactly 'A'\n        $Output[4].'Object 0' | Should -BeExactly 'sd'\n    }\n    It 'Object conversion - Legacy' {\n        $T = [PSCustomObject] @{\n            Test   = 1\n            Test2  = 7\n            Ole    = 'bole'\n            Trolle = 'A'\n            Alle   = 'sd'\n        }\n        $Output = Format-TransposeTable -Object @($T) -Legacy\n        $Output.Test | Should -BeExactly 1\n        $Output.Test2 | Should -BeExactly 7\n        $Output.Ole | Should -BeExactly 'bole'\n        $Output.Trolle | Should -BeExactly 'A'\n        $Output.Alle | Should -BeExactly 'sd'\n    }\n    It 'Object conversion - Property' {\n        $T = [PSCustomObject] @{\n            Test       = 1\n            Test2      = 7\n            ServerName = 'Server 1'\n            Trolle     = 'A'\n            Alle       = 'sd'\n        }\n        $Output = Format-TransposeTable -Object @($T) -Property 'ServerName'\n        $Output[0].Name | Should -BeExactly 'Test'\n        $Output[1].Name | Should -BeExactly 'Test2'\n        $Output[2].Name | Should -BeExactly 'ServerName'\n        $Output[3].Name | Should -BeExactly 'Trolle'\n        $Output[4].Name | Should -BeExactly 'Alle'\n        $Output[0].'Server 1' | Should -BeExactly 1\n        $Output[1].'Server 1' | Should -BeExactly 7\n        $Output[2].'Server 1' | Should -BeExactly 'Server 1'\n        $Output[3].'Server 1' | Should -BeExactly 'A'\n        $Output[4].'Server 1' | Should -BeExactly 'sd'\n    }\n\n    It 'Multiple Object conversion - Property' {\n        $T = [PSCustomObject] @{\n            Test       = 1\n            Test2      = 7\n            ServerName = 'Server 1'\n            Trolle     = 'A'\n            Alle       = 'sd'\n        }\n        $T2 = [PSCustomObject] @{\n            Test       = 2\n            Test2      = 8\n            ServerName = 'Server 2'\n            Trolle     = 'A'\n            Alle       = 'sd'\n        }\n        $Output = Format-TransposeTable -Object @($T, $T2) -Property 'ServerName'\n        $Output[0].Name | Should -BeExactly 'Test'\n        $Output[1].Name | Should -BeExactly 'Test2'\n        $Output[2].Name | Should -BeExactly 'ServerName'\n        $Output[3].Name | Should -BeExactly 'Trolle'\n        $Output[4].Name | Should -BeExactly 'Alle'\n        $Output[0].'Server 1' | Should -BeExactly 1\n        $Output[1].'Server 1' | Should -BeExactly 7\n        $Output[2].'Server 1' | Should -BeExactly 'Server 1'\n        $Output[3].'Server 1' | Should -BeExactly 'A'\n        $Output[4].'Server 1' | Should -BeExactly 'sd'\n\n        $Output[0].'Server 2' | Should -BeExactly 2\n        $Output[1].'Server 2' | Should -BeExactly 8\n        $Output[2].'Server 2' | Should -BeExactly 'Server 2'\n        $Output[3].'Server 2' | Should -BeExactly 'A'\n        $Output[4].'Server 2' | Should -BeExactly 'sd'\n\n    }\n}"
  },
  {
    "path": "Tests/Join-Uri.Tests.ps1",
    "content": "﻿Describe 'Join-Uri' {\n    It 'Testing Join-Uri joining two paths - 1' {\n        $JoinOutput = Join-Uri 'https://evotec.xyz/' '/wp-json/wp/v2/posts'\n        $JoinOutput | Should -Be 'https://evotec.xyz/wp-json/wp/v2/posts'\n    }\n    It 'Testing Join-Uri joining two paths - 2' {\n        $JoinOutput = Join-Uri 'https://evotec.xyz/' 'wp-json/wp/v2/posts'\n        $JoinOutput | Should -Be 'https://evotec.xyz/wp-json/wp/v2/posts'\n    }\n    It 'Testing Join-Uri joining two paths - 3' {\n        $JoinOutput = Join-Uri -BaseUri 'https://evotec.xyz/' -RelativeOrAbsoluteUri '/wp-json/wp/v2/posts'\n        $JoinOutput | Should -Be 'https://evotec.xyz/wp-json/wp/v2/posts'\n    }\n    It 'Testing Join-Uri joining two paths - 4' {\n        $JoinOutput = Join-Uri -BaseUri 'https://evotec.xyz/wp-json/wp/v2/' -RelativeOrAbsoluteUri '/posts'\n        $JoinOutput | Should -Be 'https://evotec.xyz/wp-json/wp/v2/posts'\n    }\n}"
  },
  {
    "path": "Tests/Join-UriQuery.ps1",
    "content": "﻿Describe 'Join-UriQuery' {\n    It 'Testing Join-UriQuery joining two paths and multiple queries' {\n        $JoinOutput = Join-UriQuery -BaseUri 'https://evotec.xyz/' -RelativeOrAbsoluteUri '/wp-json/wp/v2/posts' -QueryParameter ([ordered]@{\n                page     = 1\n                per_page = 20\n                search   = 'SearchString'\n            })\n        $JoinOutput | Should -Be 'https://evotec.xyz/wp-json/wp/v2/posts?page=1&per_page=20&search=SearchString'\n    }\n}"
  },
  {
    "path": "Tests/Remove-EmptyValue.Tests.ps1",
    "content": "﻿Describe -Name 'Removing of empty / null splat properties' {\n    It 'From hashtable' {\n        function Test-FunctionHashtable {\n            [cmdletBinding()]\n            param(\n                [ValidateNotNull()]$Test,\n                [string] $Test1,\n                [int] $Test5,\n                [int] $Test6\n            )\n            Write-Verbose \"Value for Test is $Test, Value for Test1 is $Test1, test5 $Test5, test6 $Test6\"\n        }\n\n        $Splat = @{\n            Test  = $NotExistingParameter\n            Test1 = 'Existing Entry'\n            Test2 = $null\n            Test3 = ''\n            Test5 = 0\n            Test6 = 6\n        }\n\n        Remove-EmptyValue -Splat $Splat\n        { Test-FunctionHashtable @Splat } | Should -Not -Throw\n    }\n    It 'From OrderedDictionary' {\n        function Test-FunctionOrderedDictionary {\n            [cmdletBinding()]\n            param(\n                [ValidateNotNull()]$Test,\n                [string] $Test1,\n                [int] $Test5,\n                [int] $Test6\n            )\n            Write-Verbose \"Value for Test is $Test, Value for Test1 is $Test1, test5 $Test5, test6 $Test6\"\n        }\n        $SplatDictionary = [ordered] @{\n            Test  = $NotExistingParameter\n            Test1 = 'Existing Entry'\n            Test2 = $null\n            Test3 = ''\n            Test5 = 0\n            Test6 = 6\n        }\n        Remove-EmptyValue -Splat $SplatDictionary\n        { Test-FunctionOrderedDictionary @SplatDictionary } | Should -Not -Throw\n    }\n    It 'From OrderedDictionary but with ExcludedProperty' {\n        $SplatDictionary = [ordered] @{\n            Test  = $NotExistingParameter\n            Test1 = 'Existing Entry'\n            Test2 = $null\n            Test3 = ''\n            Test5 = 0\n            Test6 = 6\n        }\n        Remove-EmptyValue -Splat $SplatDictionary -ExcludeParameter 'Test3'\n        $SplatDictionary['Test3'] | Should -Be ''\n    }\n    It 'From OrderedDictionary Recursive' {\n        $SplatDictionary = [ordered] @{\n            Test  = $NotExistingParameter\n            Test1 = 'Existing Entry'\n            Test2 = $null\n            Test3 = ''\n            Test5 = 0\n            Test6 = 6\n            Test7 = @{}\n        }\n        Remove-EmptyValue -Splat $SplatDictionary\n        $SplatDictionary.Keys | Should -Contain 'Test7'\n\n        Remove-EmptyValue -Splat $SplatDictionary -Recursive\n        $SplatDictionary.Keys | Should -not -Contain 'Test7'\n    }\n    It 'From OrderedDictionary Recursive with ILIST check' {\n        $SplatDictionary = [ordered] @{\n            Test  = $NotExistingParameter\n            Test1 = 'Existing Entry'\n            Test2 = $null\n            Test3 = ''\n            Test5 = 0\n            Test6 = [System.Collections.Generic.List[PSCustomObject]]::new()\n            Test7 = @{}\n        }\n        $DummyObject = [PSCustomObject] @{\n            Test  = 1\n            Test1 = 2\n        }\n        $SplatDictionary.Test6.Add($DummyObject)\n\n        Remove-EmptyValue -Splat $SplatDictionary\n        $SplatDictionary.Keys | Should -Contain 'Test6'\n        $SplatDictionary.Keys | Should -Contain 'Test7'\n\n        Remove-EmptyValue -Splat $SplatDictionary -Recursive\n        $SplatDictionary.Keys | Should -not -Contain 'Test7'\n    }\n    It 'From OrderedDictionary Recursive with ILIST check for Empty Arrays' {\n        $SplatDictionary = [ordered] @{\n            Test   = $NotExistingParameter\n            Test1  = 'Existing Entry'\n            Test2  = $null\n            Test3  = ''\n            Test5  = 0\n            Test6  = [System.Collections.Generic.List[PSCustomObject]]::new()\n            Test7  = @{}\n            Test8  = @()\n            Test9  = [System.Collections.Generic.List[PSCustomObject]]::new()\n            Test10 = @('Test')\n        }\n        $DummyObject = [PSCustomObject] @{\n            Test  = 1\n            Test1 = 2\n        }\n        $SplatDictionary.Test6.Add($DummyObject)\n\n        Remove-EmptyValue -Splat $SplatDictionary\n        $SplatDictionary.Keys | Should -Contain 'Test6'\n        $SplatDictionary.Keys | Should -Contain 'Test7'\n        $SplatDictionary.Keys | Should -not -Contain 'Test8'\n        $SplatDictionary.Keys | Should -not -Contain 'Test9'\n        $SplatDictionary.Keys | Should -Contain 'Test10'\n\n        Remove-EmptyValue -Splat $SplatDictionary -Recursive\n        $SplatDictionary.Keys | Should -not -Contain 'Test7'\n    }\n    It 'Testing edge cases' {\n        $Splat = [ordered]@{\n            PageContent = 'Text'\n            Settings    = 'Oops', 'oops'\n            Margins     = @{\n                MarginLeft    = 250\n                MarginTop     = 250\n                MarginBottom  = 200\n                MarginRight   = 100\n                MarginRight1  = 0\n                MarginRight2  = $null\n                TestBool1     = $True\n                TestBool2     = $false\n                TestBoolArray = $false, $true\n            }\n            PageSize    = 'A4'\n            Rotate1     = $False, $True, $false\n            Rotate2     = $False\n            Rotate3     = $true\n            Rotate4     = $true, $false\n            Rotate5     = ''\n            Rotate6     = $null, ''\n        }\n\n        Remove-EmptyValue -Hashtable $Splat\n        $Splat.Keys | Should -Contain 'Rotate6'\n        $Splat.Keys | Should -Not -Contain 'Rotate5'\n        $Splat.Keys | Should -Contain 'Rotate4'\n        $Splat.Keys | Should -Contain 'Rotate3'\n        $Splat.Keys | Should -Contain 'Rotate2'\n        $Splat.Keys | Should -Contain 'Rotate1'\n        $Splat.Margins.Keys | Should -Contain MarginLeft\n        $Splat.Margins.Keys | Should -Contain MarginTop\n        $Splat.Margins.Keys | Should -Contain MarginBottom\n        $Splat.Margins.Keys | Should -Contain MarginRight\n        $Splat.Margins.Keys | Should -Contain MarginRight1\n        $Splat.Margins.Keys | Should -Contain MarginRight2\n        $Splat.Margins.Keys | Should -Contain TestBool1\n        $Splat.Margins.Keys | Should -Contain TestBool2\n        $Splat.Margins.Keys | Should -Contain TestBoolArray\n\n        Remove-EmptyValue -Hashtable $Splat -Recursive\n        $Splat.Margins.Keys | Should -Not -Contain MarginRight2\n    }\n}"
  },
  {
    "path": "Tests/Select-Properties.Tests.ps1",
    "content": "Describe 'Select-Properties' {\n    It 'Select-Properties - Testing Array of PSCustomObjects' {\n\n        $Object1 = [PSCustomobject] @{\n            Name1 = '1'\n            Name2 = '3'\n            Name3 = '5'\n        }\n        $Object2 = [PSCustomobject] @{\n            Name4 = '2'\n            Name5 = '6'\n            Name6 = '7'\n        }\n\n        Select-Properties -Objects $Object1, $Object2 -AllProperties | Should -Be Name1, Name2, Name3, Name4, Name5, Name6\n        $Object1, $Object2 | Select-Properties -AllProperties | Should -Be Name1, Name2, Name3, Name4, Name5, Name6\n        $Object1, $Object2 | Select-Properties -AllProperties -ExcludeProperty Name6 -Property Name3 | Should -Be Name3\n\n    }\n    It 'Select-Properties - Testing Array of OrderedDictionary' {\n        $Object3 = [Ordered] @{\n            Name1 = '1'\n            Name2 = '3'\n            Name3 = '5'\n        }\n        $Object4 = [Ordered] @{\n            Name4 = '2'\n            Name5 = '6'\n            Name6 = '7'\n        }\n\n        Select-Properties -Objects $Object3, $Object4 -AllProperties | Should -Be Name1, Name2, Name3, Name4, Name5, Name6\n        $Object3, $Object4 | Select-Properties -AllProperties | Should -Be Name1, Name2, Name3, Name4, Name5, Name6\n    }\n}"
  },
  {
    "path": "Tests/Test-IsDistinguishedName.Tests.ps1",
    "content": "﻿Describe 'Test-IsDistinguishedName' {\n    It 'Direct input' {\n        Test-IsDistinguishedName -Identity 'CN=Domain Admins,CN=Users,DC=ad,DC=evotec,DC=pl' | Should -Be $true\n        Test-IsDistinguishedName -Identity 'CN=Domain Admins,CN=Users,DC=ad,DC=evotec,DC=pl' | Should -Be $true\n        Test-IsDistinguishedName -Identity 'ad.evotec.pl' | Should -Be $false\n        Test-IsDistinguishedName -Identity 'test.evotec.pl' | Should -Be $false\n        Test-IsDistinguishedName -Identity 'NT AUTHORITY\\INTERACTIVE' | Should -Be $false\n        Test-IsDistinguishedName -Identity 'CN=Domain Admins,CN=Users,DC=ad,DC=evotec,DC=pl' | Should -Be $true\n\n    }\n    It 'Pipeline input' {\n        'CN=Domain Admins,CN=Users,DC=ad,DC=evotec,DC=pl' | Test-IsDistinguishedName | Should -Be $true\n        'CN=Domain Admins,CN=Users,DC=ad,DC=evotec,DC=pl' | Test-IsDistinguishedName | Should -Be $true\n        'ad.evotec.pl' | Test-IsDistinguishedName | Should -Be $false\n        'test.evotec.pl' | Test-IsDistinguishedName | Should -Be $false\n        'NT AUTHORITY\\INTERACTIVE' | Test-IsDistinguishedName | Should -Be $false\n        'CN=Domain Admins,CN=Users,DC=ad,DC=evotec,DC=pl' | Test-IsDistinguishedName | Should -Be $true\n    }\n}"
  },
  {
    "path": "Website/README.md",
    "content": "# PSSharedGoods Website Content\n\nThis folder contains curated source content that the Evotec website imports for the PSSharedGoods project page.\n\n## Layout\n\n- `content/project-docs/` contains short project documentation pages shown under /projects/pssharedgoods/docs/.\n- `content/examples/` contains curated website examples shown under /projects/pssharedgoods/examples/.\n- API artifacts are not enabled from this folder yet. Add `WebsiteArtifacts/apidocs` and wire it in the website catalog only when external help/API metadata is generated and reviewed.\n\n## Editing Rules\n\n- Keep this folder intentional and small.\n- Do not mirror raw `Examples/`, `Example/`, or generated output folders into the public website.\n- Add only examples that have a clear explanation, a small code sample, and a link back to the original source file.\n- Keep links rooted at /projects/pssharedgoods/ so the same content works on localhost, evotec.xyz, and evotec.pl.\n\nThe website pipeline prefers this `Website/content/...` layout over legacy root-level content folders.\r\n\r\n"
  },
  {
    "path": "Website/content/examples/_index.md",
    "content": "---\ntitle: \"PSSharedGoods Examples\"\ndescription: \"Curated examples for PSSharedGoods.\"\nlayout: docs\n---\n\nThese examples are maintained with the PSSharedGoods repository and selected for the website because they show safe, reviewable usage patterns.\n\n## Featured examples\n\n<div class=\"ev-example-card-grid\">\n  <a class=\"ev-example-card\" href=\"./convert-identities-and-sids/\">\n    <span class=\"ev-example-card__eyebrow\">Identity</span>\n    <h3>Convert identities and SIDs</h3>\n    <p>Translate common identity formats before using them in reports or permission logic.</p>\n  </a>\n  <a class=\"ev-example-card\" href=\"./flatten-nested-objects/\">\n    <span class=\"ev-example-card__eyebrow\">Data shaping</span>\n    <h3>Flatten nested objects</h3>\n    <p>Turn nested PowerShell objects into a flatter shape for tables and exports.</p>\n  </a>\n</div>\r\n"
  },
  {
    "path": "Website/content/examples/convert-identities-and-sids.md",
    "content": "---\ntitle: \"Convert identities and SIDs\"\ndescription: \"Use PSSharedGoods identity helpers to normalize account names and SIDs.\"\nlayout: docs\n---\n\nThis pattern is useful when reporting code receives mixed domain names, local identities, and raw SID values.\n\nIt comes from the source example at `Examples/ConvertIdentity1.ps1`.\r\n\r\n## When to use this pattern\n\n- You need a consistent identity shape for reporting.\n- You receive a mix of account names and SIDs.\n- You want helper output before permission remediation.\n\n## Example\n\n```powershell\nImport-Module .\\PSSharedGoods.psd1 -Force\n\n@(\n    Convert-Identity -Identity 'Everyone'\n    Convert-Identity -Identity 'NT AUTHORITY\\SYSTEM'\n    ConvertTo-SID -Identity 'Domain Admins'\n) | Format-Table\n```\n\n## What this demonstrates\n\n- normalizing identity values\n- using helper commands before reporting\n- handling multiple identity input forms\n\n## Source\n\n- [ConvertIdentity1.ps1](https://github.com/EvotecIT/PSSharedGoods/blob/master/Examples/ConvertIdentity1.ps1)\r\n\r\n"
  },
  {
    "path": "Website/content/examples/flatten-nested-objects.md",
    "content": "---\ntitle: \"Flatten nested objects\"\ndescription: \"Use PSSharedGoods to flatten nested objects before reports or comparisons.\"\nlayout: docs\n---\n\nThis pattern is useful when an API or configuration object is too nested for a readable table.\n\nIt comes from the source example at `Examples/ConvertFlatObject.ps1`.\r\n\r\n## When to use this pattern\n\n- You need a table-friendly object shape.\n- You want to compare nested configuration snapshots.\n- You are preparing data for CSV, HTML, or console output.\n\n## Example\n\n```powershell\nImport-Module .\\PSSharedGoods.psd1 -Force\n\n$object = [ordered]@{\n    Name = 'Example'\n    Address = [ordered]@{\n        City = 'Warsaw'\n        Country = [ordered]@{ Name = 'Poland' }\n    }\n}\n\n$object | ConvertTo-FlatObject | Format-Table\n```\n\n## What this demonstrates\n\n- flattening nested hashtables\n- preparing data for exports\n- keeping report input predictable\n\n## Source\n\n- [ConvertFlatObject.ps1](https://github.com/EvotecIT/PSSharedGoods/blob/master/Examples/ConvertFlatObject.ps1)\r\n\r\n"
  },
  {
    "path": "Website/content/project-docs/docs/_index.md",
    "content": "---\ntitle: \"PSSharedGoods Docs\"\ndescription: \"Curated documentation workspace for PSSharedGoods.\"\nlayout: docs\n---\n\nPSSharedGoods is a shared PowerShell utility module used across multiple Evotec projects.\n\n## Start here\n\n- [Installation](./install/)\n- [Project overview](./overview/)\n- [Back to project overview](/projects/pssharedgoods/)\r\n"
  },
  {
    "path": "Website/content/project-docs/docs/install.md",
    "content": "---\ntitle: \"Install PSSharedGoods\"\ndescription: \"Install PSSharedGoods from the package source used by this project.\"\nlayout: docs\n---\n\nUse this page when you need the shortest setup path before trying the curated examples.\n\n## PowerShell Gallery\n\n```powershell\nInstall-Module PSSharedGoods -Scope CurrentUser\n```\n\n## Next steps\n\n- Review the [project overview](../overview/)\n- Browse the [curated examples](/projects/pssharedgoods/examples/)\r\n"
  },
  {
    "path": "Website/content/project-docs/docs/overview.md",
    "content": "---\ntitle: \"PSSharedGoods overview\"\ndescription: \"PSSharedGoods is a shared PowerShell utility module used across multiple Evotec projects.\"\nlayout: docs\n---\n\nUse PSSharedGoods when you need the common helper layer behind other Evotec modules: identity conversion, object shaping, registry/file helpers, and cross-module utility functions.\n\n## Typical use\n\n- identity and SID conversion helpers\n- object flattening and data shaping utilities\n- shared functions used by higher-level reporting modules\n\n## Related project pages\n\n- [Project overview](/projects/pssharedgoods/)\n- [Examples](/projects/pssharedgoods/examples/)\r\n"
  },
  {
    "path": "Website/content/project-docs/docs/toc.yml",
    "content": "- title: Docs Home\n  href: ./\n- title: Install\n  href: install/\n- title: Overview\n  href: overview/\r\n"
  }
]