├── AdmxPolicy.Tests ├── admx │ ├── InvalidExtension.admz │ ├── DFS.admx │ ├── ja-JP │ │ ├── DFS.adml │ │ ├── DiskDiagnostic.adml │ │ ├── CipherSuiteOrder.adml │ │ ├── ActiveXInstallService.adml │ │ └── ControlPanelDisplay.adml │ ├── CipherSuiteOrder.admx │ ├── DiskDiagnostic.admx │ ├── ActiveXInstallService.admx │ └── ControlPanelDisplay.admx └── AdmxPolicy.Tests.ps1 ├── AdmxPolicy ├── AddTypes.psm1 ├── AdmxPolicy.psd1 ├── AdmxPolicy.cs ├── AdmxPolicy.psm1 └── AdmxPolicy.format.ps1xml ├── .github └── workflows │ └── build.yml ├── LICENSE ├── .vscode └── launch.json └── README.md /AdmxPolicy.Tests/admx/InvalidExtension.admz: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /AdmxPolicy/AddTypes.psm1: -------------------------------------------------------------------------------- 1 | #requires -Version 2.0 2 | Set-Strictmode -Version 2.0 3 | # load AdmxPolicy classes 4 | # In PowerShell 2.0, this file must be loaded first. 5 | $RootPath = Split-path $script:MyInvocation.MyCommand.Path -Parent 6 | if ( $PSVersionTable.PSVersion.Major -lt 5.0 ) { 7 | # PowerShell 2.0 - 4.0 dosen't have System.Management.Automation.HiddenAttribute . 8 | Add-Type -TypeDefinition ((Get-Content (Join-Path $RootPath "AdmxPolicy.cs") -Encoding UTF8) -join "`r`n").Replace('[System.Management.Automation.HiddenAttribute]', '') 9 | } else { 10 | Add-Type -Path (Join-Path $RootPath "AdmxPolicy.cs") 11 | } 12 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | # build workflow 2 | name: build 3 | on: 4 | workflow_dispatch: 5 | jobs: 6 | # Pester test job 7 | pester-test: 8 | runs-on: windows-2019 9 | steps: 10 | # checkout 11 | - uses: actions/checkout@v2 12 | # Runs Pester all *.tests.ps1 scripts 13 | - name: Run Pester tests 14 | run: | 15 | # Pester is not installed by default on Windows Server 2019 - PowerShell 7 16 | Install-Module Pester -Force 17 | Import-Module Pester 18 | Write-Output "Run Pester $(Get-InstalledModule Pester | Select-Object -ExpandProperty Version) ..." 19 | $config = [PesterConfiguration]@{ 20 | Run = @{ 21 | Path = './AdmxPolicy.Tests/' 22 | # TestExtension is default setting (.Tests.ps1) 23 | } 24 | Output = @{ 25 | Verbosity = 'Detailed' 26 | } 27 | } 28 | Invoke-Pester -Configuration $config 29 | shell: pwsh 30 | -------------------------------------------------------------------------------- /AdmxPolicy/AdmxPolicy.psd1: -------------------------------------------------------------------------------- 1 | # 2 | # Module manifest 3 | # 4 | @{ 5 | GUID = 'b05e2e20-3743-443a-b977-5e0b93b418b4' 6 | ModuleVersion = '0.6.2' 7 | Description = 'Get Group Policy information from ADMX files.' 8 | 9 | Author = 'stknohg' 10 | CompanyName = 'stknohg' 11 | Copyright = '(c) 2017 stknohg. All rights reserved.' 12 | 13 | PowerShellVersion = '2.0' 14 | NestedModules = @('AddTypes.psm1', 'AdmxPolicy.psm1') 15 | # TypesToProcess = @() 16 | FormatsToProcess = @('AdmxPolicy.format.ps1xml') 17 | FunctionsToExport = @('Get-AdmlResource', 'Get-AdmxFileInfo', 'Get-AdmxPolicies') 18 | #AliasesToExport = @() 19 | 20 | PrivateData = @{ 21 | PSData = @{ 22 | ProjectUri = 'https://github.com/stknohg/AdmxPolicy' 23 | LicenseUri = 'https://github.com/stknohg/AdmxPolicy/blob/master/LICENSE' 24 | # IconUri = '' 25 | ReleaseNotes = 'https://github.com/stknohg/AdmxPolicy/releases' 26 | Tags = @('GroupPolicy', 'Admx', 'Adml') 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Takuya Shibata 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /AdmxPolicy.Tests/admx/DFS.admx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /AdmxPolicy.Tests/admx/ja-JP/DFS.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 表示名をここに入力する 5 | 説明をここに入力する 6 | 7 | 8 | DFS クライアントがドメイン コントローラーを発見する頻度を構成する 9 | このポリシー設定を使用すると、分散ファイル システム (DFS) クライアントがネットワーク上のドメイン コントローラーの発見を試行する頻度を構成することができます。既定では、DFS は 15 分ごとにドメイン コントローラーの発見を試行します。 10 | 11 | このポリシー設定を有効にした場合、DFS クライアントがドメイン コントローラーの発見を試行する頻度を構成することができます。この値は分単位で指定します。 12 | 13 | このポリシー設定を無効にした場合、または構成しなかった場合は、既定値である 15 分が適用されます。 14 | 15 | 注: 最小値は 15 分です。15 分よりも小さい値を指定すると、既定値の 15 分が適用されます。 16 | 17 | 18 | 19 | 時間 (分): 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // IntelliSense を使用して利用可能な属性を学べます。 3 | // 既存の属性の説明をホバーして表示します。 4 | // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | 8 | { 9 | "type": "PowerShell", 10 | "request": "launch", 11 | "name": "PowerShell Launch Current File", 12 | "script": "${file}", 13 | "args": [], 14 | "cwd": "${file}" 15 | }, 16 | { 17 | "type": "PowerShell", 18 | "request": "launch", 19 | "name": "PowerShell Launch Current File in Temporary Console", 20 | "script": "${file}", 21 | "args": [], 22 | "cwd": "${file}", 23 | "createTemporaryIntegratedConsole": true 24 | }, 25 | { 26 | "type": "PowerShell", 27 | "request": "launch", 28 | "name": "PowerShell Launch Current File w/Args Prompt", 29 | "script": "${file}", 30 | "args": [ 31 | "${command:SpecifyScriptArgs}" 32 | ], 33 | "cwd": "${file}" 34 | }, 35 | { 36 | "type": "PowerShell", 37 | "request": "attach", 38 | "name": "PowerShell Attach to Host Process", 39 | "processId": "${command:PickPSHostProcess}", 40 | "runspaceId": 1 41 | }, 42 | { 43 | "type": "PowerShell", 44 | "request": "launch", 45 | "name": "PowerShell Interactive Session", 46 | "cwd": "${workspaceRoot}" 47 | } 48 | ] 49 | } -------------------------------------------------------------------------------- /AdmxPolicy.Tests/admx/CipherSuiteOrder.admx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /AdmxPolicy.Tests/admx/ja-JP/DiskDiagnostic.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 表示名をここに入力する 5 | 説明をここに入力する 6 | 7 | 8 | 9 | 10 | 11 | デスクトップ エクスペリエンスがインストールされている Windows Server 2008、または Windows Vista 12 | 13 | 14 | 15 | ディスク診断: カスタムの警告テキストを構成する 16 | このポリシー設定により、ディスクで S.M.A.R.T. 障害が報告されたときに、ユーザーに表示するディスク診断メッセージにカスタムの警告テキストを使用します。 17 | 18 | このポリシー設定を有効にした場合は、ディスク診断メッセージにカスタムの警告テキストが表示されます。カスタム テキストは、最大 512 文字です。 19 | 20 | このポリシー設定を無効にした場合、または構成しなかった場合は、ディスク診断メッセージには既定の警告テキストが表示されます。 21 | 22 | このポリシー設定を有効にするために、再起動したり、サービスを再開したりする必要はありません。変更はすぐに有効になります。 23 | 24 | このポリシー設定は、ディスク診断シナリオ ポリシー設定が有効であるか、または構成されておらず診断ポリシー サービス (DPS) が実行状態にある場合にのみ有効です。サービスが停止している場合や無効になっている場合は、診断シナリオが実行されません。DPS は、Microsoft 管理コンソールのサービス スナップインを使用して構成できます。 25 | 26 | 注: Windows Server システムの場合、デスクトップ エクスペリエンス オプション コンポーネントがインストールされていて、リモート デスクトップ サービスの役割がインストールされていない場合にのみ、このポリシー設定が適用されます。 27 | 28 | 29 | ディスク診断 30 | ディスク診断: 実行レベルを構成する 31 | このポリシー設定は、S.M.A.R.T. ベースのディスク診断の実行レベルを決定します。 32 | 33 | S.M.A.R.T. (Self-Monitoring And Reporting Technology) は、記憶装置から Windows に障害を報告するための標準機構です。S.M.A.R.T. 障害が報告されたディスクは、修復または交換が必要な場合があります。S.M.A.R.T. 障害が発生すると、診断ポリシー サービス (DPS) によってその障害が検出され、イベント ログに記録されます。 34 | 35 | このポリシー設定を有効にした場合、DPS はユーザーにも S.M.A.R.T. 障害を警告し、データ損失の可能性を最小限にするため、バックアップおよび回復方法を示します。 36 | 37 | このポリシーを無効にした場合も、S.M.A.R.T. 障害は検出されログに記録されますが、障害への対応はありません。 38 | 39 | このポリシー設定を構成しなかった場合、DPS では S.M.A.R.T. 障害解決が既定で有効になります。 40 | 41 | このポリシー設定は、診断全体のシナリオ実行ポリシーが構成されていない場合のみ有効です。 42 | 43 | このポリシー設定を有効にするために、再起動したり、サービスを再開したりする必要はありません。変更はすぐに有効になります。 44 | 45 | このポリシー設定は、DPS が実行状態である場合にのみ有効です。サービスが停止している場合や無効になっている場合は、診断シナリオが実行されません。DPS は、Microsoft 管理コンソールのサービス スナップインを使用して構成できます。 46 | 47 | 注: Windows Server システムの場合、デスクトップ エクスペリエンス オプション コンポーネントがインストールされていて、リモート デスクトップ サービスの役割がインストールされていない場合にのみ、このポリシー設定が適用されます。 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | カスタムの警告テキストをここに入力します 56 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /AdmxPolicy.Tests/admx/DiskDiagnostic.admx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /AdmxPolicy.Tests/admx/ja-JP/CipherSuiteOrder.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 表示名をここに入力する 5 | 説明をここに入力する 6 | 7 | 8 | SSL 構成設定 9 | SSL 暗号の順位 10 | このポリシー設定では、Secure Socket Layer (SSL) で使用する暗号を決定します。 11 | 12 | このポリシー設定を有効にした場合、指定されている順位で SSL 暗号が優先されます。 13 | 14 | このポリシー設定を無効にした場合、または構成しなかった場合、既定の暗号順位が使用されます。 15 | 16 | すべての暗号に関するリンク: http://go.microsoft.com/fwlink/?LinkId=517265 17 | 18 | 19 | 20 | ECC 曲線の順位 21 | このポリシー設定では、ECDHE 暗号スイートで使用される ECC 曲線の優先順位を決定します。 22 | 23 | このポリシー設定を有効にした場合、指定されている順位で ECC 曲線が優先されます (1 行に 1 つずつ曲線名を入力してください)。 24 | 25 | このポリシー設定を無効にした場合、または構成しなかった場合、既定の ECC 曲線の順位が使用されます。 26 | 27 | 既定の曲線の順位 28 | ============ 29 | curve25519 30 | NistP256 31 | NistP384 32 | 33 | システムでサポートされているすべての曲線を表示するには、次のコマンドを使用してください。 34 | 35 | CertUtil.exe -DisplayEccCurve 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_3DES_EDE_CBC_SHA,TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_RC4_128_MD5,TLS_RSA_WITH_NULL_SHA256,TLS_RSA_WITH_NULL_SHA,TLS_PSK_WITH_AES_256_GCM_SHA384,TLS_PSK_WITH_AES_128_GCM_SHA256,TLS_PSK_WITH_AES_256_CBC_SHA384,TLS_PSK_WITH_AES_128_CBC_SHA256,TLS_PSK_WITH_NULL_SHA384,TLS_PSK_WITH_NULL_SHA256 44 | 45 | 46 | 47 | ECC 曲線名を優先順位で入力してください (1 行に 1 つの曲線名)。 48 | ECC 曲線の順位: 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AdmxPolicy 2 | 3 | Get Group Policy information from ADMX files. 4 | 5 | ## How to Install 6 | 7 | You can install it from [PowerShell Gallery](https://www.powershellgallery.com/packages/AdmxPolicy/). 8 | 9 | ```ps1 10 | Install-Module -Name AdmxPolicy -Scope CurrentUser 11 | ``` 12 | 13 | ## Usage 14 | 15 | ### Get-AdmxFileInfo 16 | 17 | Get ADMX file meta information. 18 | 19 | ```ps1 20 | Get-AdmxFileInfo -FilePath [ADMX file path] 21 | ``` 22 | 23 | e.g. 24 | 25 | ```ps1 26 | PS C:\> Get-AdmxFileInfo -FilePath "C:\Windows\PolicyDefinitions\ActiveXInstallService.admx" | Format-List 27 | 28 | 29 | Name : ActiveXInstallService.admx 30 | DisplayName : ActiveX Installer Service 31 | Description : 承認されたインストール サイトから ActiveX コントロールをインストールする 32 | Categories : {AxInstSv} 33 | ``` 34 | 35 | ### Get-AdmxPolicies 36 | 37 | Get group policy information from an ADMX file. 38 | 39 | ```ps1 40 | Get-AdmxPolicies -FilePath [ADMX file path] 41 | ``` 42 | 43 | e.g. 44 | 45 | ```ps1 46 | PS C:\> Get-AdmxPolicies -FilePath "C:\Windows\PolicyDefinitions\ActiveXInstallService.admx" | Select-Object -First 1 | Format-List 47 | 48 | 49 | Name : ApprovedActiveXInstallSites 50 | DisplayName : ActiveX コントロールの承認されたインストール サイト 51 | ExplainText : このポリシー設定では、組織の標準ユーザーがコンピューターに ActiveX コントロールをインストールする際に使用できる ActiveX インストール サイトを 52 | 決定します。この設定が有効になっている場合、管理者は、ホスト URL で指定された、承認された Activex インストール サイトの一覧を作成できます。 53 | 54 | この設定を有効にした場合、管理者は、ホスト URL で指定された、承認された ActiveX インストール サイトの一覧を作成できます。 55 | 56 | このポリシー設定を無効にした場合、または構成しなかった場合は、ActiveX コントロールのインストール前に、管理者資格情報を求めるダイアログが表示 57 | されます。 58 | 59 | 注: ホスト URL を指定する際に、ワイルドカード文字は使用できません。 60 | 61 | 62 | RegistryType : LocalMachine 63 | RegistryRootKeys : {HKEY_LOCAL_MACHINE} 64 | RegistryPath : SOFTWARE\Policies\Microsoft\Windows\AxInstaller 65 | ValueInfo : AdmxPolicy.PolicyValueInfo 66 | FileName : ActiveXInstallService.admx 67 | ``` 68 | 69 | Get group policy registry values. 70 | 71 | e.g. 72 | 73 | ```ps1 74 | PS C:\> $policy = Get-AdmxPolicies -FilePath "C:\Windows\PolicyDefinitions\ActiveXInstallService.admx" | Select-Object -First 1 75 | PS C:\> $policy.Name 76 | ApprovedActiveXInstallSites 77 | PS C:\> $policy.DisplayName 78 | ActiveX コントロールの承認されたインストール サイト 79 | PS C:\> $policy.RegistryType 80 | LocalMachine 81 | PS C:\> $policy.RegistryRootKeys 82 | HKEY_LOCAL_MACHINE 83 | PS C:\> $policy.RegistryPSDrives 84 | HKLM: 85 | PS C:\> $policy.RegistryPath 86 | SOFTWARE\Policies\Microsoft\Windows\AxInstaller 87 | PS C:\> $policy.ValueInfo 88 | 89 | RegistryValueName EnabledValue DisabledValue HasEnabledList HasDisabledList HasElements 90 | ----------------- ------------ ------------- -------------- --------------- ----------- 91 | ApprovedList Decimal : 1 Decimal : 0 False False True 92 | 93 | 94 | PS C:\> $policy.ValueInfo.Elements.Items 95 | 96 | ElementType Id RegistryPath RegistryValueName 97 | ----------- -- ------------ ----------------- 98 | List ApprovedActiveXInstallSiteslist SOFTWARE\Policies\Microsoft\Windows\AxInstaller\ApprovedActiveXInstallSites 99 | ``` 100 | 101 | ## License 102 | 103 | [MIT](./LICENSE) -------------------------------------------------------------------------------- /AdmxPolicy.Tests/admx/ja-JP/ActiveXInstallService.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ActiveX Installer Service 5 | 承認されたインストール サイトから ActiveX コントロールをインストールする 6 | 7 | 8 | ActiveX Installer Service 9 | 信頼済みゾーンのサイトに対する ActiveX のインストール ポリシーを確立する 10 | このポリシー設定では、信頼済みゾーンのサイトに対する ActiveX コントロールのインストールを制御します。 11 | 12 | このポリシー設定を有効にした場合、このポリシー設定で定義した設定に従って ActiveX コントロールがインストールされます。 13 | 14 | このポリシー設定を無効にした場合、または構成しなかった場合は、ActiveX コントロールのインストール前に確認のダイアログが表示されます。 15 | 16 | 信頼済みサイトで HTTPS プロトコルが使用されている場合、ActiveX インストーラー サービスで証明書エラーにどのように応答するかについてもこのポリシー設定で制御することができます。既定では、HTTPS 接続で送信されるサーバー証明書はすべての検証条件を満たす必要があります。証明書エラーがあることがわかっている信頼済みサイトを信頼する場合は、無視する証明書エラーを選択することができます。 17 | 18 | 注: このポリシー設定は、信頼済みゾーンのすべてのサイトに適用されます。 19 | 20 | 21 | インストールしない 22 | ユーザーに確認する 23 | 警告なしにインストールする 24 | ActiveX コントロールの承認されたインストール サイト 25 | このポリシー設定では、組織の標準ユーザーがコンピューターに ActiveX コントロールをインストールする際に使用できる ActiveX インストール サイトを決定します。この設定が有効になっている場合、管理者は、ホスト URL で指定された、承認された Activex インストール サイトの一覧を作成できます。 26 | 27 | この設定を有効にした場合、管理者は、ホスト URL で指定された、承認された ActiveX インストール サイトの一覧を作成できます。 28 | 29 | このポリシー設定を無効にした場合、または構成しなかった場合は、ActiveX コントロールのインストール前に、管理者資格情報を求めるダイアログが表示されます。 30 | 31 | 注: ホスト URL を指定する際に、ワイルドカード文字は使用できません。 32 | 33 | 34 | 35 | 36 | 37 | 信頼された発行元によって署名された ActiveX コントロールのインストール ポリシー 38 | 署名済み ActiveX コントロールのインストール ポリシー 39 | 未署名の ActiveX コントロールのインストール ポリシー 40 | 次のサーバー証明書エラーがある信頼済みサイトへの接続を許可します。 41 | 証明機関 (CA) が不明 42 | 証明書の名前 (CN) が無効 43 | 証明書検証日付の期限が切れている 44 | 証明書の使用方法が正しくない 45 | 46 | 47 | 48 | ホスト URL 49 | ホスト URL のポリシーが含まれています。 50 | 51 | ホスト名: http://activex.microsoft.com 52 | 値: 2,1,0,0 53 | 各ホスト URL の値は CSV 形式で 4 つ設定されます。 54 | これは "TPSSignedControl,SignedControl,UnsignedControl,ServerCertificatePolicy" を表します。 55 | ポリシーの左側 3 つの値は、署名に基づいて ActiveX コントロールのインストールを制御します。 56 | 以下のいずれかを指定できます。 57 | 0: ActiveX コントロールはインストールされません。 58 | 1: ActiveX コントロールのインストールを求めるメッセージがユーザーに対して表示されます。 59 | 2: ActiveX コントロールがサイレント インストールされます。 60 | 信頼された発行元ストアの証明書で署名されたコントロールは警告なしにインストールされます 61 | 署名されていないコントロールのサイレント インストールはサポートされていません。 62 | 63 | ポリシーで一番右側の値はビットマスク化されたフラグです。 64 | フラグは https 証明書エラーを無視するために使用されます。 65 | 既定値は 0 です。 66 | これは、https 接続がすべてのセキュリティ チェックに合格する必要があることを意味します。 67 | 68 | 無効な証明書エラーを無視するには、 69 | 次の値の組み合わせを使用します。 70 | 0x00000100 不明な CA を無視します。 71 | 0x00001000 無効な CN を無視します。 72 | 0x00002000 無効な証明書日付を無視します。 73 | 0x00000200 誤った証明書の使用法を無視します。 74 | 75 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /AdmxPolicy.Tests/admx/ActiveXInstallService.admx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | -------------------------------------------------------------------------------- /AdmxPolicy.Tests/AdmxPolicy.Tests.ps1: -------------------------------------------------------------------------------- 1 | BeforeAll { 2 | Import-Module (Join-Path (Split-Path $PSScriptRoot -Parent) "\AdmxPolicy\AdmxPolicy.psd1") -Force 3 | } 4 | 5 | Describe "Get-AdmlResource" { 6 | It "if the adml file was not found, throw exception." { 7 | ( { Get-AdmlResource -FilePath "$PSScriptRoot\admx\notfound.adml" }) | Should -Throw "*not found." 8 | } 9 | It "if the file extension was invalid, throw exception." { 10 | ( { Get-AdmlResource -FilePath "$PSScriptRoot\admx\InvalidExtension.admz" }) | Should -Throw "*must be .adml file." 11 | } 12 | It "get correct string messages." { 13 | $resource = Get-AdmlResource -FilePath "$PSScriptRoot\admx\ja-JP\ActiveXInstallService.adml" 14 | $resource.DisplayName | Should -Be "ActiveX Installer Service" 15 | $resource.Description | Should -Be "承認されたインストール サイトから ActiveX コントロールをインストールする" 16 | $resource.Strings.Count | Should -Be 8 17 | $resource.Strings["TrustedZonePrompt"] | Should -Be "ユーザーに確認する" 18 | } 19 | } 20 | 21 | Describe "Get-AdmxFileInfo" { 22 | It "if the admx file was not found, throw exception." { 23 | ( { Get-AdmxFileInfo -FilePath "$PSScriptRoot\admx\notfound.admx" }) | Should -Throw "*not found." 24 | } 25 | It "if the file extension was invalid, throw exception." { 26 | ( { Get-AdmxFileInfo -FilePath "$PSScriptRoot\admx\InvalidExtension.admz" }) | Should -Throw "*must be .admx file." 27 | } 28 | It "get correct file information." { 29 | $fileInfo = Get-AdmxFileInfo -FilePath "$PSScriptRoot\admx\ActiveXInstallService.admx" -CultureName "ja-JP" 30 | $fileInfo.Name | Should -Be "ActiveXInstallService.admx" 31 | $fileInfo.DisplayName | Should -Be "ActiveX Installer Service" 32 | $fileInfo.Description | Should -Be "承認されたインストール サイトから ActiveX コントロールをインストールする" 33 | $fileInfo.Categories.Count | Should -Be 1 34 | $fileInfo.Categories[0].Name | Should -Be "AxInstSv" 35 | } 36 | } 37 | 38 | Describe "Get-AdmxPolicies" { 39 | It "if the admx file was not found, throw exception." { 40 | ( { Get-AdmxPolicies -FilePath "$PSScriptRoot\admx\notfound.admx" }) | Should -Throw "*not found." 41 | } 42 | It "if the file extension was invalid, throw exception." { 43 | ( { Get-AdmxPolicies -FilePath "$PSScriptRoot\admx\InvalidExtension.admz" }) | Should -Throw "*must be .admx file." 44 | } 45 | It "get correct policy counts." { 46 | $policies = Get-AdmxPolicies -FilePath "$PSScriptRoot\admx\ActiveXInstallService.admx" -CultureName "ja-JP" 47 | $policies.Count | Should -Be 2 48 | } 49 | It "get correct policy information." { 50 | $policy = Get-AdmxPolicies -FilePath "$PSScriptRoot\admx\ActiveXInstallService.admx" -CultureName "ja-JP" ` 51 | | Where-Object { $_.Name -eq "ApprovedActiveXInstallSites"} 52 | $policy | Should -Not -BeNullOrEmpty 53 | $policy.FileName | Should -Be "ActiveXInstallService.admx" 54 | $policy.DisplayName | Should -Be "ActiveX コントロールの承認されたインストール サイト" 55 | $policy.RegistryType | Should -Be LocalMachine 56 | $policy.RegistryRootKeys.Count | Should -Be 1 57 | $policy.RegistryRootKeys[0] | Should -Be "HKEY_LOCAL_MACHINE" 58 | $policy.RegistryPSDrives.Count | Should -Be 1 59 | $policy.RegistryPSDrives[0] | Should -Be "HKLM:" 60 | $policy.RegistryPath | Should -Be "SOFTWARE\Policies\Microsoft\Windows\AxInstaller" 61 | } 62 | # tests for a single value 63 | It "if a policy doesn't have EnabledValue/DisabledValue, each property value is null." { 64 | $policy = Get-AdmxPolicies -FilePath "$PSScriptRoot\admx\ActiveXInstallService.admx" -CultureName "ja-JP" ` 65 | | Where-Object { $_.Name -eq "AxISURLZonePolicies"} 66 | $policy.ValueInfo | Should -Not -BeNullOrEmpty 67 | $policy.ValueInfo.RegistryValueName | Should -BeNullOrEmpty 68 | $policy.ValueInfo.EnabledValue | Should -BeNullOrEmpty 69 | $policy.ValueInfo.DisabledValue | Should -BeNullOrEmpty 70 | } 71 | It "get correct RegistryValueName/EnabledValue/DisabledValue(value type is Decimal)." { 72 | $policy = Get-AdmxPolicies -FilePath "$PSScriptRoot\admx\ActiveXInstallService.admx" -CultureName "ja-JP" ` 73 | | Where-Object { $_.Name -eq "ApprovedActiveXInstallSites"} 74 | $policy.ValueInfo | Should -Not -BeNullOrEmpty 75 | $policy.ValueInfo.RegistryValueName | Should -Be "ApprovedList" 76 | $policy.ValueInfo.EnabledValue.Type | Should -Be Decimal 77 | $policy.ValueInfo.EnabledValue.RegistryType | Should -Be DWord 78 | $policy.ValueInfo.EnabledValue.Value | Should -Be 1 79 | $policy.ValueInfo.DisabledValue.Type | Should -Be Decimal 80 | $policy.ValueInfo.DisabledValue.RegistryType | Should -Be DWord 81 | $policy.ValueInfo.DisabledValue.Value | Should -Be 0 82 | } 83 | It "get correct RegistryValueName/EnabledValue/DisabledValue(value type is String)." { 84 | $policy = Get-AdmxPolicies -FilePath "$PSScriptRoot\admx\ControlPanelDisplay.admx" -CultureName "ja-JP" ` 85 | | Where-Object { $_.Name -eq "CPL_Personalization_EnableScreenSaver"} 86 | $policy.ValueInfo | Should -Not -BeNullOrEmpty 87 | $policy.ValueInfo.RegistryValueName | Should -Be "ScreenSaveActive" 88 | $policy.ValueInfo.EnabledValue.Type | Should -Be String 89 | $policy.ValueInfo.EnabledValue.RegistryType | Should -Be String 90 | $policy.ValueInfo.EnabledValue.Value | Should -Be "1" 91 | $policy.ValueInfo.DisabledValue.Type | Should -Be String 92 | $policy.ValueInfo.DisabledValue.RegistryType | Should -Be String 93 | $policy.ValueInfo.DisabledValue.Value | Should -Be "0" 94 | } 95 | # tests for list values. 96 | It "if a policy doesn't have EnabledList/DisabledList, each property value is null." { 97 | $policy = Get-AdmxPolicies -FilePath "$PSScriptRoot\admx\ActiveXInstallService.admx" -CultureName "ja-JP" ` 98 | | Where-Object { $_.Name -eq "ApprovedActiveXInstallSites"} 99 | $policy.ValueInfo | Should -Not -BeNullOrEmpty 100 | $policy.ValueInfo.HasEnabledList | Should -Be $false 101 | $policy.ValueInfo.EnabledList | Should -BeNullOrEmpty 102 | $policy.ValueInfo.HasDisabledList | Should -Be $false 103 | $policy.ValueInfo.DisabledList | Should -BeNullOrEmpty 104 | } 105 | It "get correct EnabledList/DisabledList value." { 106 | $policy = Get-AdmxPolicies -FilePath "$PSScriptRoot\admx\DiskDiagnostic.admx" -CultureName "ja-JP" ` 107 | | Where-Object { $_.Name -eq "WdiScenarioExecutionPolicy"} 108 | $policy.ValueInfo | Should -Not -BeNullOrEmpty 109 | $policy.ValueInfo.HasEnabledList | Should -Be $true 110 | $policy.ValueInfo.EnabledList.Items.Count | Should -Be 2 111 | $policy.ValueInfo.EnabledList.Items[1].RegistryPath | Should -Be "SOFTWARE\Policies\Microsoft\Windows\WDI\{29689E29-2CE9-4751-B4FC-8EFF5066E3FD}" 112 | $policy.ValueInfo.EnabledList.Items[1].RegistryValueName | Should -Be "EnabledScenarioExecutionLevel" 113 | $policy.ValueInfo.EnabledList.Items[1].Value.Value | Should -Be 2 114 | $policy.ValueInfo.HasDisabledList | Should -Be $true 115 | $policy.ValueInfo.DisabledList.Items.Count | Should -Be 2 116 | $policy.ValueInfo.DisabledList.Items[1].RegistryPath | Should -Be "SOFTWARE\Policies\Microsoft\Windows\WDI\{29689E29-2CE9-4751-B4FC-8EFF5066E3FD}" 117 | $policy.ValueInfo.DisabledList.Items[1].RegistryValueName | Should -Be "EnabledScenarioExecutionLevel" 118 | $policy.ValueInfo.DisabledList.Items[1].Value.Value | Should -Be 1 119 | } 120 | # tests for Elements values. 121 | It "if a policy doesn't have Elements, each property value is null." { 122 | $policy = Get-AdmxPolicies -FilePath "$PSScriptRoot\admx\DiskDiagnostic.admx" -CultureName "ja-JP" ` 123 | | Where-Object { $_.Name -eq "WdiScenarioExecutionPolicy"} 124 | $policy.ValueInfo | Should -Not -BeNullOrEmpty 125 | $policy.ValueInfo.HasElements | Should -Be $false 126 | $policy.ValueInfo.Elements | Should -BeNullOrEmpty 127 | } 128 | It "get correct Boolean element value." { 129 | $policy = Get-AdmxPolicies -FilePath "$PSScriptRoot\admx\ActiveXInstallService.admx" -CultureName "ja-JP" ` 130 | | Where-Object { $_.Name -eq "AxISURLZonePolicies"} 131 | $policy.ValueInfo | Should -Not -BeNullOrEmpty 132 | $policy.ValueInfo.HasElements | Should -Be $true 133 | $element = $policy.ValueInfo.Elements.Items | Where-Object { $_.Id -eq "IgnoreUnknownCA" } 134 | $element | Should -Not -BeNullOrEmpty 135 | $element.ElementType | Should -Be "Boolean" 136 | $element.RegistryPath | Should -Be "" 137 | $element.RegistryValueName | Should -Be "IgnoreUnknownCA" 138 | $element.TrueValue.Type | Should -Be "Decimal" 139 | $element.TrueValue.Value | Should -Be 1 140 | $element.FalseValue.Type | Should -Be "Decimal" 141 | $element.FalseValue.Value | Should -Be 0 142 | $element.HasTrueList | Should -Be $false 143 | $element.TrueList | Should -BeNullOrEmpty 144 | $element.HasFalseList | Should -Be $false 145 | $element.FalseList | Should -BeNullOrEmpty 146 | } 147 | It "get correct Decimal element value." { 148 | $policy = Get-AdmxPolicies -FilePath "$PSScriptRoot\admx\DFS.admx" -CultureName "ja-JP" ` 149 | | Where-Object { $_.Name -eq "DFSDiscoverDC"} 150 | $policy.ValueInfo | Should -Not -BeNullOrEmpty 151 | $policy.ValueInfo.HasElements | Should -Be $true 152 | $element = $policy.ValueInfo.Elements.Items | Where-Object { $_.Id -eq "DFSDiscoverDialog" } 153 | $element | Should -Not -BeNullOrEmpty 154 | $element.ElementType | Should -Be "Decimal" 155 | $element.RegistryPath | Should -Be "" 156 | $element.RegistryValueName | Should -Be "DfsDcNameDelay" 157 | $element.MinValue | Should -Be 15 158 | $element.MaxValue | Should -Be 360 159 | $element.StoreAsText | Should -Be $false 160 | $element.Soft | Should -Be $false 161 | } 162 | # LongDecial doesn't exists? 163 | It "get correct Text element value." { 164 | $policy = Get-AdmxPolicies -FilePath "$PSScriptRoot\admx\DiskDiagnostic.admx" -CultureName "ja-JP" ` 165 | | Where-Object { $_.Name -eq "DfdAlertPolicy"} 166 | $policy.ValueInfo | Should -Not -BeNullOrEmpty 167 | $policy.ValueInfo.HasElements | Should -Be $true 168 | $element = $policy.ValueInfo.Elements.Items | Where-Object { $_.Id -eq "DfdAlertPolicyTitle" } 169 | $element | Should -Not -BeNullOrEmpty 170 | $element.ElementType | Should -Be "Text" 171 | $element.RegistryPath | Should -Be "" 172 | $element.RegistryValueName | Should -Be "DfdAlertTextOverride" 173 | $element.Required | Should -Be $true 174 | $element.MaxLength | Should -Be 512 175 | $element.Expandable | Should -Be $false 176 | $element.Soft | Should -Be $false 177 | } 178 | It "get correct MultiText element value." { 179 | $policy = Get-AdmxPolicies -FilePath "$PSScriptRoot\admx\CipherSuiteOrder.admx" -CultureName "ja-JP" ` 180 | | Where-Object { $_.Name -eq "SSLCurveOrder"} 181 | $policy.ValueInfo | Should -Not -BeNullOrEmpty 182 | $policy.ValueInfo.HasElements | Should -Be $true 183 | $element = $policy.ValueInfo.Elements.Items | Where-Object { $_.Id -eq "SSLCurveOrderList" } 184 | $element | Should -Not -BeNullOrEmpty 185 | $element.ElementType | Should -Be "MultiText" 186 | $element.RegistryPath | Should -Be "" 187 | $element.RegistryValueName | Should -Be "EccCurves" 188 | $element.Required | Should -Be $false 189 | $element.MaxLength | Should -Be 1023 190 | $element.MaxStrings | Should -Be 0 191 | $element.Soft | Should -Be $false 192 | } 193 | It "get correct Enum element value." { 194 | $policy = Get-AdmxPolicies -FilePath "$PSScriptRoot\admx\ActiveXInstallService.admx" -CultureName "ja-JP" ` 195 | | Where-Object { $_.Name -eq "AxISURLZonePolicies"} 196 | $policy.ValueInfo | Should -Not -BeNullOrEmpty 197 | $policy.ValueInfo.HasElements | Should -Be $true 198 | $element = $policy.ValueInfo.Elements.Items | Where-Object { $_.Id -eq "InstallTrustedOCX" } 199 | $element | Should -Not -BeNullOrEmpty 200 | $element.ElementType | Should -Be "Enum" 201 | $element.RegistryPath | Should -Be "" 202 | $element.RegistryValueName | Should -Be "InstallTrustedOCX" 203 | $element.Enums.Count | Should -Be 3 204 | $element.Enums[0].Key | Should -Be "インストールしない" 205 | $element.Enums[0].Value.Value.Type | Should -Be "Decimal" 206 | $element.Enums[0].Value.Value.Value | Should -Be 0 207 | $element.Enums[0].Value.HasValueList | Should -Be $false 208 | $element.Enums[0].Value.ValueList | Should -BeNullOrEmpty 209 | $element.Enums[1].Key | Should -Be "ユーザーに確認する" 210 | $element.Enums[1].Value.Value.Type | Should -Be "Decimal" 211 | $element.Enums[1].Value.Value.Value | Should -Be 1 212 | $element.Enums[1].Value.HasValueList | Should -Be $false 213 | $element.Enums[1].Value.ValueList | Should -BeNullOrEmpty 214 | $element.Enums[2].Key | Should -Be "警告なしにインストールする" 215 | $element.Enums[2].Value.Value.Type | Should -Be "Decimal" 216 | $element.Enums[2].Value.Value.Value | Should -Be 2 217 | $element.Enums[2].Value.HasValueList | Should -Be $false 218 | $element.Enums[2].Value.ValueList | Should -BeNullOrEmpty 219 | } 220 | It "get correct List element value." { 221 | $policy = Get-AdmxPolicies -FilePath "$PSScriptRoot\admx\ActiveXInstallService.admx" -CultureName "ja-JP" ` 222 | | Where-Object { $_.Name -eq "ApprovedActiveXInstallSites"} 223 | $policy.ValueInfo | Should -Not -BeNullOrEmpty 224 | $policy.ValueInfo.HasElements | Should -Be $true 225 | $element = $policy.ValueInfo.Elements.Items | Where-Object { $_.Id -eq "ApprovedActiveXInstallSiteslist" } 226 | $element | Should -Not -BeNullOrEmpty 227 | $element.ElementType | Should -Be "List" 228 | $element.RegistryPath | Should -Be "SOFTWARE\Policies\Microsoft\Windows\AxInstaller\ApprovedActiveXInstallSites" 229 | $element.RegistryValueName | Should -Be "" 230 | $element.ValuePrefix | Should -Be "" 231 | $element.Additive | Should -Be $true 232 | $element.Expandable | Should -Be $false 233 | $element.ExplicitValue | Should -Be $true 234 | $element.ClientExtension | Should -Be "" 235 | } 236 | } 237 | -------------------------------------------------------------------------------- /AdmxPolicy.Tests/admx/ControlPanelDisplay.admx: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 26 | 27 | 28 | 29 | 34 | 35 | 36 | 37 | 38 | 43 | 44 | 45 | 46 | 51 | 52 | 53 | 54 | 59 | 60 | 61 | 62 | 1 63 | 64 | 65 | 0 66 | 67 | 68 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 84 | 85 | 86 | 87 | 1 88 | 89 | 90 | 0 91 | 92 | 93 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 109 | 110 | 111 | 112 | 117 | 118 | 119 | 120 | 125 | 126 | 127 | 128 | 133 | 134 | 135 | 136 | 141 | 142 | 143 | 144 | 149 | 150 | 151 | 152 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 168 | 169 | 170 | 171 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 187 | 188 | 189 | 190 | 195 | 196 | 197 | 198 | 203 | 204 | 205 | 206 | 211 | 212 | 213 | 214 | 219 | 220 | 221 | 222 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 250 | 251 | 252 | 253 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | -------------------------------------------------------------------------------- /AdmxPolicy.Tests/admx/ja-JP/ControlPanelDisplay.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 表示名をここに入力する 4 | 説明をここに入力する 5 | 6 | 7 | 画面 8 | コントロール パネルの [画面] を無効にする 9 | コントロール パネルの [画面] を無効にします。 10 | 11 | この設定を有効にした場合、コントロール パネルの [画面] は起動されなくなります。ユーザーが [画面] を開始すると、操作は設定によって禁止されているという内容のエラー メッセージが表示されます。 12 | 13 | [コントロール パネルへのアクセスを禁止する] (ユーザーの構成\管理用テンプレート\コントロール パネル) 設定および [[設定] メニューのプログラムを削除する] (ユーザーの構成\管理用テンプレート\タスク バーと [スタート] メニュー) 設定も参照してください。 14 | [設定] タブを非表示にする 15 | コントロール パネルの [画面] から [設定] タブを削除します。 16 | 17 | この設定を有効にした場合、ユーザーはコントロール パネルを使ってコンピューターの画面の設定を追加、構成、または変更することはできなくなります。 18 | 個人用設定 19 | 色とデザインを変更できないようにする 20 | コントロール パネルの [個人用設定] で [色] (または [ウィンドウの色]) ページを無効にする、または個人用設定機能を使用できないシステム上のコントロール パネルで [画面] の [配色] ダイアログを無効にします。 21 | 22 | この設定を使用すると、ユーザーはコントロール パネルを使用して、デスクトップとウィンドウのウィンドウの境界線とタスク バーの色 (Windows 8 の場合)、グラス色 (Windows Vista および Windows 7 の場合)、または配色を変更できなくなります。 23 | 24 | この設定が無効の場合、または構成されていない場合、[色] (または [ウィンドウの色]) ページまたは [配色] ダイアログをコントロール パネルの [個人用設定] または [画面] で使用できます。 25 | 26 | Windows Vista 以前のシステムでは、この設定によってコントロール パネルの [デスクトップの表示とテーマ] タブおよびコントロール パネルの [画面] が表示されなくなります。 27 | スクリーン セーバーを変更できないようにする 28 | コントロール パネルの [個人用設定] または [画面] から [スクリーン セーバー] ダイアログを表示できないようにします。 29 | 30 | この設定を使用すると、ユーザーはコントロール パネルを使用してコンピューター上のスクリーン セーバーの追加、構成、変更が行えなくなります。この場合もスクリーン セーバーは実行できます。 31 | 32 | 33 | スクリーン セーバーを有効にする 34 | デスクトップ スクリーン セーバーを有効にします。 35 | 36 | この設定を無効にした場合、スクリーン セーバーは実行されなくなります。また、コントロール パネルの [個人用設定] または [画面] の [スクリーン セーバー] ダイアログにある [スクリーン セーバー] セクションが無効になります。そのため、ユーザーはスクリーン セーバー オプションを変更できなくなります。 37 | 38 | この設定を構成しない場合、システム上の影響はありません。 39 | 40 | この設定を有効にした場合、次の 2 つの条件を前提としてスクリーン セーバーが実行されます。まず、クライアント上の有効なスクリーン セーバーがクライアント コンピューター上の [スクリーン セーバーの実行可能ファイル名] 設定またはコントロール パネルを使用して指定されていること。次に、スクリーン セーバーのタイムアウトがこの設定またはコントロール パネルで 0 以外の値に設定されていること。 41 | 42 | [スクリーン セーバーを変更できないようにする] 設定も参照してください。 43 | 特定のスクリーン セーバーを強制する 44 | ユーザーのデスクトップのスクリーン セーバーを指定します。 45 | 46 | この設定を有効にした場合、システムでユーザーのデスクトップ上に指定したスクリーン セーバーが表示されます。また、この設定によってコントロール パネルの [個人用設定] または [画面] の [スクリーン セーバー] ダイアログにあるスクリーン セーバーのドロップダウン リストが無効になります。そのため、ユーザーはスクリーン セーバー オプションを変更できなくなります。 47 | 48 | この設定を有効にした場合、スクリーン セーバーが保存されているファイル名を .scr ファイル名拡張子を含めて入力します。スクリーン セーバー ファイルが %Systemroot%\System32 ディレクトリにない場合、そのファイルへの完全修飾パスを入力します。 49 | 50 | 指定されたスクリーン セーバーが設定の適用先コンピューター上にインストールされていない場合、設定は無視されます。 51 | 52 | 注: この設定は、[スクリーン セーバーを有効にする] 設定によって上書きされることがあります。 [スクリーン セーバーを有効にする] 設定が無効になっている場合、この設定は無視され、スクリーン セーバーは実行されません。 53 | スクリーン セーバーをパスワードで保護する 54 | コンピューター上で使用するスクリーン セーバーをパスワードで保護するかどうかを判断します。 55 | 56 | この設定を有効にした場合、すべてのスクリーン セーバーはパスワードで保護されます。この設定を無効にした場合、スクリーン セーバーにパスワード保護を設定することはできません。 57 | 58 | また、この設定によってコントロール パネルの [個人用設定] または [画面] の [スクリーン セーバー] ダイアログにある [パスワード保護] チェック ボックスが無効になります。そのため、ユーザーはパスワード保護設定を変更できなくなります。 59 | 60 | コンピューターが確実にパスワード保護されるようにするには、[スクリーン セーバーを有効にする] 設定を有効にし、[スクリーン セーバーのタイムアウト] 設定を使用してタイムアウトを設定します。 61 | 62 | 注: [スクリーン セーバー] ダイアログを削除するには、[スクリーン セーバーを変更できないようにする] 設定を使用します。 63 | スクリーン セーバーのタイムアウト 64 | コンピューターがアイドル状態になってからスクリーン セーバーが起動されるまでの時間を指定します。 65 | 66 | アイドル時間が構成されている場合は、1 秒から 86,400 秒 (24 時間) の間の数値を指定できます。値を 0 に設定した場合は、スクリーン セーバーは起動されません。 67 | 68 | この設定は次のような状況では何も影響しません。 69 | 70 | - 設定が無効になっているか、構成されていない。 71 | 72 | - 待ち時間が 0 に設定されている。 73 | 74 | - [スクリーン セーバーを有効にする] 設定が無効になっている。 75 | 76 | - [スクリーン セーバーの実行可能ファイル名] 設定、およびクライアント コンピューターのコントロール パネルにある [個人用設定] または [画面] の [スクリーン セーバー] ダイアログで、クライアント上にある既存の有効なスクリーン セーバー プログラムが指定されていない。 77 | 78 | この設定を構成しなかった場合は、コントロール パネルの [個人用設定] または [画面] の [スクリーン セーバー] ダイアログで指定された待ち時間が使用されます。既定値は 15 分です。 79 | デスクトップの背景を変更できないようにする 80 | ユーザーがデスクトップの背景デザインを追加または変更できないようにします。 81 | 82 | 既定では、ユーザーはコントロール パネルの [個人用設定] または [画面] の [デスクトップの背景] ページを使用してデスクトップの背景デザイン (壁紙) をデスクトップに追加できます。 83 | 84 | この設定を有効にした場合、ユーザーは [デスクトップの背景] 設定を変更できなくなります。 85 | 86 | グループ用に壁紙を指定するには、[デスクトップの壁紙] 設定を使用してください。 87 | 88 | 注意: [デスクトップの壁紙] 設定を有効にして、デスクトップの壁紙をユーザーが変更できないようにする必要もあります。詳細については、サポート技術情報の記事 Q327998 を参照してください。 89 | 90 | また、[ビットマップ形式の壁紙のみ有効にする] 設定も参照してください。 91 | サウンドを変更できないようにする 92 | ユーザーがサウンド設定を変更できないようにします。 93 | 94 | 既定では、ユーザーはコントロール パネルの [サウンド] の [サウンド] タブを使用してシステムのサウンド設定を追加、削除、または変更できます。 95 | 96 | この設定を有効にした場合、ユーザーは [サウンド設定] 設定を変更できなくなります。 97 | マウス ポインターを変更できないようにする 98 | ユーザーがマウス ポインターを変更できないようにします。 99 | 100 | 既定では、ユーザーはコントロール パネルの [マウス] の [ポインター] タブを使用してマウス ポインターを追加、削除、または変更できます。 101 | 102 | この設定を有効にした場合、ユーザーはマウス ポインター設定を変更できなくなります。 103 | デスクトップ アイコンを変更できないようにする 104 | ユーザーがデスクトップ アイコンを変更できないようにします。 105 | 106 | 既定では、ユーザーはコントロール パネルの [個人用設定] または [画面] の [デスクトップ アイコンの設定] ダイアログを使用してデスクトップ アイコンの表示、非表示、または変更設定が行えます。 107 | 108 | この設定を有効にした場合、ユーザーはデスクトップ アイコンを変更できなくなります。 109 | 110 | Windows Vista 以前のシステムでは、この設定によってコントロール パネルの [画面] の [デスクトップ] タブが表示されなくなります。 111 | 配色を変更できないようにする 112 | この設定は、テーマで使われる色を既定の色設定に準拠させます。 113 | 114 | この設定を有効にした場合、ユーザーは現在のデスクトップ テーマの色設定を変更することができません。 115 | 116 | この設定を無効にした場合、または構成しなかった場合は、ユーザーは現在のデスクトップ テーマの色設定を変更することができます。 117 | 118 | Windows 7 以降では、[色とデザインを変更できないようにする] 設定を使用してください。 119 | テーマを変更できないようにする 120 | この設定は、コントロール パネルの [個人用設定] にあるテーマ ギャラリーの設定を無効にします。 121 | 122 | この設定を有効にした場合、ユーザーはテーマを変更または保存することができません。 この場合も、デスクトップの背景、色、サウンド、スクリーン セーバーなどの要素は変更できます (これらが無効になるようにポリシーが設定されていない限り)。 123 | 124 | この設定を無効にした場合、または構成しなかった場合は、何も影響はありません。 125 | 126 | 注意: この設定を有効にし、[特定のテーマを適用する] 設定を使用してテーマを指定しなかった場合、テーマはユーザーが以前設定した既定の設定、またはシステムの既定の設定に戻ります。 127 | 特定のテーマを読み込む 128 | ユーザーが初めてログオンしたときにコンピューターに適用するテーマ ファイルを指定します。 129 | 130 | この設定を有効にした場合、新しいユーザーが初めてログオンしたときに、指定したテーマが適用されます。 この設定を有効にした場合も、ユーザーは初回のログオン後に、テーマや、デスクトップの背景、色、サウンド、スクリーン セーバーなどのテーマ要素を変更できます。 131 | 132 | この設定を無効にした場合、または構成しなかった場合は、初回のログオン時に既定のテーマが適用されます。 133 | ウィンドウとボタンの視覚スタイルを変更できないようにする 134 | 画面上に表示されたウィンドウやボタンの視覚スタイルをユーザーまたはアプリケーションが変更できないようにします。 135 | 136 | Windows XP でこの設定を有効にした場合、[画面のプロパティ] の [デザイン] タブにある [ウィンドウとボタン] のドロップダウン リストは使用不可になります。 137 | 138 | Windows XP 以降のシステムでこの設定を有効にした場合、ユーザーおよびアプリケーションはコマンド ラインから視覚スタイルを変更できなくなります。 また、ユーザーはテーマの変更時に他の視覚スタイルを適用することはできなくなります。 139 | 特定の視覚スタイル ファイルを強制するか、または Windows クラシックを強制する 140 | この設定を使用すると、視覚スタイル ファイルへのパス (場所) を入力することで、その視覚スタイル ファイルを強制することができます。 141 | 142 | ローカル コンピューターの視覚スタイル (aero.msstyles)、またはリモート サーバーにあるファイルを UNC 形式 (\\サーバー\共有\aero.msstyles) で指定します。 143 | 144 | この設定を有効にした場合、指定された視覚スタイル ファイルが使用されます。また、ユーザーはテーマの変更時に他の視覚スタイルを適用することはできなくなります。 145 | 146 | この設定を無効にした場合、または構成しなかった場合は、ユーザーはテーマの変更時に使用する視覚スタイルを選択できます (コントロール パネルの [個人用設定] を使用できる場合)。 147 | 148 | 注: この設定を有効にしてファイルがユーザーのログオン時に利用できない場合は、既定の視覚スタイルが読み込まれます。 149 | 150 | 注: Windows XP で Luna 視覚スタイルを選択するには次のように入力します: %windir%\resources\Themes\Luna\Luna.msstyles 151 | 152 | 注: Windows クラシックを選択するには、[視覚スタイル ファイルへのパス] ボックスを空欄にし、この設定を有効にします。Windows 8 または Windows RT を実行しているときは、"Windows クラシック" 視覚スタイルを適用できません。 153 | 視覚スタイルのフォント サイズを変更できないようにする 154 | 画面上のウィンドウやボタンに表示されるフォントのサイズをユーザーが変更できないようにします。 155 | 156 | この設定を有効にした場合、[画面のプロパティ] の [デザイン] タブにある [フォント サイズ] ボックスは使用できなくなります。 157 | 158 | この設定を無効にした場合、または構成しなかった場合は、ユーザーは [デザイン] タブの [フォント サイズ] ボックスを使ってフォントのサイズを変更することができます。 159 | ロック画面を表示しない 160 | このポリシー設定では、ロック画面をユーザーに表示するかどうかを制御します。 161 | 162 | このポリシー設定を有効にした場合、サインイン前に Ctrl + Alt + Del キーを押す必要がないユーザーが PC をロックした後、選ばれたタイルが表示されます。 163 | 164 | このポリシー設定を無効にした場合、または構成しなかった場合、サインイン前に Ctrl + Alt + Del キーを押す必要がないユーザーが PC をロックした後、ロック画面が表示されます。ロック画面を閉じるには、タッチまたはキーボードを使うか、マウスで画面をドラッグする必要があります。 165 | 166 | 注意: この設定は、Enterprise SKU、Education SKU、Server SKU にのみ適用されます。 167 | ロック画面とログオン イメージを変更できないようにする 168 | ユーザーが、コンピューターのロック時またはログオン画面に表示される背景画像を変更できないようにします。 169 | 170 | 既定では、ユーザーは、コンピューターのロック時またはログオン画面に表示される背景画像を変更できます。 171 | 172 | この設定を有効にした場合、ユーザーは、ロック画面とログオン イメージを変更できなくなり、代わりに既定のイメージが表示されます。 173 | 174 | 注意: この設定は、Enterprise SKU、Education SKU、Server SKU にのみ適用されます。 175 | 特定の既定のロック画面とログオン イメージを強制する 176 | この設定を使用すると、イメージ ファイルへのパス (場所) を入力することで、その既定のロック画面とログオン イメージを強制することができます。ロック画面とログオン画面の両方に同じイメージが使用されます。 177 | 178 | この設定では、ユーザーがサインインしていないときに表示される既定のロック画面とログオン イメージを指定できるようにし、また、指定されたイメージをすべてのユーザーの既定に設定します (受信トレイの既定のイメージを置き換えます)。 179 | 180 | このポリシーを使うには、既定のロック画面とログオン イメージへの完全修飾パスとファイル名を入力します。C:\windows\web\screen\lockscreen.jpg などのローカル パス、または \\サーバー\共有\Corp.jpg などの UNC パスを入力できます。 181 | 182 | これは、指定されたロック画面とログオン イメージが常に強制的に表示されるようにするため、"ロック画面とログオン イメージを変更できないようにする" 設定とともに使用できます。 183 | 184 | 注: この設定は、ドメインに参加しているコンピューターにのみ適用され、Enterprise SKU、Education SKU、および Server SKU では無条件に適用されます。 185 | ロック画面カメラを有効にできないようにする 186 | PC 設定でロック画面カメラのトグル スイッチを無効にし、ロック画面でカメラを呼び出せないようにします。 187 | 188 | 既定では、ユーザーはロック画面で使用可能なカメラを呼び出すことができます。 189 | 190 | この設定を有効にした場合、ユーザーは、PC 設定でロック画面カメラへのアクセスを有効または無効にできなくなり、ロック画面でカメラを呼び出せなくなります。 191 | ロック画面スライド ショーを有効にできないようにする 192 | PC 設定でロック画面スライド ショー設定を無効にし、ロック画面でスライド ショーを再生できないようにします。 193 | 194 | 既定では、ユーザーは、コンピューターのロック後に実行されるスライド ショーを有効にできます。 195 | 196 | この設定を有効にした場合、ユーザーは、PC 設定でスライド ショー設定を修正できなくなり、スライド ショーが開始されることもなくなります。 197 | 特定の背景とアクセント カラーを強制する 198 | 背景とアクセントに指定した色を使用するよう Windows に強制します。色の値は 16 進数の #RGB 形式で指定します。 199 | 200 | 既定では、ユーザーは、背景とアクセント カラーを変更できます。 201 | 202 | この設定を有効にした場合、Windows の背景とアクセント カラーは指定した色に設定され、ユーザーはその色を変更できません。指定した色が白色のテキストで 2:1 のコントラスト比を実現できない場合、この設定は適用されません。 203 | 特定のスタート画面の背景を強制する 204 | 利用可能な背景 (1 ~ 20 個の背景) の 1 つを使用するようスタート画面に強制し、ユーザーがその背景を変更できないようにします。 205 | 206 | この設定に 0 を指定した場合、または構成しなかった場合、スタート画面では既定の背景が使用され、ユーザーは背景を変更できます。 207 | 208 | この設定に 0 以外の値を指定した場合、スタート画面では指定した背景が使用され、ユーザーは背景を変更できません。指定した背景がサポートされていない場合は、既定の背景が使用されます。 209 | 210 | [スタート] メニューの背景を変更できないようにする 211 | ユーザーが [スタート] メニューの背景の外観 (色やアクセントなど) を変更できないようにします。 212 | 213 | 既定では、ユーザーは [スタート] メニューの背景の外観 (色やアクセントなど) を変更できます。 214 | 215 | この設定を有効にした場合、ユーザーは、既定の [スタート] メニューの背景と色が割り当てられ、その背景と色を変更できません。 216 | 217 | サポートされているバージョンの Windows で "特定の背景とアクセント カラーを強制する" ポリシーも設定されている場合は、その色がこのポリシーよりも優先されます。 218 | 219 | サポートされているバージョンの Windows で "特定のスタート画面の背景を強制する" ポリシーも設定されている場合、その背景がこのポリシーよりも優先されます。 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | スクリーン セーバーを起動するまでの時間 (秒) 231 | 232 | 時間 (秒): 233 | 234 | 235 | 236 | 237 | 238 | Aero の種類を選択するには: 239 | %windir%\resources\Themes\Aero\aero.msstyles 240 | 241 | 他の視覚スタイルを選択するには: 242 | ie: \\<サーバー>\share\Corp.msstyles 243 | 244 | Windows クラシックを選択するには、上のボックスを 245 | 空欄のままにして、この設定を有効にします。 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 例: ローカル パスの例: C:\windows\web\screen\lockscreen.jpg 257 | 例: UNC パスの例: \\Server\Share\Corp.jpg 258 | 259 | ロック画面にトリビアやヒントなどの情報を表示しない 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 背景 ID: 271 | 272 | 273 | 274 | 275 | -------------------------------------------------------------------------------- /AdmxPolicy/AdmxPolicy.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | namespace AdmxPolicy 4 | { 5 | [Flags] 6 | public enum RegistryTypes 7 | { 8 | Unknown = 0, 9 | LocalMachine = 1, 10 | CurrentUser = 2, 11 | Both = LocalMachine + CurrentUser 12 | } 13 | 14 | public sealed class AdmlResource 15 | { 16 | private string _DisplayName; 17 | public string DisplayName { get { return _DisplayName; } } 18 | private string _Description; 19 | public string Description { get { return _Description; } } 20 | private Dictionary _Strings = new Dictionary(); 21 | public Dictionary Strings { get { return _Strings; } } 22 | private Dictionary _Windows = new Dictionary(); 23 | public Dictionary Windows { get { return _Windows; } } 24 | public AdmlResource() 25 | { 26 | _DisplayName = ""; 27 | _Description = ""; 28 | } 29 | public AdmlResource(string displayName, string description) 30 | { 31 | _DisplayName = displayName; 32 | _Description = description; 33 | } 34 | } 35 | 36 | public sealed class AdmxFileInfo 37 | { 38 | private string _Name; 39 | public string Name { get { return _Name; } } 40 | private string _DisplayName; 41 | public string DisplayName { get { return _DisplayName; } } 42 | private string _Description; 43 | public string Description { get { return _Description; } } 44 | private List _Categories = new List(); 45 | public List Categories { get { return _Categories; } } 46 | public AdmxFileInfo(string name, string displayName, string description) 47 | { 48 | _Name = name; 49 | _DisplayName = displayName; 50 | _Description = description; 51 | } 52 | public override string ToString() 53 | { 54 | return _Name; 55 | } 56 | } 57 | 58 | public sealed class CategoryInfo 59 | { 60 | private string _Name; 61 | public string Name { get { return _Name; } } 62 | private string _DisplayName; 63 | public string DisplayName { get { return _DisplayName; } } 64 | public CategoryInfo(string name, string displayName) 65 | { 66 | _Name = name; 67 | _DisplayName = displayName; 68 | } 69 | } 70 | 71 | public sealed class PolicyInfo 72 | { 73 | private AdmxFileInfo _FileInfo; 74 | public AdmxFileInfo FileInfo { get { return _FileInfo; } } 75 | public string FileName { get { return _FileInfo == null ? "" : _FileInfo.Name; } } 76 | private string _Name; 77 | public string Name { get { return _Name; } } 78 | private string _DisplayName; 79 | public string DisplayName { get { return _DisplayName; } } 80 | private string _ExplainText; 81 | public string ExplainText { get { return _ExplainText; } } 82 | private RegistryTypes _RegistryType; 83 | public RegistryTypes RegistryType { get { return _RegistryType; } } 84 | public string[] RegistryRootKeys 85 | { 86 | get 87 | { 88 | switch (_RegistryType) 89 | { 90 | case RegistryTypes.LocalMachine: { return new string[] { "HKEY_LOCAL_MACHINE" }; } 91 | case RegistryTypes.CurrentUser: { return new string[] { "HKEY_CURRENT_USER" }; } 92 | case RegistryTypes.Both: { return new string[] { "HKEY_LOCAL_MACHINE", "HKEY_CURRENT_USER" }; } 93 | default: { return new string[] { "" }; } 94 | } 95 | } 96 | } 97 | public string[] RegistryPSDrives 98 | { 99 | get 100 | { 101 | switch (_RegistryType) 102 | { 103 | case RegistryTypes.LocalMachine: { return new string[] { "HKLM:" }; } 104 | case RegistryTypes.CurrentUser: { return new string[] { "HKCU:" }; } 105 | case RegistryTypes.Both: { return new string[] { "HKLM:", "HKCU:" }; } 106 | default: { return new string[] { "" }; } 107 | } 108 | } 109 | } 110 | private string _RegistryPath; 111 | public string RegistryPath { get { return _RegistryPath; } } 112 | private PolicyValueInfo _ValueInfo; 113 | public PolicyValueInfo ValueInfo { get { return _ValueInfo; } } 114 | public PolicyInfo(AdmxFileInfo fileInfo, string name, string displayName, string explainText, 115 | RegistryTypes registryType, string registryPath, PolicyValueInfo valueInfo) 116 | { 117 | _FileInfo = fileInfo; 118 | _Name = name; 119 | _DisplayName = displayName; 120 | _ExplainText = explainText; 121 | _RegistryType = registryType; 122 | _RegistryPath = registryPath; 123 | _ValueInfo = valueInfo; 124 | } 125 | } 126 | 127 | public enum ValueTypes 128 | { 129 | Unknown = 0, 130 | Delete, 131 | Decimal, 132 | LongDecimal, 133 | String 134 | } 135 | 136 | // same values as Microsoft.Win32.RegistryValueKind 137 | public enum RegistryValueKind 138 | { 139 | Unknown = 0, 140 | String = 1, 141 | DWord = 4, 142 | MultiString = 7, 143 | QWord = 11, 144 | None = -1 145 | } 146 | 147 | public sealed class ValueDefinition 148 | { 149 | private ValueTypes _Type; 150 | public ValueTypes Type { get { return _Type; } } 151 | public RegistryValueKind RegistryType 152 | { 153 | get 154 | { 155 | switch (_Type) 156 | { 157 | case ValueTypes.Delete: { return RegistryValueKind.None; } 158 | case ValueTypes.Decimal: { return RegistryValueKind.DWord; } 159 | case ValueTypes.LongDecimal: { return RegistryValueKind.QWord; } 160 | case ValueTypes.String: { return RegistryValueKind.String; } 161 | default: { return RegistryValueKind.Unknown; } 162 | } 163 | } 164 | } 165 | private object _Value; 166 | public object Value { get { return _Value; } } 167 | public ValueDefinition(ValueTypes type, object value) 168 | { 169 | _Type = type; 170 | _Value = value; 171 | } 172 | public override string ToString() 173 | { 174 | return String.Format("{0} : {1}", _Type, _Value); 175 | } 176 | } 177 | 178 | public static class DefaultValueDefinition 179 | { 180 | // maybe, maybe... 181 | public static readonly ValueDefinition Enabled = new ValueDefinition(ValueTypes.Decimal, (UInt32)1); 182 | public static readonly ValueDefinition Disabled = new ValueDefinition(ValueTypes.Delete, null); 183 | } 184 | 185 | public sealed class ValueDefinitionList 186 | { 187 | private List _Items = new List(); 188 | public List Items { get { return _Items; } } 189 | private string _DefaultRegistryPath; 190 | public string DefaultRegistryPath { get { return _DefaultRegistryPath; } } 191 | public ValueDefinitionList() 192 | { 193 | _DefaultRegistryPath = ""; 194 | } 195 | public ValueDefinitionList(string defaultRegistryPath) 196 | { 197 | _DefaultRegistryPath = defaultRegistryPath; 198 | } 199 | } 200 | 201 | public sealed class ListItem 202 | { 203 | private string _RegistryPath; 204 | public string RegistryPath { get { return _RegistryPath; } } 205 | private string _RegistryValueName; 206 | public string RegistryValueName { get { return _RegistryValueName; } } 207 | private ValueDefinition _Value; 208 | public ValueDefinition Value { get { return _Value; } } 209 | public ListItem(string registryPath, string registryValueName, ValueDefinition value) 210 | { 211 | _RegistryPath = registryPath; 212 | _RegistryValueName = registryValueName; 213 | _Value = value; 214 | } 215 | } 216 | 217 | public enum ElementTypes 218 | { 219 | Unknown = 0, 220 | Boolean, 221 | Decimal, 222 | LongDecimal, 223 | Text, 224 | MultiText, 225 | Enum, 226 | List 227 | } 228 | 229 | public interface IValueDefinitionElement 230 | { 231 | ElementTypes ElementType { get; } 232 | string Id { get; } 233 | string RegistryValueName { get; } 234 | } 235 | 236 | public abstract class ValueDefinitionElementBase : IValueDefinitionElement 237 | { 238 | public virtual ElementTypes ElementType { get { return ElementTypes.Unknown; } } 239 | private string _Id; 240 | public string Id { get { return _Id; } } 241 | private string _RegistryPath; 242 | public string RegistryPath { get { return _RegistryPath; } } 243 | private string _RegistryValueName; 244 | public string RegistryValueName { get { return _RegistryValueName; } } 245 | public ValueDefinitionElementBase(string id, string registryPath, string registryValueName) 246 | { 247 | _Id = id; 248 | _RegistryPath = registryPath; 249 | _RegistryValueName = registryValueName; 250 | } 251 | } 252 | 253 | public sealed class BooleanDefinitionElement : ValueDefinitionElementBase 254 | { 255 | public override ElementTypes ElementType { get { return ElementTypes.Boolean; } } 256 | private ValueDefinition _TrueValue; 257 | public ValueDefinition TrueValue { get { return _TrueValue; } } 258 | private ValueDefinition _FalseValue; 259 | public ValueDefinition FalseValue { get { return _FalseValue; } } 260 | private ValueDefinitionList _TrueList; 261 | public ValueDefinitionList TrueList { get { return _TrueList; } } 262 | public bool HasTrueList { get { return (_TrueList != null && _TrueList.Items.Count > 0); } } 263 | private ValueDefinitionList _FalseList; 264 | public ValueDefinitionList FalseList { get { return _FalseList; } } 265 | public bool HasFalseList { get { return (_FalseList != null && _FalseList.Items.Count > 0); } } 266 | [System.Management.Automation.HiddenAttribute] 267 | public void set_Properties(ValueDefinition trueValue, ValueDefinition falseValue, ValueDefinitionList trueList, ValueDefinitionList falseList) 268 | { 269 | _TrueValue = trueValue; 270 | _FalseValue = falseValue; 271 | _TrueList = trueList; 272 | _FalseList = falseList; 273 | } 274 | public BooleanDefinitionElement(string id, string registryPath, string registryValueName) : base(id, registryPath, registryValueName) 275 | { 276 | } 277 | } 278 | 279 | public sealed class DecimalDefinitionElement : ValueDefinitionElementBase 280 | { 281 | public override ElementTypes ElementType { get { return ElementTypes.Decimal; } } 282 | private bool _Required; 283 | public bool Required { get { return _Required; } } 284 | private Decimal _MinValue; 285 | public Decimal MinValue { get { return _MinValue; } } 286 | private Decimal _MaxValue = 9999; 287 | public Decimal MaxValue { get { return _MaxValue; } } 288 | private bool _StoreAsText; 289 | public bool StoreAsText { get { return _StoreAsText; } } 290 | private bool _Soft; 291 | public bool Soft { get { return _Soft; } } 292 | [System.Management.Automation.HiddenAttribute] 293 | public void set_Properties(bool required, Decimal minValue, Decimal maxValue, bool storeAsText, bool soft) 294 | { 295 | _Required = required; 296 | _MinValue = minValue; 297 | _MaxValue = maxValue; 298 | _StoreAsText = storeAsText; 299 | _Soft = soft; 300 | } 301 | public DecimalDefinitionElement(string id, string registryPath, string registryValueName) : base(id, registryPath, registryValueName) 302 | { 303 | } 304 | } 305 | 306 | public sealed class LongDecimalDefinitionElement : ValueDefinitionElementBase 307 | { 308 | public override ElementTypes ElementType { get { return ElementTypes.LongDecimal; } } 309 | private bool _Required; 310 | public bool Required { get { return _Required; } } 311 | private Decimal _MinValue; 312 | public Decimal MinValue { get { return _MinValue; } } 313 | private Decimal _MaxValue = 9999; 314 | public Decimal MaxValue { get { return _MaxValue; } } 315 | private bool _StoreAsText; 316 | public bool StoreAsText { get { return _StoreAsText; } } 317 | private bool _Soft; 318 | public bool Soft { get { return _Soft; } } 319 | [System.Management.Automation.HiddenAttribute] 320 | public void set_Properties(bool required, Decimal minValue, Decimal maxValue, bool storeAsText, bool soft) 321 | { 322 | _Required = required; 323 | _MinValue = minValue; 324 | _MaxValue = maxValue; 325 | _StoreAsText = storeAsText; 326 | _Soft = soft; 327 | } 328 | public LongDecimalDefinitionElement(string id, string registryPath, string registryValueName) : base(id, registryPath, registryValueName) 329 | { 330 | } 331 | } 332 | 333 | public sealed class TextDefinitionElement : ValueDefinitionElementBase 334 | { 335 | public override ElementTypes ElementType { get { return ElementTypes.Text; } } 336 | private bool _Required; 337 | public bool Required { get { return _Required; } } 338 | private Decimal _MaxLength = 1023; 339 | public Decimal MaxLength { get { return _MaxLength; } } 340 | private bool _Expandable; 341 | public bool Expandable { get { return _Expandable; } } 342 | private bool _Soft; 343 | public bool Soft { get { return _Soft; } } 344 | [System.Management.Automation.HiddenAttribute] 345 | public void set_Properties(bool required, Decimal maxLength, bool expandable, bool soft) 346 | { 347 | _Required = required; 348 | _MaxLength = maxLength; 349 | _Expandable = expandable; 350 | _Soft = soft; 351 | } 352 | public TextDefinitionElement(string id, string registryPath, string registryValueName) : base(id, registryPath, registryValueName) 353 | { 354 | } 355 | } 356 | 357 | public sealed class MultiTextDefinitionElement : ValueDefinitionElementBase 358 | { 359 | public override ElementTypes ElementType { get { return ElementTypes.MultiText; } } 360 | private bool _Required; 361 | public bool Required { get { return _Required; } } 362 | private Decimal _MaxLength = 1023; 363 | public Decimal MaxLength { get { return _MaxLength; } } 364 | private Decimal _MaxStrings; 365 | public Decimal MaxStrings { get { return _MaxStrings; } } 366 | private bool _Soft; 367 | public bool Soft { get { return _Soft; } } 368 | [System.Management.Automation.HiddenAttribute] 369 | public void set_Properties(bool required, Decimal maxLength, Decimal maxStrings, bool soft) 370 | { 371 | _Required = required; 372 | _MaxLength = maxLength; 373 | _MaxStrings = maxStrings; 374 | _Soft = soft; 375 | } 376 | public MultiTextDefinitionElement(string id, string registryPath, string registryValueName) : base(id, registryPath, registryValueName) 377 | { 378 | } 379 | } 380 | 381 | public sealed class EnumValue 382 | { 383 | private ValueDefinition _Value; 384 | public ValueDefinition Value { get { return _Value; } } 385 | private ValueDefinitionList _ValueList; 386 | public ValueDefinitionList ValueList { get { return _ValueList; } internal set { _ValueList = value; } } 387 | public bool HasValueList { get { return (_ValueList != null && _ValueList.Items.Count > 0); } } 388 | public EnumValue(ValueDefinition value) 389 | { 390 | _Value = value; 391 | } 392 | public override string ToString() 393 | { 394 | return _Value.ToString(); 395 | } 396 | } 397 | 398 | public sealed class EnumDefinitionElement : ValueDefinitionElementBase 399 | { 400 | public override ElementTypes ElementType { get { return ElementTypes.Enum; } } 401 | private bool _Required; 402 | public bool Required { get { return _Required; } } 403 | [System.Management.Automation.HiddenAttribute] 404 | public void set_Properties(bool required) 405 | { 406 | _Required = required; 407 | } 408 | private List> _Enums = new List>(); 409 | public List> Enums { get { return _Enums; } } 410 | [System.Management.Automation.HiddenAttribute] 411 | public void add_EnumsItem(string displayName, ValueDefinition value, ValueDefinitionList valueList) 412 | { 413 | EnumValue enumvalue = new EnumValue(value); 414 | if (valueList != null) 415 | { 416 | enumvalue.ValueList = valueList; 417 | } 418 | _Enums.Add(new KeyValuePair(displayName, enumvalue)); 419 | } 420 | public EnumDefinitionElement(string id, string registryPath, string registryValueName) : base(id, registryPath, registryValueName) 421 | { 422 | } 423 | } 424 | 425 | public sealed class ListDefinitionElement : ValueDefinitionElementBase 426 | { 427 | public override ElementTypes ElementType { get { return ElementTypes.List; } } 428 | private string _ValuePrefix; 429 | public string ValuePrefix { get { return _ValuePrefix; } } 430 | private bool _Additive; 431 | public bool Additive { get { return _Additive; } } 432 | private bool _Expandable; 433 | public bool Expandable { get { return _Expandable; } } 434 | private bool _ExplicitValue; 435 | public bool ExplicitValue { get { return _ExplicitValue; } } 436 | private string _ClientExtension; 437 | public string ClientExtension { get { return _ClientExtension; } } 438 | [System.Management.Automation.HiddenAttribute] 439 | public void set_Properties(string valuePrefix, bool additive, bool expandable, bool explicitValue, string clientExtension) 440 | { 441 | _ValuePrefix = valuePrefix; 442 | _Additive = additive; 443 | _Expandable = expandable; 444 | _ExplicitValue = explicitValue; 445 | _ClientExtension = clientExtension; 446 | } 447 | public ListDefinitionElement(string id, string registryPath, string registryValueName) : base(id, registryPath, registryValueName) 448 | { 449 | } 450 | } 451 | 452 | public sealed class ValueDefinitionElements 453 | { 454 | private List _Items = new List(); 455 | public List Items { get { return _Items; } } 456 | } 457 | 458 | public sealed class PolicyValueInfo 459 | { 460 | // Registry value information. 461 | private string _RegistryValueName; 462 | public string RegistryValueName { get { return _RegistryValueName; } } 463 | // single Enabled/Disabled value definitions. 464 | private ValueDefinition _EnabledValue; 465 | public ValueDefinition EnabledValue { get { return _EnabledValue; } } 466 | private ValueDefinition _DisabledValue; 467 | public ValueDefinition DisabledValue { get { return _DisabledValue; } } 468 | [System.Management.Automation.HiddenAttribute] 469 | public void set_RegistryValue(string valueName, ValueDefinition enabledValue, ValueDefinition disabledValue) 470 | { 471 | _RegistryValueName = valueName; 472 | _EnabledValue = enabledValue; 473 | _DisabledValue = disabledValue; 474 | } 475 | // list value definitions. 476 | private ValueDefinitionList _EnabledList; 477 | public ValueDefinitionList EnabledList { get { return _EnabledList; } } 478 | public bool HasEnabledList { get { return (_EnabledList != null && _EnabledList.Items.Count > 0); } } 479 | private ValueDefinitionList _DisabledList; 480 | public ValueDefinitionList DisabledList { get { return _DisabledList; } } 481 | public bool HasDisabledList { get { return (_DisabledList != null && _DisabledList.Items.Count > 0); } } 482 | [System.Management.Automation.HiddenAttribute] 483 | public void set_EnabledListValue(ValueDefinitionList list) 484 | { 485 | _EnabledList = list; 486 | } 487 | [System.Management.Automation.HiddenAttribute] 488 | public void set_DisabledListValue(ValueDefinitionList list) 489 | { 490 | _DisabledList = list; 491 | } 492 | // element value definition. 493 | private ValueDefinitionElements _Elements; 494 | public ValueDefinitionElements Elements { get { return _Elements; } } 495 | public bool HasElements { get { return (_Elements != null && _Elements.Items.Count > 0); } } 496 | [System.Management.Automation.HiddenAttribute] 497 | public void set_ElementsValue(ValueDefinitionElements elements) 498 | { 499 | _Elements = elements; 500 | } 501 | } 502 | } -------------------------------------------------------------------------------- /AdmxPolicy/AdmxPolicy.psm1: -------------------------------------------------------------------------------- 1 | #requires -Version 2.0 2 | Set-Strictmode -Version 2.0 3 | 4 | <# 5 | .SYNOPSIS 6 | Get resources from an ADML file. 7 | .DESCRIPTION 8 | This function reads an ADML file and loads message resources. 9 | .EXAMPLE 10 | Get-AdmlResource -FilePath "C:\Windows\PolicyDefinitions\ja-JP\ActiveXInstallService.adml" 11 | 12 | Set ADML file path. 13 | #> 14 | function Get-AdmlResource() { 15 | [OutputType([AdmxPolicy.AdmlResource])] 16 | [CmdletBinding()] 17 | param ( 18 | [Parameter(ValueFromPipeline = $true, Mandatory = $true)] 19 | [string]$FilePath, 20 | [switch]$ForAdmxId = $false, 21 | [switch]$WithWindowsAdml = $false 22 | ) 23 | begin { 24 | Write-Verbose "Start Get-AdmlResource..." 25 | Write-Verbose "ForAdmxId : $ForAdmxId" 26 | Write-Verbose "WithWindowsAdml : $WithWindowsAdml" 27 | } 28 | process { 29 | # validation 30 | Write-Verbose "FilePath : $FilePath" 31 | if ( -not (Test-Path $FilePath -PathType Leaf) ) { 32 | throw [IO.FileNotFoundException] "Get-AdmlResource : $FilePath not found." 33 | } 34 | if ( [IO.Path]::GetExtension($FilePath) -ne ".adml" ) { 35 | throw [ArgumentException] "Get-AdmlResource : $FilePath must be .adml file." 36 | } 37 | 38 | # load xml 39 | try { 40 | $xml = [xml]((Get-Content -LiteralPath $FilePath -Encoding UTF8)) 41 | } catch { 42 | Write-Error $_ 43 | return 44 | } 45 | 46 | # displayname / description 47 | $Result = New-Object "AdmxPolicy.AdmlResource" -ArgumentList ($xml.policyDefinitionResources.displayName, $xml.policyDefinitionResources.description) 48 | # stringResource 49 | $strings = $xml.policyDefinitionResources.resources.stringTable.string 50 | foreach ( $string in $strings ) { 51 | $id = $string.id 52 | if ($ForAdmxId) { 53 | $id = "`$(string.{0})" -f $string.id 54 | } 55 | $Result.Strings.Add($id, $string.InnerText) 56 | } 57 | # windows AdmlResource 58 | if ( $WithWindowsAdml ) { 59 | $windowsAdmlFullName = Join-Path (Split-Path $FilePath -Parent) "windows.adml" 60 | if ( -not (Test-Path $windowsAdmlFullName -PathType Leaf) ) { 61 | Write-Warning "$windowsAdmlFullName not found." 62 | } else { 63 | $windowsXml = [xml]((Get-Content -LiteralPath $windowsAdmlFullName -Encoding UTF8)) 64 | $strings2 = $windowsXml.policyDefinitionResources.resources.stringTable.string 65 | foreach ( $string in $strings2 ) { 66 | $id = $string.id 67 | if ( $ForAdmxId ) { 68 | $id = "`$(windows.{0})" -f $string.id 69 | } 70 | $Result.Windows.Add($id, $string.InnerText) 71 | } 72 | } 73 | } 74 | return $Result 75 | } 76 | } 77 | 78 | # Private 79 | function GetAdmxFileInfoFromXml ([string]$Name, [xml]$Xml, [AdmxPolicy.AdmlResource]$AdmlResource) { 80 | $Result = New-Object "AdmxPolicy.AdmxFileInfo" -ArgumentList ($Name, $AdmlResource.DisplayName, $AdmlResource.Description) 81 | try { 82 | $categories = $xml.policyDefinitions.categories.category 83 | foreach ($category in $categories) { 84 | $displayName = "" 85 | if ( $AdmlResource.Strings.ContainsKey($category.displayName) ) { 86 | $displayName = $AdmlResource.Strings[$category.displayName] 87 | } 88 | $item = New-Object "AdmxPolicy.CategoryInfo" -ArgumentList ($category.name, $displayName) 89 | $Result.Categories.Add($item) 90 | } 91 | } catch { 92 | # do nothing 93 | } 94 | return $Result 95 | } 96 | 97 | <# 98 | .SYNOPSIS 99 | Get ADMX file meta information. 100 | .DESCRIPTION 101 | This function reads an ADMX file and get meta information. 102 | .EXAMPLE 103 | Get-AdmxFileInfo -FilePath "C:\Windows\PolicyDefinitions\ActiveXInstallService.admx" 104 | 105 | Set ADMX file path. 106 | .EXAMPLE 107 | Get-AdmxFileInfo -FilePath "C:\Windows\PolicyDefinitions\ActiveXInstallService.admx" -CultureName "ja-JP" 108 | 109 | Specify culture name. 110 | #> 111 | function Get-AdmxFileInfo () { 112 | [OutputType([AdmxPolicy.AdmxFileInfo])] 113 | [CmdletBinding()] 114 | param ( 115 | [Parameter(ValueFromPipeline = $true, Mandatory = $true)] 116 | [string]$FilePath = "", 117 | [string]$CultureName = ((Get-Culture).Name), 118 | [string]$FallbackCultureName = "en-US" 119 | ) 120 | begin { 121 | Write-Verbose "Start Get-AdmxFileInfo..." 122 | Write-Verbose "CultureName : $CultureName" 123 | Write-Verbose "FallbackCultureName : $FallbackCultureName" 124 | # set default 125 | if ( $CultureName -eq "" ) { 126 | $CultureName = (Get-Culture).Name 127 | } 128 | if ( $FallbackCultureName -eq "" ) { 129 | $FallbackCultureName = "en-US" 130 | } 131 | } 132 | process { 133 | # validation 134 | Write-Verbose "FilePath : $FilePath" 135 | if ( -not (Test-Path $FilePath -PathType Leaf) ) { 136 | throw [IO.FileNotFoundException] "Get-AdmxFileInfo : $FilePath not found." 137 | } 138 | if ( [IO.Path]::GetExtension($FilePath) -ne ".admx" ) { 139 | throw [ArgumentException] "Get-AdmxFileInfo : $FilePath must be .admx file." 140 | } 141 | 142 | # load xml 143 | try { 144 | $xml = [xml](Get-Content -LiteralPath $FilePath -Encoding UTF8) 145 | } catch { 146 | Write-Error $_ 147 | return 148 | } 149 | 150 | # get adml resource 151 | $admlFileName = [IO.Path]::GetFileNameWithoutExtension($FilePath) 152 | $admlPath = Join-Path (Split-Path $FilePath -Parent) "$($CultureName)\$($admlFileName).adml" 153 | if ( -not (Test-Path -LiteralPath $admlPath) ) { 154 | if ( $CultureName -eq $FallbackCultureName ) { 155 | # do not fallback 156 | $admlPath = "" 157 | } else { 158 | Write-Verbose "ADML file($admlPath) not found. Try to fallback $FallbackCultureName ..." 159 | $admlPath = Join-Path (Split-Path $FilePath -Parent) "$($FallbackCultureName)\$($admlFileName).adml" 160 | if ( -not (Test-Path -LiteralPath $admlPath) ) { 161 | $admlPath = "" 162 | } 163 | } 164 | } 165 | if ( $admlPath -eq "" ) { 166 | Write-Warning "ADML file($admlFileName) not found." 167 | $admlResource = New-Object "AdmxPolicy.AdmlResource" 168 | } else { 169 | Write-Verbose "Get Adml resource from $($admlPath) ..." 170 | $admlResource = Get-AdmlResource -FilePath $admlPath -ForAdmxId:$true 171 | } 172 | 173 | # get FileInfo 174 | $Result = GetAdmxFileInfoFromXml -Name ([IO.Path]::GetFileName($FilePath)) -Xml $xml -AdmlResource $admlResource 175 | Write-Output $Result 176 | } 177 | } 178 | 179 | # Private 180 | function TryGetAttribute ([Xml.XmlElement]$Element, [string]$AttributeName, [object]$Default) { 181 | if ( $Element.HasAttribute($AttributeName) ) { 182 | return $Element.$AttributeName 183 | } 184 | return $Default 185 | } 186 | 187 | # Private 188 | function GetValueDefinitionFromXmlNode ([Xml.XmlElement]$ValueElement) { 189 | $type = [AdmxPolicy.ValueTypes]::Unknown 190 | $value = $null 191 | switch ( $ValueElement.FirstChild.Name ) { 192 | "delete" { 193 | $type = [AdmxPolicy.ValueTypes]::Delete 194 | $value = $null 195 | } 196 | "decimal" { 197 | $type = [AdmxPolicy.ValueTypes]::Decimal 198 | $value = [UInt32]$ValueElement.FirstChild.value 199 | } 200 | "longdecimal" { 201 | $type = [AdmxPolicy.ValueTypes]::LongDecimal 202 | $value = [UInt64]$ValueElement.FirstChild.value 203 | } 204 | "string" { 205 | $type = [AdmxPolicy.ValueTypes]::String 206 | $value = [string]$ValueElement.FirstChild.'#Text' 207 | } 208 | Default { 209 | $type = [AdmxPolicy.ValueTypes]::Unknown 210 | $value = $ValueElement.FirstChild.value 211 | } 212 | } 213 | return New-Object "AdmxPolicy.ValueDefinition" -ArgumentList ($type, $value) 214 | } 215 | 216 | # Private 217 | function GetValueListDefinitionFromXmlNode ( [Xml.XmlElement]$Element ) { 218 | $defaultKey = TryGetAttribute $Element "defaultKey" "" 219 | $Result = New-Object "AdmxPolicy.ValueDefinitionList" -ArgumentList $defaultKey 220 | foreach ( $i in $Element.item ) { 221 | $Result.Items.Add((New-Object "AdmxPolicy.ListItem" ` 222 | -ArgumentList ($i.key, $i.valueName, (GetValueDefinitionFromXmlNode -ValueElement $i.value)))) 223 | } 224 | return $Result 225 | } 226 | 227 | # Private 228 | function GetElementsInfoFromXmlNode ([Xml.XmlElement]$Elements, [AdmxPolicy.AdmlResource]$AdmlResource) { 229 | $Result = New-Object "AdmxPolicy.ValueDefinitionElements" 230 | foreach ( $element in $Elements.ChildNodes ) { 231 | if ( $element.NodeType -ne "Element" ) { 232 | # skip comment, text etc. 233 | continue 234 | } 235 | $item = $null 236 | $id = $element.id 237 | $registryPath = TryGetAttribute $element "key" "" 238 | $registryValueName = TryGetAttribute $element "valueName" "" 239 | switch ( $element.name ) { 240 | "boolean" { 241 | $item = New-Object "AdmxPolicy.BooleanDefinitionElement" -ArgumentList ($id, $registryPath, $registryValueName) 242 | $trueValue = $null 243 | if ( $element.Item("trueValue") ) { 244 | $trueValue = GetValueDefinitionFromXmlNode -ValueElement $element.trueValue 245 | } 246 | $falseValue = $null 247 | if ( $element.Item("falseValue") ) { 248 | $falseValue = GetValueDefinitionFromXmlNode -ValueElement $element.falseValue 249 | } 250 | $trueList = $null 251 | if ( $element.Item("trueList") ) { 252 | $trueList = GetValueListDefinitionFromXmlNode -Element $element.trueList 253 | } 254 | $falseList = $null 255 | if ( $element.Item("falseList") ) { 256 | $falseList = GetValueListDefinitionFromXmlNode -Element $element.falseList 257 | } 258 | $item.set_Properties($trueValue, $falseValue, $trueList, $falseList) 259 | } 260 | "decimal" { 261 | $item = New-Object "AdmxPolicy.DecimalDefinitionElement" -ArgumentList ($id, $registryPath, $registryValueName) 262 | $required = TryGetAttribute $element "required" $false 263 | $minValue = TryGetAttribute $element "minValue" 0 264 | $maxValue = TryGetAttribute $element "maxValue" 9999 265 | $storeAsText = TryGetAttribute $element "storeAsText" $false 266 | $soft = TryGetAttribute $element "soft" $false 267 | $item.set_Properties($required, $minValue, $maxValue, $storeAsText, $soft) 268 | } 269 | "longdecimal" { 270 | $item = New-Object "AdmxPolicy.LongDecimalDefinitionElement" -ArgumentList ($id, $registryPath, $registryValueName) 271 | $required = TryGetAttribute $element "required" $false 272 | $minValue = TryGetAttribute $element "minValue" 0 273 | $maxValue = TryGetAttribute $element "maxValue" 9999 274 | $storeAsText = TryGetAttribute $element "storeAsText" $false 275 | $soft = TryGetAttribute $element "soft" $false 276 | $item.set_Properties($required, $minValue, $maxValue, $storeAsText, $soft) 277 | } 278 | "text" { 279 | $item = New-Object "AdmxPolicy.TextDefinitionElement" -ArgumentList ($id, $registryPath, $registryValueName) 280 | $required = TryGetAttribute $element "required" $false 281 | $maxLength = TryGetAttribute $element "maxLength" 1023 282 | $soft = TryGetAttribute $element "soft" $false 283 | $expandable = TryGetAttribute $element "expandable" $false 284 | $item.set_Properties($required, $maxLength, $soft, $expandable) 285 | } 286 | "multitext" { 287 | $item = New-Object "AdmxPolicy.MultiTextDefinitionElement" -ArgumentList ($id, $registryPath, $registryValueName) 288 | $required = TryGetAttribute $element "required" $false 289 | $maxLength = TryGetAttribute $element "maxLength" 1023 290 | $maxStrings = TryGetAttribute $element "maxStrings" 0 291 | $soft = TryGetAttribute $element "soft" $false 292 | $item.set_Properties($required, $maxLength, $maxStrings, $soft) 293 | } 294 | "enum" { 295 | $item = New-Object "AdmxPolicy.EnumDefinitionElement" -ArgumentList ($id, $registryPath, $registryValueName) 296 | $required = TryGetAttribute $element "required" $false 297 | $item.set_Properties($required) 298 | foreach ($i in $element.item) { 299 | # key 300 | $enumKey = $i.displayName 301 | if ( $admlResource.Strings.ContainsKey($enumKey) ) { 302 | $enumKey = $admlResource.Strings[$enumKey] 303 | } 304 | # value /valueList 305 | $enumValue = GetValueDefinitionFromXmlNode -ValueElement $i.value 306 | $valueList = $null 307 | if ( $i.Item("valueList") ) { 308 | $valueList = GetValueListDefinitionFromXmlNode -Element $i.valueList 309 | } 310 | $item.add_EnumsItem($enumKey, $enumValue, $valueList) 311 | } 312 | } 313 | "list" { 314 | $item = New-Object "AdmxPolicy.ListDefinitionElement" -ArgumentList ($id, $registryPath, $registryValueName) 315 | $prefix = TryGetAttribute $element "valuePrefix" "" 316 | $additive = TryGetAttribute $element "additive" $false 317 | $expandable = TryGetAttribute $element "expandable" $false 318 | $explicitValue = TryGetAttribute $element "explicitValue" $false 319 | $clientExtension = TryGetAttribute $element "clientExtension" "" 320 | $item.set_Properties($prefix, $additive, $expandable, $explicitValue, $clientExtension) 321 | } 322 | Default { 323 | # unknown type. do nothing. 324 | } 325 | } 326 | if ( $null -ne $item ) { 327 | $Result.Items.Add($item) 328 | } 329 | } 330 | return $Result 331 | } 332 | 333 | # Private 334 | function GetValueInfoFromXmlNode ([Xml.XmlElement]$PolicyElement, [AdmxPolicy.AdmlResource]$AdmlResource) { 335 | $Result = New-Object "AdmxPolicy.PolicyValueInfo" 336 | 337 | # base value definitions 338 | $valueName = TryGetAttribute $PolicyElement "valueName" "" 339 | $enabledValue = $null 340 | if ( $PolicyElement.Item("enabledValue") ) { 341 | $enabledValue = GetValueDefinitionFromXmlNode -ValueElement $PolicyElement.enabledValue 342 | } 343 | $disabledValue = $null 344 | if ( $PolicyElement.Item("disabledValue") ) { 345 | $disabledValue = GetValueDefinitionFromXmlNode -ValueElement $PolicyElement.disabledValue 346 | } 347 | $Result.set_RegistryValue($valueName, $enabledValue, $disabledValue) 348 | 349 | # list value definitions 350 | if ( $PolicyElement.Item("enabledList") ) { 351 | Write-Verbose "Get enabledList information..." 352 | $list = GetValueListDefinitionFromXmlNode -Element $PolicyElement.enabledList 353 | $Result.set_EnabledListValue($list) 354 | } 355 | if ( $PolicyElement.Item("disabledList") ) { 356 | Write-Verbose "Get disabledList information..." 357 | $list = GetValueListDefinitionFromXmlNode -Element $PolicyElement.disabledList 358 | $Result.set_DisabledListValue($list) 359 | } 360 | 361 | # element value definition 362 | if ( $PolicyElement.Item("elements") ) { 363 | $Result.set_ElementsValue((GetElementsInfoFromXmlNode -Elements $PolicyElement.elements -AdmlResource $AdmlResource)) 364 | } 365 | 366 | return $Result 367 | } 368 | 369 | <# 370 | .SYNOPSIS 371 | Get group policy information from an ADMX file. 372 | .DESCRIPTION 373 | This function reads an ADMX file and get group policy information. 374 | .EXAMPLE 375 | Get-AdmxPolicies -FilePath "C:\Windows\PolicyDefinitions\ActiveXInstallService.admx" 376 | 377 | Set ADMX file path. 378 | .EXAMPLE 379 | Get-AdmxPolicies -FilePath "C:\Windows\PolicyDefinitions\ActiveXInstallService.admx" -CultureName "ja-JP" 380 | 381 | Specify culture name. 382 | #> 383 | function Get-AdmxPolicies () { 384 | [OutputType([AdmxPolicy.PolicyInfo])] 385 | [CmdletBinding()] 386 | param ( 387 | [Parameter(ValueFromPipeline = $true, Mandatory = $true)] 388 | [string]$FilePath = "", 389 | [string]$CultureName = ((Get-Culture).Name), 390 | [string]$FallbackCultureName = "en-US" 391 | ) 392 | begin { 393 | Write-Verbose "Start Get-AdmxPolicies..." 394 | Write-Verbose "CultureName : $CultureName" 395 | Write-Verbose "FallbackCultureName : $FallbackCultureName" 396 | # set default 397 | if ( $CultureName -eq "" ) { 398 | $CultureName = (Get-Culture).Name 399 | } 400 | if ( $FallbackCultureName -eq "" ) { 401 | $FallbackCultureName = "en-US" 402 | } 403 | } 404 | process { 405 | # validation 406 | Write-Verbose "FilePath : $FilePath" 407 | if ( -not (Test-Path $FilePath -PathType Leaf) ) { 408 | throw [IO.FileNotFoundException] "Get-AdmxPolicies : $FilePath not found." 409 | } 410 | if ( [IO.Path]::GetExtension($FilePath) -ne ".admx" ) { 411 | throw [ArgumentException] "Get-AdmxPolicies : $FilePath must be .admx file." 412 | } 413 | 414 | # load xml 415 | try { 416 | $xml = [xml](Get-Content -LiteralPath $FilePath -Encoding UTF8) 417 | } catch { 418 | Write-Error $_ 419 | return 420 | } 421 | 422 | # get adml resource 423 | $admlFileName = [IO.Path]::GetFileNameWithoutExtension($FilePath) 424 | $admlPath = Join-Path (Split-Path $FilePath -Parent) "$($CultureName)\$($admlFileName).adml" 425 | if ( -not (Test-Path -LiteralPath $admlPath) ) { 426 | if ( $CultureName -eq $FallbackCultureName ) { 427 | # do not fallback 428 | $admlPath = "" 429 | } else { 430 | Write-Verbose "ADML file($admlPath) not found. Try to fallback $FallbackCultureName ..." 431 | $admlPath = Join-Path (Split-Path $FilePath -Parent) "$($FallbackCultureName)\$($admlFileName).adml" 432 | if ( -not (Test-Path -LiteralPath $admlPath) ) { 433 | $admlPath = "" 434 | } 435 | } 436 | } 437 | if ( $admlPath -eq "" ) { 438 | Write-Warning "ADML file($admlFileName) not found." 439 | $admlResource = New-Object "AdmxPolicy.AdmlResource" 440 | } else { 441 | Write-Verbose "Get Adml resource from $($admlPath) ..." 442 | $admlResource = Get-AdmlResource -FilePath $admlPath -ForAdmxId:$true 443 | } 444 | 445 | # get policies 446 | $policies = $null 447 | try { 448 | $policies = $xml.policyDefinitions.policies.policy 449 | } catch { 450 | # WindowsProducts.admx などPolicy定義のないadmxファイルもある 451 | } 452 | foreach ( $policy in $policies ) { 453 | if ( $null -eq $policy ) { 454 | # for PowerShell 2.0 455 | continue 456 | } 457 | 458 | # get FileInfo 459 | # * create new FileInfo object for each PolicyInfo. 460 | Write-Verbose "Get $($policy.name) FileInfo..." 461 | $fileInfo = GetAdmxFileInfoFromXml -Name ([IO.Path]::GetFileName($FilePath)) -Xml $xml -AdmlResource $admlResource 462 | 463 | Write-Verbose "Get $($policy.name) informations..." 464 | # get DisplayName 465 | $policyDisplayName = "" 466 | if ( $admlResource.Strings.ContainsKey($policy.displayName) ) { 467 | $policyDisplayName = $admlResource.Strings[$policy.displayName] 468 | } 469 | # get ExplainText 470 | $policyExplainText = "" 471 | if ( $admlResource.Strings.ContainsKey($policy.explainText) ) { 472 | $policyExplainText = $admlResource.Strings[$policy.explainText] 473 | } 474 | # get registry key 475 | $RegistryType = [AdmxPolicy.RegistryTypes]::Unknown 476 | switch ($policy.class) { 477 | "Machine" { 478 | $RegistryType = [AdmxPolicy.RegistryTypes]::LocalMachine 479 | } 480 | "User" { 481 | $RegistryType = [AdmxPolicy.RegistryTypes]::CurrentUser 482 | } 483 | "Both" { 484 | $RegistryType = [AdmxPolicy.RegistryTypes]::Both 485 | } 486 | } 487 | $RegistryPath = $policy.key 488 | # get valueInfo 489 | $valueInfo = GetValueInfoFromXmlNode -PolicyElement $policy -AdmlResource $admlResource 490 | 491 | # set return value 492 | $Result = New-Object "AdmxPolicy.PolicyInfo" ` 493 | -ArgumentList ($fileInfo, $policy.name, $policyDisplayName, $policyExplainText, $RegistryType, $RegistryPath, $valueInfo) 494 | Write-Output $Result 495 | } 496 | } 497 | } 498 | -------------------------------------------------------------------------------- /AdmxPolicy/AdmxPolicy.format.ps1xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Default 7 | 8 | AdmxPolicy.PolicyInfo 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | Name 27 | 28 | 29 | DisplayName 30 | 31 | 32 | FileName 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | Default 42 | 43 | AdmxPolicy.PolicyInfo 44 | 45 | 46 | 47 | 48 | 49 | 50 | Name 51 | 52 | 53 | DisplayName 54 | 55 | 56 | ExplainText 57 | 58 | 59 | RegistryType 60 | 61 | 62 | RegistryRootKeys 63 | 64 | 65 | RegistryPath 66 | 67 | 68 | ValueInfo 69 | 70 | 71 | FileName 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | Default 81 | 82 | AdmxPolicy.PolicyValueInfo 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | RegistryValueName 110 | 111 | 112 | EnabledValue 113 | 114 | 115 | DisabledValue 116 | 117 | 118 | HasEnabledList 119 | 120 | 121 | HasDisabledList 122 | 123 | 124 | HasElements 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | Default 134 | 135 | AdmxPolicy.PolicyValueInfo 136 | 137 | 138 | 139 | 140 | 141 | 142 | RegistryValueName 143 | 144 | 145 | EnabledValue 146 | 147 | 148 | DisabledValue 149 | 150 | 151 | EnabledList 152 | 153 | 154 | DisabledList 155 | 156 | 157 | Elements 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | Default 167 | 168 | AdmxPolicy.BooleanDefinitionElement 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | ElementType 196 | 197 | 198 | Id 199 | 200 | 201 | RegistryPath 202 | 203 | 204 | RegistryValueName 205 | 206 | 207 | TrueValue 208 | 209 | 210 | FalseValue 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | Default 220 | 221 | AdmxPolicy.BooleanDefinitionElement 222 | 223 | 224 | 225 | 226 | 227 | 228 | ElementType 229 | 230 | 231 | Id 232 | 233 | 234 | RegistryPath 235 | 236 | 237 | RegistryValueName 238 | 239 | 240 | TrueValue 241 | 242 | 243 | FalseValue 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | Default 253 | 254 | AdmxPolicy.DecimalDefinitionElement 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | ElementType 282 | 283 | 284 | Id 285 | 286 | 287 | RegistryPath 288 | 289 | 290 | RegistryValueName 291 | 292 | 293 | MinValue 294 | 295 | 296 | MaxValue 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | Default 306 | 307 | AdmxPolicy.DecimalDefinitionElement 308 | 309 | 310 | 311 | 312 | 313 | 314 | ElementType 315 | 316 | 317 | Id 318 | 319 | 320 | RegistryPath 321 | 322 | 323 | RegistryValueName 324 | 325 | 326 | MinValue 327 | 328 | 329 | MaxValue 330 | 331 | 332 | Required 333 | 334 | 335 | StoreAsText 336 | 337 | 338 | Soft 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | Default 348 | 349 | AdmxPolicy.LongDecimalDefinitionElement 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | ElementType 377 | 378 | 379 | Id 380 | 381 | 382 | RegistryPath 383 | 384 | 385 | RegistryValueName 386 | 387 | 388 | MinValue 389 | 390 | 391 | MaxValue 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | Default 401 | 402 | AdmxPolicy.LongDecimalDefinitionElement 403 | 404 | 405 | 406 | 407 | 408 | 409 | ElementType 410 | 411 | 412 | Id 413 | 414 | 415 | RegistryPath 416 | 417 | 418 | RegistryValueName 419 | 420 | 421 | MinValue 422 | 423 | 424 | MaxValue 425 | 426 | 427 | Required 428 | 429 | 430 | StoreAsText 431 | 432 | 433 | Soft 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | Default 443 | 444 | AdmxPolicy.TextDefinitionElement 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | ElementType 472 | 473 | 474 | Id 475 | 476 | 477 | RegistryPath 478 | 479 | 480 | RegistryValueName 481 | 482 | 483 | Required 484 | 485 | 486 | MaxLength 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | Default 496 | 497 | AdmxPolicy.TextDefinitionElement 498 | 499 | 500 | 501 | 502 | 503 | 504 | ElementType 505 | 506 | 507 | Id 508 | 509 | 510 | RegistryPath 511 | 512 | 513 | RegistryValueName 514 | 515 | 516 | Required 517 | 518 | 519 | MaxLength 520 | 521 | 522 | Expandable 523 | 524 | 525 | Soft 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | Default 535 | 536 | AdmxPolicy.MultiTextDefinitionElement 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | ElementType 567 | 568 | 569 | Id 570 | 571 | 572 | RegistryPath 573 | 574 | 575 | RegistryValueName 576 | 577 | 578 | Required 579 | 580 | 581 | MaxLength 582 | 583 | 584 | MaxStrings 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | Default 594 | 595 | AdmxPolicy.MultiTextDefinitionElement 596 | 597 | 598 | 599 | 600 | 601 | 602 | ElementType 603 | 604 | 605 | Id 606 | 607 | 608 | RegistryPath 609 | 610 | 611 | RegistryValueName 612 | 613 | 614 | Required 615 | 616 | 617 | MaxLength 618 | 619 | 620 | MaxStrings 621 | 622 | 623 | Soft 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | Default 633 | 634 | AdmxPolicy.EnumDefinitionElement 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | ElementType 662 | 663 | 664 | Id 665 | 666 | 667 | RegistryPath 668 | 669 | 670 | RegistryValueName 671 | 672 | 673 | Required 674 | 675 | 676 | Enums 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | Default 686 | 687 | AdmxPolicy.EnumDefinitionElement 688 | 689 | 690 | 691 | 692 | 693 | 694 | ElementType 695 | 696 | 697 | Id 698 | 699 | 700 | RegistryPath 701 | 702 | 703 | RegistryValueName 704 | 705 | 706 | Required 707 | 708 | 709 | Enums 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | Default 719 | 720 | AdmxPolicy.ListDefinitionElement 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | ElementType 742 | 743 | 744 | Id 745 | 746 | 747 | RegistryPath 748 | 749 | 750 | RegistryValueName 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | Default 760 | 761 | AdmxPolicy.ListDefinitionElement 762 | 763 | 764 | 765 | 766 | 767 | 768 | ElementType 769 | 770 | 771 | Id 772 | 773 | 774 | RegistryPath 775 | 776 | 777 | RegistryValueName 778 | 779 | 780 | Additive 781 | 782 | 783 | Expandable 784 | 785 | 786 | ExplicitValue 787 | 788 | 789 | ClientExtension 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | --------------------------------------------------------------------------------