From 06f615a17630b614df756ae0bdb9f74ef94d0e0a Mon Sep 17 00:00:00 2001 From: Yorick Kuijs Date: Wed, 9 Feb 2022 17:14:15 +0100 Subject: [PATCH 1/5] Update pipeline and fix issue #1377 --- .gitattributes | 2 + .../ISSUE_TEMPLATE/Problem_with_resource.md | 62 ------ .../ISSUE_TEMPLATE/Problem_with_resource.yml | 97 +++++++++ .github/ISSUE_TEMPLATE/Resource_proposal.md | 21 -- .github/ISSUE_TEMPLATE/Resource_proposal.yml | 39 ++++ CHANGELOG.md | 3 + CODE_OF_CONDUCT.md | 10 +- Resolve-Dependency.ps1 | 11 +- SECURITY.md | 30 +++ .../MSFT_SPWebAppPeoplePickerSettings.psm1 | 36 +++- ...FT_SPWebAppPeoplePickerSettings.schema.mof | 1 + .../Contributing-to-SharePointDsc.md | 194 ++++++++++++++++++ .../Creating-Configuration-Files.md | 103 ++++++++++ ...eating-an-Azure-development-environment.md | 87 ++++++++ ...ed-the-configured-MaxEnvelopeSize-quota.md | 27 +++ .../WikiSource/Export-Diagnostic-Data.md | 47 +++++ .../Export-SharePoint-Configuration.md | 75 +++++++ SharePointDsc/WikiSource/Getting-Started.md | 21 ++ SharePointDsc/WikiSource/Home.md | 58 ++++++ .../WikiSource/Installing-the-module.md | 34 +++ .../Known-issues-with-remote-sessions.md | 5 + ...dules-for-SharePoint-DSC-configurations.md | 40 ++++ SharePointDsc/WikiSource/Prerequisites.md | 10 + ...essions-and-the-InstallAccount-variable.md | 49 +++++ ...ting-up-Central-Administration-on-HTTPS.md | 24 +++ .../WikiSource/Understanding-Resources.md | 159 ++++++++++++++ .../Using-CredSSP-on-a-Domain-Controller.md | 25 +++ ...n-configurations-that-use-SharePointDsc.md | 19 ++ SharePointDsc/WikiSource/_Footer.md | 1 + SharePointDsc/WikiSource/_Sidebar.md | 14 ++ SharePointDsc/WikiSource/media/ExportGUI.png | Bin 0 -> 75280 bytes SharePointDsc/WikiSource/media/footer.png | Bin 0 -> 47135 bytes azure-pipelines.yml | 12 +- build.ps1 | 63 +++--- build.yaml | 2 +- ...Dsc.SPWebAppPeoplePickerSettings.Tests.ps1 | 154 +++++++------- 36 files changed, 1330 insertions(+), 205 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/Problem_with_resource.md create mode 100644 .github/ISSUE_TEMPLATE/Problem_with_resource.yml delete mode 100644 .github/ISSUE_TEMPLATE/Resource_proposal.md create mode 100644 .github/ISSUE_TEMPLATE/Resource_proposal.yml create mode 100644 SECURITY.md create mode 100644 SharePointDsc/WikiSource/Contributing-to-SharePointDsc.md create mode 100644 SharePointDsc/WikiSource/Creating-Configuration-Files.md create mode 100644 SharePointDsc/WikiSource/Creating-an-Azure-development-environment.md create mode 100644 SharePointDsc/WikiSource/Error-Exceeded-the-configured-MaxEnvelopeSize-quota.md create mode 100644 SharePointDsc/WikiSource/Export-Diagnostic-Data.md create mode 100644 SharePointDsc/WikiSource/Export-SharePoint-Configuration.md create mode 100644 SharePointDsc/WikiSource/Getting-Started.md create mode 100644 SharePointDsc/WikiSource/Home.md create mode 100644 SharePointDsc/WikiSource/Installing-the-module.md create mode 100644 SharePointDsc/WikiSource/Known-issues-with-remote-sessions.md create mode 100644 SharePointDsc/WikiSource/Other-useful-modules-for-SharePoint-DSC-configurations.md create mode 100644 SharePointDsc/WikiSource/Prerequisites.md create mode 100644 SharePointDsc/WikiSource/Remote-sessions-and-the-InstallAccount-variable.md create mode 100644 SharePointDsc/WikiSource/Setting-up-Central-Administration-on-HTTPS.md create mode 100644 SharePointDsc/WikiSource/Understanding-Resources.md create mode 100644 SharePointDsc/WikiSource/Using-CredSSP-on-a-Domain-Controller.md create mode 100644 SharePointDsc/WikiSource/Using-the-Script-resource-in-configurations-that-use-SharePointDsc.md create mode 100644 SharePointDsc/WikiSource/_Footer.md create mode 100644 SharePointDsc/WikiSource/_Sidebar.md create mode 100644 SharePointDsc/WikiSource/media/ExportGUI.png create mode 100644 SharePointDsc/WikiSource/media/footer.png diff --git a/.gitattributes b/.gitattributes index 547657769..770aeb622 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6,4 +6,6 @@ *.jpg binary *.xl* binary *.pfx binary +*.png binary *.dll binary +*.so binary diff --git a/.github/ISSUE_TEMPLATE/Problem_with_resource.md b/.github/ISSUE_TEMPLATE/Problem_with_resource.md deleted file mode 100644 index 3da140be0..000000000 --- a/.github/ISSUE_TEMPLATE/Problem_with_resource.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -name: Problem with a resource -about: If you have a problem, bug, or enhancement with a resource in this resource module. ---- - -#### Details of the scenario you tried and the problem that is occurring - -#### Verbose logs showing the problem - -#### Suggested solution to the issue - -#### The DSC configuration that is used to reproduce the issue (as detailed as possible) -```powershell -# insert configuration here -``` - -#### The operating system the target node is running - - -#### Version and build of PowerShell the target node is running - - -#### Version of the DSC module that was used - - diff --git a/.github/ISSUE_TEMPLATE/Problem_with_resource.yml b/.github/ISSUE_TEMPLATE/Problem_with_resource.yml new file mode 100644 index 000000000..ab1928b9e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/Problem_with_resource.yml @@ -0,0 +1,97 @@ +name: Problem with a resource +description: If you have a problem, bug, or enhancement with a resource in this resource module. +labels: [] +assignees: [] +body: + - type: markdown + attributes: + value: | + Please prefix the issue title (above) with the resource name, e.g. 'ResourceName: Short description of my issue'! + + Your feedback and support is greatly appreciated, thanks for contributing! + - type: textarea + id: description + attributes: + label: Problem description + description: Details of the scenario you tried and the problem that is occurring. + validations: + required: true + - type: textarea + id: logs + attributes: + label: Verbose logs + description: | + Verbose logs showing the problem. **NOTE! Sensitive information should be obfuscated.** _Will be automatically formatted as plain text._ + placeholder: | + Paste verbose logs here + render: text + validations: + required: true + - type: textarea + id: configuration + attributes: + label: DSC configuration + description: | + The DSC configuration that is used to reproduce the issue (as detailed as possible). **NOTE! Sensitive information should be obfuscated.** _Will be automatically formatted as PowerShell code._ + placeholder: | + Paste DSC configuration here + render: powershell + validations: + required: true + - type: textarea + id: suggestedSolution + attributes: + label: Suggested solution + description: Do you have any suggestions how to solve the issue? + validations: + required: true + - type: textarea + id: targetSPVersion + attributes: + label: SharePoint version and build + description: | + Please provide version and build information of the SharePoint Server the target node is running. _Will be automatically formatted as plain text._ + placeholder: | + Add SharePoint Server information here + render: text + validations: + required: true + - type: textarea + id: targetNodeOS + attributes: + label: Operating system the target node is running + description: | + Please provide as much as possible about the target node, for example edition, version, build, and language. _Will be automatically formatted as plain text._ + + On OS with WMF 5.1 the following command can help get this information: `Get-ComputerInfo -Property @('OsName','OsOperatingSystemSKU','OSArchitecture','WindowsVersion','WindowsBuildLabEx','OsLanguage','OsMuiLanguages')` + placeholder: | + Add operating system information here + render: text + validations: + required: true + - type: textarea + id: targetNodePS + attributes: + label: PowerShell version and build the target node is running + description: | + Please provide the version and build of PowerShell the target node is running. _Will be automatically formatted as plain text._ + + To help with this information, please run this command: `$PSVersionTable` + placeholder: | + Add PowerShell information here + render: text + validations: + required: true + - type: textarea + id: moduleVersion + attributes: + label: SharePointDsc version + description: | + Please provide the version of the SharePointDsc module that was used. _Will be automatically formatted as plain text._ + + To help with this information, please run this command: `Get-Module -Name 'SharePointDsc' -ListAvailable | ft Name,Version,Path` + placeholder: | + Add module information here + render: text + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/Resource_proposal.md b/.github/ISSUE_TEMPLATE/Resource_proposal.md deleted file mode 100644 index 9f2a069a0..000000000 --- a/.github/ISSUE_TEMPLATE/Resource_proposal.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -name: New resource proposal -about: If you have a new resource proposal that you think should be added to this resource module. ---- - -### Description - -### Proposed properties - -### Special considerations or limitations diff --git a/.github/ISSUE_TEMPLATE/Resource_proposal.yml b/.github/ISSUE_TEMPLATE/Resource_proposal.yml new file mode 100644 index 000000000..2ddd09860 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/Resource_proposal.yml @@ -0,0 +1,39 @@ +name: New resource proposal +description: If you have a new resource proposal that you think should be added to this resource module. +title: "NewResourceName: New resource proposal" +labels: [] +assignees: [] +body: + - type: markdown + attributes: + value: | + Please replace `NewResourceName` in the issue title (above) with your proposed resource name. + + Thank you for contributing and making this resource module better! + - type: textarea + id: description + attributes: + label: Resource proposal + description: Provide information how this resource will/should work and how it will help users. + validations: + required: true + - type: textarea + id: proposedProperties + attributes: + label: Proposed properties + description: | + List all the proposed properties that the resource should have (key, required, write, and/or read). For each property provide a detailed description, the data type, if a default value should be used, and if the property is limited to a set of values. + value: | + Property | Type qualifier | Data type | Description | Default value | Allowed values + --- | --- | --- | --- | --- | --- + PropertyName | Key | String | Detailed description | None | None + validations: + required: true + - type: textarea + id: considerations + attributes: + label: Special considerations or limitations + description: | + Provide any considerations or limitations you can think of that a contributor should take in account when coding the proposed resource, and or what limitations a user will encounter or should consider when using the proposed resource. + validations: + required: true diff --git a/CHANGELOG.md b/CHANGELOG.md index e7d63cde8..92e29a596 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - SharePointDsc - Added generic unit tests files to quickly run all or a specific unit test + - Updated pipeline scripts to a recent version - SPTrustedIdentityTokenIssuer - Added parameters to support OIDC authentication in SharePoint Server Subscription Edition +- SPWebAppPeoplePickerSettings + - Added the PeopleEditorOnlyResolveWithinSiteCollection parameter to the resource ### Changed diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index f9ba8cf65..d7589ddbb 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,9 +1,3 @@ -# Microsoft Open Source Code of Conduct +# Code of Conduct -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). - -Resources: - -- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) -- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) -- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns +This project has adopted the [DSC Community Code of Conduct](https://dsccommunity.org/code_of_conduct). diff --git a/Resolve-Dependency.ps1 b/Resolve-Dependency.ps1 index 760df2398..a8c6b4d10 100644 --- a/Resolve-Dependency.ps1 +++ b/Resolve-Dependency.ps1 @@ -290,7 +290,14 @@ try if ($PSBoundParameters.ContainsKey('MinimumPSDependVersion')) { - $psDependModule = $psDependModule | Where-Object -Property -eq $MinimumPSDependVersion + try + { + $psDependModule = $psDependModule | Where-Object -FilterScript { $_.Version -ge $MinimumPSDependVersion } + } + catch + { + throw ('There was a problem finding the minimum version of PSDepend. Error: {0}' -f $_) + } } if (-not $psDependModule) @@ -328,6 +335,7 @@ try Name = 'PSDepend' Repository = $Gallery Path = $PSDependTarget + Force = $true } if ($MinimumPSDependVersion) @@ -371,6 +379,7 @@ try Name = 'PowerShell-Yaml' Repository = $Gallery Path = $PSDependTarget + Force = $true } Save-Module @SaveModuleParam diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..7bd7bc20f --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,30 @@ +## Security + +The DSC Community takes the security of our modules seriously, which includes all source code repositories managed through our GitHub organization. + +If you believe you have found a security vulnerability in any DSC Community owned repository, please report it to us as described below. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** + +Instead, please report them to one or several members of the DSC Community organization. +The easiest way to do so is to send us a direct message via twitter or slack. + +You should receive a response within 48 hours. If for some reason you do not, please follow up to other member of the community. + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + + * Type of issue + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +## Preferred Languages + +We prefer all communications to be in English. diff --git a/SharePointDsc/DSCResources/MSFT_SPWebAppPeoplePickerSettings/MSFT_SPWebAppPeoplePickerSettings.psm1 b/SharePointDsc/DSCResources/MSFT_SPWebAppPeoplePickerSettings/MSFT_SPWebAppPeoplePickerSettings.psm1 index 6bf43fbbc..96e776b69 100644 --- a/SharePointDsc/DSCResources/MSFT_SPWebAppPeoplePickerSettings/MSFT_SPWebAppPeoplePickerSettings.psm1 +++ b/SharePointDsc/DSCResources/MSFT_SPWebAppPeoplePickerSettings/MSFT_SPWebAppPeoplePickerSettings.psm1 @@ -24,6 +24,10 @@ function Get-TargetResource [System.Boolean] $OnlySearchWithinSiteCollection, + [Parameter()] + [System.Boolean] + $PeopleEditorOnlyResolveWithinSiteCollection, + [Parameter()] [Microsoft.Management.Infrastructure.CimInstance[]] $SearchActiveDirectoryDomains @@ -61,12 +65,13 @@ function Get-TargetResource } return @{ - WebAppUrl = $params.WebAppUrl - ActiveDirectoryCustomFilter = $wa.PeoplePickerSettings.ActiveDirectoryCustomFilter - ActiveDirectoryCustomQuery = $wa.PeoplePickerSettings.ActiveDirectoryCustomQuery - ActiveDirectorySearchTimeout = $wa.PeoplePickerSettings.ActiveDirectorySearchTimeout.TotalSeconds - OnlySearchWithinSiteCollection = $wa.PeoplePickerSettings.OnlySearchWithinSiteCollection - SearchActiveDirectoryDomains = $searchADDomains + WebAppUrl = $params.WebAppUrl + ActiveDirectoryCustomFilter = $wa.PeoplePickerSettings.ActiveDirectoryCustomFilter + ActiveDirectoryCustomQuery = $wa.PeoplePickerSettings.ActiveDirectoryCustomQuery + ActiveDirectorySearchTimeout = $wa.PeoplePickerSettings.ActiveDirectorySearchTimeout.TotalSeconds + OnlySearchWithinSiteCollection = $wa.PeoplePickerSettings.OnlySearchWithinSiteCollection + PeopleEditorOnlyResolveWithinSiteCollection = $wa.PeoplePickerSettings.PeopleEditorOnlyResolveWithinSiteCollection + SearchActiveDirectoryDomains = $searchADDomains } } return $result @@ -98,6 +103,10 @@ function Set-TargetResource [System.Boolean] $OnlySearchWithinSiteCollection, + [Parameter()] + [System.Boolean] + $PeopleEditorOnlyResolveWithinSiteCollection, + [Parameter()] [Microsoft.Management.Infrastructure.CimInstance[]] $SearchActiveDirectoryDomains @@ -155,6 +164,14 @@ function Set-TargetResource } } + if ($params.ContainsKey("PeopleEditorOnlyResolveWithinSiteCollection")) + { + if ($params.PeopleEditorOnlyResolveWithinSiteCollection -ne $wa.PeoplePickerSettings.PeopleEditorOnlyResolveWithinSiteCollection) + { + $wa.PeoplePickerSettings.PeopleEditorOnlyResolveWithinSiteCollection = $params.PeopleEditorOnlyResolveWithinSiteCollection + } + } + if ($params.ContainsKey("SearchActiveDirectoryDomains")) { foreach ($searchADDomain in $params.SearchActiveDirectoryDomains) @@ -250,6 +267,10 @@ function Test-TargetResource [System.Boolean] $OnlySearchWithinSiteCollection, + [Parameter()] + [System.Boolean] + $PeopleEditorOnlyResolveWithinSiteCollection, + [Parameter()] [Microsoft.Management.Infrastructure.CimInstance[]] $SearchActiveDirectoryDomains @@ -306,7 +327,8 @@ function Test-TargetResource -ValuesToCheck @("ActiveDirectoryCustomFilter", ` "ActiveDirectoryCustomQuery", ` "ActiveDirectorySearchTimeout", ` - "OnlySearchWithinSiteCollection") + "OnlySearchWithinSiteCollection", + "PeopleEditorOnlyResolveWithinSiteCollection") Write-Verbose -Message "Test-TargetResource returned $result" diff --git a/SharePointDsc/DSCResources/MSFT_SPWebAppPeoplePickerSettings/MSFT_SPWebAppPeoplePickerSettings.schema.mof b/SharePointDsc/DSCResources/MSFT_SPWebAppPeoplePickerSettings/MSFT_SPWebAppPeoplePickerSettings.schema.mof index d11075c76..fd2bdf8c7 100644 --- a/SharePointDsc/DSCResources/MSFT_SPWebAppPeoplePickerSettings/MSFT_SPWebAppPeoplePickerSettings.schema.mof +++ b/SharePointDsc/DSCResources/MSFT_SPWebAppPeoplePickerSettings/MSFT_SPWebAppPeoplePickerSettings.schema.mof @@ -13,5 +13,6 @@ class MSFT_SPWebAppPeoplePickerSettings : OMI_BaseResource [Write, Description("Sets the custom query that is sent to Active Directory")] String ActiveDirectoryCustomQuery; [Write, Description("Sets the time-out in seconds when a query is issued to Active Directory")] Uint16 ActiveDirectorySearchTimeout; [Write, Description("Specifies whether to search only the current site collection")] Boolean OnlySearchWithinSiteCollection; + [Write, Description("Specifies whether to check the user against the existing site collection users")] Boolean PeopleEditorOnlyResolveWithinSiteCollection; [Write, Description("List of all domains/forests that must be searched"), EmbeddedInstance("MSFT_SPWebAppPPSearchDomain")] String SearchActiveDirectoryDomains[]; }; diff --git a/SharePointDsc/WikiSource/Contributing-to-SharePointDsc.md b/SharePointDsc/WikiSource/Contributing-to-SharePointDsc.md new file mode 100644 index 000000000..2b6abf54c --- /dev/null +++ b/SharePointDsc/WikiSource/Contributing-to-SharePointDsc.md @@ -0,0 +1,194 @@ +If you are keen to make SharePointDsc better, why not consider contributing your work to the project? Every little change helps us make a better resource for everyone to use, and we would love to have contributions from the community. + +# Core contribution guidelines + +We follow all of the standard contribution guidelines for DSC resources [outlined in the DscResources repo](https://github.com/PowerShell/DscResources/blob/master/CONTRIBUTING.md), so please review these as a baseline for contributing. Specifically, be sure to read the following linked article from that page: + +* [Style Guidelines and Best Practices](https://github.com/PowerShell/DscResources/blob/master/StyleGuidelines.md) + +## SharePointDsc specific coding principles + +The Get-TargetResource function should not return $null as a result. It may, however, return a hashtable where some properties have a $null value. For example: +```PowerShell +function Get-TargetResource +{ + $nullreturn = @{ + ServiceAppName = $ServiceAppName + Name = $Name + RequestLimit = $null + WaitTime = $null + Ensure = "Absent" + } + return $nullreturn +} +``` + +In some cases, SharePoint does not publically publish information via the object model. If this is the case, reflection can be used to call the internal method. Since this comes with significant risks, however, we only allow reflection to be used to retrieve data and **not** to set data. + +## Design Guidelines + +To help ensure that SharePointDsc resources are created in a consistent manner, there are a number of design guidelines that guide the thinking applied to how the resources should be built. These design rules should be taken into account when submitting changes or new functionality to the SharePointDsc module. + +1. Each resource in SharePointDsc should strive to make changes to only the current server, and not require a remote connection to other servers to complete their work. +2. Supported versions of SharePoint for SharePointDsc are SharePoint Server 2013 with Service Pack 1 or higher, SharePoint Server 2016 and SharePoint Server 2019. SharePoint 2010 is not supported due to requiring PowerShell 4, which is not supported with that version of the product. Where a resource will not work with all versions we support (such as functionality or features being added or deprecated between versions), a clear and concise error should be returned that explains this. + +3. Any breaking change should be committed to a new branch so that it can be included in the next major version release. A change will be considered a 'breaking' change under the following circumstances: + +* A new mandatory property is added to a resource +* The data type of any resource property is changed +* Any property is removed or renamed in a resource +* A resource is removed +* A change in the expected outcome of how a resource behaves is made +* Any change that modifies the list of prerequisites for the module to run + +4. Resources that will make changes within site collections should not be part of SharePointDsc. The reason is that these types of changes can conflict with actions performed by the site collection owners/administrators. For example: In SPSite we use the title field during site creation, but do not update the title later on. This is because a site collection administrator can have a reason for changing the title and in such a case, SharePointDsc would reset the title, confusing the site collection administrator. + + * Only in specific cases can we deviate from this principle. + * One exception is the SPWeb resource. That was fully coded already and submitted as a Pull Request. Since we didn't want to throw away that code, we decided to include it into the module. + +# SharePointDsc specific guidelines + +## Dynamic documentation + +With over 100 resources in our module, we want to keep the documentation work light. To aid this, we are generating our documentation dynamically. Therefore, for each DSC resource we have, the following items must be completed so we can generate these: + +1. In the folder for the resource, place a readme.md file that contains heading 'Description' and a text description of the module. +2. In the schema.mof file for the resource, ensure that there are description attributes on all properties. +3. Generate 1 or more example configurations for the resource in the Examples/resources/[resource name] folder using PowerShell help syntax to describe the example at the top of the file. Each example configuration must be complete and runnable, must be called "example" and it must only take parameters of PSCredential types. This will allow our unit tests to validate the examples as part of our build process. + +With these items in place, we can dynamically generate the help files for PowerShell as well as this wiki. + +## Testing against SharePoint Server 2013, 2016, 2019 and Subscription Edition + +SharePointDsc is designed to work correctly against the Server 2013, 2016, 2019 and Subscription Edition versions of the product. The automated unit tests that are run in SharePointDsc will execute against all versions of the product using the stub modules we include in the unit tests directory. + +Where a resource applies to only a specific version (such as [SPUserProfileSyncService](https://github.com/dsccommunity/SharePointDsc/blob/master/SharePointDsc/DSCResources/MSFT_SPUserProfileSyncService/MSFT_SPUserProfileSyncService.psm1)) the code should throw meaningful errors to indicate that it should not be used with the installed version of the product. + +## Test your changes on a SharePoint test environment + +This might sound a little stupid, but in the past we noticed that code changes were submitted that could never work on a SharePoint environment. So always make sure you test your updates against a real life SharePoint environment! You can use [this](https://github.com/dsccommunity/SharePointDsc/wiki/Creating-an-Azure-development-environment) article to create your own test environment in Azure. + +# Tools + +For SharePointDsc there are several tools available to help developing or are being used in the GitHub repository. + +## GitHub Desktop + +In order to work with a local copy of the repository, you need the [GitHub Desktop](https://desktop.github.com/). The GitHub Desktop include the [Git tools](https://git-scm.com/downloads), but adds a nice GUI on top of it. Using this GUI you can see what commits have been made and what changes where made in those commits. Checkout the training section below if you want to learn more about Git. + +## Visual Studio Code + +To develop SharePointDsc, we recommend the use of [Visual Studio Code](https://code.visualstudio.com/) with the [PowerShell extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode.PowerShell) to enable PowerShell support. The SharePointDsc project already contains some definitions that configure Visual Studio Code to use the correct formatting. + +## PSScriptAnalyzer +To check code for compliance to PowerShell best practices, we are using [PSScriptAnalyzer](https://github.com/PowerShell/PSScriptAnalyzer). You can install this module locally as well and have your code checked. Visual Studio Code is also using this module to display possible issues in your PowerShell code. + +## Azure DevOps + +We are using [Azure DevOps](https://dev.azure.com/dsccommunity/SharePointDsc/) as the Continuous Integration solution for our project. When a Pull Request is submitted, Azure DevOps will run all the required tests against all supported SharePoint versions. If you want to see what happened, for example if the test fails, you can review the Azure DevOps log by clicking on the "Details" link behind the Azure DevOps test. + +Since the log is very big, a quick way to see which tests failed is to click "View raw log" link and searching for "[-]", which is present in all failed tests. + +## Pester + +All DSC Resource Kit modules are using [Pester](https://github.com/pester/Pester) to perform Unit tests on the code. Pester is also able to calculate the code coverage off all tests. Check out the training section below if you want to learn more about Pester. + +> _**IMPORTANT**: Make sure you run the below commands:_ +> * _Using Windows PowerShell v5.1. Running unit tests might work on PowerShell v7, but this hasn't been tested yet (because SharePoint itself requires Windows PowerShell v5.1). Testing running unit tests with PowerShell v7 is on the roadmap._ +> * _In an elevated PowerShell session. The code will throw a lot of errors when you don't!_ + +You can run all tests by performing these steps: +* Open PowerShell +* Browse to the local clone folder (e.g. c:\src\SharePointDsc) +* Build the module by running `.\build.ps1 -Tasks Build` +* Start all tests by running `.\build.ps1 -Tasks Test` + +This executes all tests for SharePoint 2013 on the code. This can take several hours to complete, depending on the specifications of your machine. If you want to run the tests for a different SharePoint version, use: + +**SharePoint 2016** +```PowerShell +.\build.ps1 -Tasks test -PesterScript @(@{ Path = '/Tests/Unit'; Parameters = @{SharePointCmdletModule = '/Tests/Unit/Stubs/SharePoint/16.0.4456.1000/Microsoft.SharePoint.PowerShell.psm1' }}) +``` +**SharePoint 2019** +```PowerShell + .\build.ps1 -Tasks test -PesterScript @(@{ Path = '/Tests/Unit'; Parameters = @{SharePointCmdletModule = '/Tests/Unit/Stubs/SharePoint/16.0.10337.12109/Microsoft.SharePoint.PowerShell.psm1' }}) +``` +**SharePoint Subscription Edition** +```PowerShell + .\build.ps1 -Tasks test -PesterScript @(@{ Path = '/Tests/Unit'; Parameters = @{SharePointCmdletModule = '/Tests/Unit/Stubs/SharePoint/16.0.14326.20450/SharePointServer.psm1' }}) +``` + +We are also checking for compliance to the [coding style guide and other generic tests](https://github.com/PowerShell/DscResource.Tests#dsc-resource-common-meta-tests). You can run these tests locally by executing the following steps: +* Open PowerShell +* Browse to the local clone folder +* Build the module by running (required if you restarted PowerShell or updated a resource) `.\build.ps1 -Tasks Build` +* Start all High Quality Resource Module (HQRM) tests by running `.\build.ps1 -Tasks hqrmtests` +This executes all HQRM tests on the code. + +## Test single resource +To run an individual Pester test, run the following script (update the first two lines with the correct values): +```PowerShell +$modulePath = '' # e.g. C:\src\SharePointDsc +$resource = '' # e.g. SPSite + +cd $modulePath +.\build.ps1 -Tasks Build + +$path15 = Join-Path -Path $modulePath -ChildPath '\Tests\Unit\Stubs\SharePoint\15.0.4805.1000\Microsoft.SharePoint.PowerShell.psm1' +$path16 = Join-Path -Path $modulePath -ChildPath '\Tests\Unit\Stubs\SharePoint\16.0.4456.1000\Microsoft.SharePoint.PowerShell.psm1' +$path19 = Join-Path -Path $modulePath -ChildPath '\Tests\Unit\Stubs\SharePoint\16.0.10337.12109\Microsoft.SharePoint.PowerShell.psm1' +$pathSE = Join-Path -Path $modulePath -ChildPath '\Tests\Unit\Stubs\SharePoint\16.0.14326.20450\SharePointServer.psm1' + +$testPath = Join-Path -Path $modulePath -ChildPath ".\Tests\Unit\SharePointDsc\SharePointDsc.$resource.Tests.ps1" +$compiledModulePath = Split-Path -Path (Get-Module SharePointDsc).Path +$resourcePath = Join-Path -Path $compiledModulePath -ChildPath "\DSCResources\MSFT_$resource\MSFT_$resource.psm1" +Invoke-Pester -Script @( + @{ Path = $testPath; Parameters = @{SharePointCmdletModule = $path15 } }, + @{ Path = $testPath; Parameters = @{SharePointCmdletModule = $path16 } }, + @{ Path = $testPath; Parameters = @{SharePointCmdletModule = $path19 } }, + @{ Path = $testPath; Parameters = @{SharePointCmdletModule = $pathSE } } +) -CodeCoverage $resourcePath +``` +This will run the unit tests for all four SharePoint versions **and** will calculate code coverage of the unit tests across these versions. + +**NOTE:** Make sure you have version 4.10.1 of Pester. Update the module from the PowerShell Gallery by running the command `Install-Module Pester -RequiredVersion 4.10.1 -Force` + +**NOTE 2:** If you have Windows 10, please read [this page](https://github.com/pester/Pester/wiki/Installation-and-Update) to update successfully to the most recent version: + +**NOTE 3:** When you are troubleshooting Pester tests and you make a code change in the resource, you have to build the module again. Updates to the Pester test itself do not require this. + +## Reviewable + +When a Pull Request is submitted, a code review will have to take place to ensure it meets all defined standards. The code review will be done via [Reviewable](https://reviewable.io), a platform that easily enables reviewers to check code changes, add comments and approve changes. Only when all review comments are resolved will we be able to merge the Pull Request. + +# Troubleshooting + +The Microsoft Docs site has a good [article on troubleshooting DSC](https://docs.microsoft.com/en-us/powershell/dsc/troubleshooting) which has a list of tips and tricks on how to collect information while troubleshooting DSC. + +When troubleshooting an issue, you can use the [built-in debugging possibilities](https://docs.microsoft.com/en-us/powershell/dsc/debugresource) in PowerShell DSC. Running the command `Enable-DscDebug -BreakAll` on the target machine enables debugging. By running `Start-DscConfiguration` and specifying the configuration to deploy, a new deployment starts, stopping with the following information: + ```PowerShell +Enter-PSSession -ComputerName TEST-SRV -Credential +Enter-PSHostProcess -Id 9000 -AppDomainName DscPsPluginWkr_AppDomain +Debug-Runspace -Id 9 + ``` +By running these commands, you connect to the remote machine, entering a debug session. + +Another debug option is to open the Pester file and the resource psm1 file. By placing breakpoints in those files and running the Pester file, PowerShell stops at the set breakpoint. This enables you to step through the code, troubleshooting either the resource or the Pester test. + +# Training + +The following resources can be used to get familiar with several technologies used within SharePointDsc: + +* PowerShell Desired State Configuration and SharePointDsc + * [Microsoft Learn: "Getting Started with PowerShell Desired State Configuration"](https://docs.microsoft.com/en-us/shows/getting-started-with-powershell-dsc/) + * [Microsoft Learn: "Advanced PowerShell Desired State Configuration"](https://docs.microsoft.com/en-us/shows/advanced-powershell-dsc-and-custom-resources/) + * [Microsoft Learn: "SharePoint Automation with DSC"](https://docs.microsoft.com/en-us/shows/sharepoint-automation-with-dsc/) +* Git + * [Git manual](https://git-scm.com/book/en/v2) + * [PluralSight: "How Git Works"](https://app.pluralsight.com/library/courses/how-git-works/table-of-contents) This is a very good training to get familiar with the Git concept. + * [PluralSight: "Mastering Git"](https://app.pluralsight.com/library/courses/mastering-git/table-of-contents) This is a very good training to get familiar with the Git concept. +* Pester + * [Microsoft Learn: "Testing PowerShell with Pester"](https://docs.microsoft.com/en-us/shows/testing-powershell-with-pester/) + * [PluralSight: "Testing PowerShell with Pester"](https://www.pluralsight.com/courses/powershell-testing-pester) + +**NOTE:** A subscription is required for the PluralSight trainings diff --git a/SharePointDsc/WikiSource/Creating-Configuration-Files.md b/SharePointDsc/WikiSource/Creating-Configuration-Files.md new file mode 100644 index 000000000..55eed79e1 --- /dev/null +++ b/SharePointDsc/WikiSource/Creating-Configuration-Files.md @@ -0,0 +1,103 @@ +PowerShell DSC allows for a single configuration file to be applied to a server to describe +what is should 'look like' - what services will run, what products are installed, and how +they are configured. +In the context of deploying a SharePoint farm this gives us a number of options for how to +go about deploying the farm with a number of different configurations based on roles, with +a number of components that are common across all deployments. + +## Things every configuration is likely to have + +When describing a configuration for a SharePoint Server, there are a number of common +components that are likely to exist in every configuration. +Namely the components related to the installation of the product - +[SPInstallPreReqs](SPInstallPreReqs) and [SPInstall](SPInstall). + +It is also important to understand how the SharePointDsc resources impersonate and communicate +with the SharePoint PowerShell cmdlet's. +For PowerShell 5 (which we recommend) you should use the PsDscRunAsCredential property to specify + the account a resource should run as. +However for PowerShell 4 this is not an option, and the InstallAccount option is to be used in +that situation, which relies on creating a local PowerShell session that uses CredSSP authentication. +This means you are likely to want to use the xCredSSP resources also (see [Remote sessions and +the InstallAccount variable](Remote-sessions-and-the-InstallAccount-variable)) for more information +on this). +There are also a limited number of scenario's in SharePointDsc that will always use this CredSSP +approach (such as provisioning the user profile sync service) so it is recommended that even if +you use PowerShell 5 and PsDscRunAsCredential, you should still configure the CredSSP settings. + +## Creating a single server deployment + +The single server deployment is the most straightforward - you will have one configuration file +that will describe all of the components that you want to have on that server. +This is not likely to be a production deployment, but more a development or testing server. +The specifics of what you put in to this configuration are largely up to what you want this server +to be running, but you will always include [SPFarm](SPFarm) to create the farm, and +[SPDistributedCacheService](SPDistributedCacheService) to enable the distributed cache service +in the farm. +The rest can be as little or as detailed as you need it to be in order to achieve your desired +configuration. + +## Expanding the model out to multiple servers + +When we begin to explore scenarios that include more than one server, the implementation of our +configuration changes significantly. +There can no longer be a single configuration that applies to all servers, you need to start +looking at what "roles" a server will fulfill within your farm. +Common roles would include "application server", or "front end server", perhaps in a large +deployment you might have a "distributed cache server" or a "search server". +The individual roles you have within your architecture will dictate the number of unique +configurations that you need to create. + +For example, consider a farm that has the following architecture: + +- 2x Web Front End Servers +- 2x Application Servers + +This is a typical "small" SharePoint deployment, as it separates out the services to the two layers to +handle the different workloads, and still provides redundancy through having at least 2 servers in +each "role". +In this case, I would need to have two configurations, one for the front ends and one for the +application servers. +Each configuration would describe what a server in that role would look like, since I would expect +all of my front end servers to have the same services and configuration applied, and again for the +application servers. +Then if I decide I need to scale out to accommodate more load and add a new front end server, I would +just apply the same configuration to it based on its role. + +## Understanding the need for a "farm server" configuration + +Continuing with the above example of a small server farm, we have two configurations for each role. +There is a need for a third configuration though, and this is referred to as a "farm" configuration. +This configuration is planned to be applied to one server only (and typically this will be a back end +application server, so its configuration will be very similar to the other application server). +There are some differences though, the farm configuration will: + +- Be responsible for creating the farm +- Also be responsible for provisioning and configuring logical components in the farm + +It is important to understand the difference between a logical component and a physical component in +our configurations. +For example, a SharePoint web application is a logical component in a SharePoint farm - you create it +on one server, configure it from one server, but all the other servers in the farm know about it. +The physical component for a web application is the IIS website, which exists on specific servers and +can be configured per server (such as making changes to bindings). +So I would use my "farm server" configuration to provision logical components like web applications and +service applications, and my individual role configurations to validate the components that apply to a +server specifically as opposed to something that exists logically within the farm. + +The other factor here is around how the DSC is going to be run from every server - if I have a SharePoint +web application that exists in a large server from (let's assume 10 servers), I don't need all 10 servers +checking for it every 30 minutes. +Even if it was just a handful of front end servers, it is still unnecessary for them all to be managing +this when it does not map directly to a physical thing that has to happen on each server. +This means that the farm server configuration will likely be much larger than any other role +configuration, but it also provides more flexibility in the implementation as all logical components are +in one spot on one server. + +## Examples + +In the module is an examples directory which demonstrates both a single server deployment, as well as the +three configurations needed for the above mentioned multi-server example (so one "farm" configuration, +then an app server and a front end server). +These examples demonstrate the concepts discussed here and can be used as as starting point for your own +configurations. diff --git a/SharePointDsc/WikiSource/Creating-an-Azure-development-environment.md b/SharePointDsc/WikiSource/Creating-an-Azure-development-environment.md new file mode 100644 index 000000000..cefb17183 --- /dev/null +++ b/SharePointDsc/WikiSource/Creating-an-Azure-development-environment.md @@ -0,0 +1,87 @@ +To help speed up development with SharePointDsc, a set of scripts has been created that will deploy an environment that is ready to use for development purposes in to your own Azure subscription. This page outlines the requirements for using this script. + +## Step One - Get an Azure subscription + +If you do not currently have an Azure subscription, you can sign up for a free trial at [https://azure.microsoft.com/free](https://azure.microsoft.com/free) + +## Step Two - Install the Azure PowerShell cmdlets + +You can install the required Azure management PowerShell cmdlets by running the following script + + Install-Module Azure + Install-Module AzureRm + +## Step Three - Install required DSC modules + +The script requires several PowerShell DSC modules to be installed on your local machine, which are published to the Azure Blob Storage together with the DSC scripts. + +Module Name | Version +------------ | ------------- +xActiveDirectory | 2.16.0.0 +xCredSSP | 1.0.1 +xDnsServer |1.7.0.0 +xComputerManagement | 1.9.0.0 +xNetworking | 3.2.0.0 +SQLServerDsc | 10.0.0.0 +xWebAdministration | +SharePointDsc | + +To install the modules: + +```PowerShell +Install-Module -Name xActiveDirectory -RequiredVersion 2.16.0.0 -SkipPublisherCheck -Force +Install-Module -Name xCredSSP -RequiredVersion 1.0.1 -SkipPublisherCheck -Force +Install-Module -Name xDnsServer -RequiredVersion 1.7.0.0 -SkipPublisherCheck -Force +Install-Module -Name xComputerManagement -RequiredVersion 1.9.0.0 -SkipPublisherCheck -Force +Install-Module -Name xNetworking -RequiredVersion 3.2.0.0 -SkipPublisherCheck -Force +Install-Module -Name SQLServerDsc -RequiredVersion 10.0.0.0 -SkipPublisherCheck -Force +Install-Module -Name xWebAdministration -SkipPublisherCheck -Force +Install-Module -Name SharePointDsc -SkipPublisherCheck -Force +``` +## Step Four- Create a storage account that contains the binaries for SharePoint + +You will need a storage account that will contain the installer for SharePoint so you can have the dev environments download them when needed. See "[Creating a storage account](https://docs.microsoft.com/en-us/azure/storage/storage-create-storage-account#create-a-storage-account)" for instructions on how to create a new storage account. + +Once you have created the account you will need to create a container in it, and then copy the files for SharePoint in to this. This can be done through the portal (under the "blobs" or "containers" section), or via the [New-AzureStorageContainer](https://docs.microsoft.com/en-us/powershell/module/azure.storage/New-AzureStorageContainer?view=azurermps-4.2.0) PowerShell cmdlet. + +There are a number of ways of copying files in to Azure storage - see "[moving data to and from Azure storage](https://docs.microsoft.com/en-us/azure/storage/storage-moving-data)" for specific methods. You will need to take the entire contents of the SharePoint 2013, 2016 or 2019 ISO and copy them in to the container you created above. You can also slipstream updates in to the "Updates" folder at this point to install SharePoint to a specific CU level. + +## Step Five - Create a new dev environment + +To create your development environment, run the following PowerShell commands (see the list below of changes to make to this before running) + + Import-Module C:\repos\SharePointDsc\Tests\Integration\Azure\AzureEnvironmentBuilder.psm1 + Login-AzureRmAccount + New-SPDscAzureLab -ResourceGroupName "SPDSCTestLab" ` + -Location southeastasia ` + -StorageAccountName "spdsctestlab1" ` + -SoftwareStorageAccountName "spdscsoftware1" ` + -SoftwareStorageAccountContainer "sharepoint2016" ` + -SharePointProductKey "AAAAA-AAAAA-AAAAA-AAAAA-AAAAA" ` + -PublicDNSLabel "spdsctestlab1" ` + -AdminCredential (Get-Credential -Message "Enter admin credential") + +In this script you will need to set the following values + +1. The Import-Module cmdlet needs to point to where ever you have a copy of the SharePointDsc source code to import the module from +2. Change the resource group name parameter, this can be anything to help you identify the development environment in your Azure subscription +3. Set the location to the Azure location you wish to deploy to +4. The SoftwareStorageAccountName parameter should be the name of the storage account you created earlier to upload SharePoint in to +5. The SoftwareStorageAccountContainer parameter should be the name of your container that was created earlier +6. The SharePointProductKey parameter should be your valid SharePoint product key +7. The PublicDNSLabel property is used to establish a DNS name for your server once it is created. This will be viewable in the Azure portal when the provisioning is complete + +After these changes have been made you can run the script and you will be prompted first to sign in to Azure, and after that you will be prompted for the admin credentials for your environment (username and password - do not prefix a domain name on to the username). + +# What is in the development environment + +You will see a Domain controller server, a SQL server and a SharePoint server. The AD and SQL servers are both fully configured and ready to use. The SharePoint server will have the following software installed: + +* SharePoint (version will be based on what you uploaded to blob storage) +* Git for Windows +* Visual Studio Code +* Nodejs +* Git Credential Helper for Windows +* PoshGit + +This should be seen as a minimum to begin development with SharePointDsc - you can however install any other software on the servers you need as you have full control of them after they are provisioned from the template. diff --git a/SharePointDsc/WikiSource/Error-Exceeded-the-configured-MaxEnvelopeSize-quota.md b/SharePointDsc/WikiSource/Error-Exceeded-the-configured-MaxEnvelopeSize-quota.md new file mode 100644 index 000000000..38026be47 --- /dev/null +++ b/SharePointDsc/WikiSource/Error-Exceeded-the-configured-MaxEnvelopeSize-quota.md @@ -0,0 +1,27 @@ +When deploying DSC configurations, you may run into the following issue when executing Start-DscConfiguration: + + VERBOSE: Perform operation 'Invoke CimMethod' with following parameters, ''methodName' = SendConfigurationApply,'className' = MSFT_DSCLocalConfigurationManager,'namespaceName' = root/Microsoft/Windows/DesiredStateConfiguration'. + The WinRM client sent a request to the remote WS-Management service and was notified that the request size exceeded the configured MaxEnvelopeSize quota. + + CategoryInfo : LimitsExceeded: [root/Microsoft/...gurationManager:String] [], CimException + + FullyQualifiedErrorId : HRESULT 0x80338111 + + PSComputerName : [servername] + VERBOSE: Operation 'Invoke CimMethod' complete. + VERBOSE: Time taken for configuration job to complete is 0.648 seconds + +## Solution +The solution for this issue is to increase the maximum envelope size, by running the following command in an elevated PowerShell session: + + Set-Item -Path WSMan:\localhost\MaxEnvelopeSizeKb -Value 2048 + +**Note:** The default value is MaxEnvelopeSizeKB is 500 + +**Note 2:** When your computer is configured to use the Public network profile, the Set-Item cmdlet might throw the following error: + + Set-Item : WinRM firewall exception will not work since one of the network connection types on this machine is set to Public. Change the network connection type to either Domain or Private and try again. + +Change the network profile to Domain or Private in order to change the setting. + +## More information +More information about the MaxEnvelopeSize can be found at: +* https://msdn.microsoft.com/en-us/library/cc251449.aspx +* https://msdn.microsoft.com/en-us/library/aa384372%28VS.85%29.aspx \ No newline at end of file diff --git a/SharePointDsc/WikiSource/Export-Diagnostic-Data.md b/SharePointDsc/WikiSource/Export-Diagnostic-Data.md new file mode 100644 index 000000000..229b99e73 --- /dev/null +++ b/SharePointDsc/WikiSource/Export-Diagnostic-Data.md @@ -0,0 +1,47 @@ +If you want to troubleshoot an issue, having some logging or troubleshooting +information available is very useful. Especially when you ask someone else for +assistance. That is why SharePointDsc has a cmdlet available that is able to +export several pieces of information: + +- DSC Verbose logs +- SPDSC Event log +- PowerShell version +- Operating System version +- LCM configuration + +## Parameters + +| Parameter | Attribute | DataType | Description | Allowed Values | +| --- | --- | --- | --- | --- | +| **ExportFilePath** | Mandatory | String | Path where to export the diagnostic data to | | +| **NumberOfDays** | Optional | UInt | The number of days to export the data of (Default = 7) | | +| **Anonymize** | Optional | Switch | Specify to anonymize the exported data | | +| **Server** | Mandatory | String | Specifies the server name to replace during anonimization | | +| **Domain** | Mandatory | Switch | Specifies the domain name to replace during anonimization | | +| **Url** | Mandatory | Switch | Specifies the url to replace during anonimization | | + +## Examples + +### Example 1 + +Export diagnostic info to C:\Output + +```PowerShell +Export-SPDscDiagnosticData -ExportFilePath 'C:\Output' +``` + +### Example 2 + +Export diagnostic info of the last 14 days to C:\Output + +```PowerShell +Export-SPDscDiagnosticData -ExportFilePath 'C:\Output' -NumberOfDays 14 +``` + +### Example 3 + +Export anonymized diagnostic info to C:\Output + +```PowerShell +Export-SPDscDiagnosticData -ExportFilePath 'C:\Output' -Anonymize -Server 'server1' -Domain 'contoso.com' -Url 'https://sharepoint.contoso.com' +``` diff --git a/SharePointDsc/WikiSource/Export-SharePoint-Configuration.md b/SharePointDsc/WikiSource/Export-SharePoint-Configuration.md new file mode 100644 index 000000000..66c5be394 --- /dev/null +++ b/SharePointDsc/WikiSource/Export-SharePoint-Configuration.md @@ -0,0 +1,75 @@ +SharePoint Farms have multiple components on every server which contain configuration. +At a very high level this could be: + +- Web Applications +- Databases +- Servers +- Services +- Service Applications + +PowerShell Desired State Configuration has the ability to make sure these components are compliant +with a desired state. Unfortunately it is not possible to create a desired state configuration +based off an existing server/farm. + +That is why Nik Charlebois created [ReverseDsc](https://www.powershellgallery.com/packages/ReverseDSC). +This module offers generic functionalities to generate DSC configurations and requires a technology +specific orchestrator script to export the data. + +> For a [Full list](Understanding-Resources) of what can be extracted have a look at our Included Resources section. + +Since SharePointDsc v4.5, this orchestrator script (and therefore ReverseDsc support) has been +natively integrated into SharePointDsc. + +>**NOTE:** Running an export does require the module "ReverseDsc" to be installed. Do this by running the following cmdlet: +> +> ```PowerShell +> Install-Module ReverseDsc +> ``` + +To run an export you have to use the `Export-SPConfiguration` cmdlet. When running an export, you +need to specify which resources you want to export. If you don't specify any parameters, the cmdlet +shows a GUI in which you can select the resources you want to export and specify the credentials. + +![Export GUI](media/ExportGUI.png) + +For more information and examples, check the info below. + +## Parameters + +| Parameter | Attribute | DataType | Description | Allowed Values | +| --- | --- | --- | --- | --- | +| **ComponentsToExtract** | Optional | String[] | Names of the resources to export | | +| **Credentials** | Optional | PSCredential | The credentials to connect to SharePoint with | | +| **Mode** | Optional | String | Predefined sets of exported resources | Lite, Default, Full | +| **OutputPath** | Optional | String | Specifies the file name to which to export the exported configuration | | +| **SkipSitesAndWebs** | Optional | Switch | Include Sites and Webs in the output (Default = True) | | +| **Standalone** | Optional | Switch | Create export as if the farm is using a single server | | +| **Quiet** | Optional | Switch | (Deprecated) Run the export without showing the GUI | | + +## Examples + +### Example 1 + +Run an export by using the GUI + +```PowerShell +Export-SPConfiguration +``` + +### Example 2 + +Run an unattended export by specifying the resources + +```PowerShell +$credential = Get-Credential domain\farmadministrator +Export-SPConfiguration -ComponentsToExport "SPInstall", "SPFarm", "SPManagedAccount" -Credentials $credential -OutputPath 'C:\DscExport' +``` + +### Example 3 + +Run a full export by specifying the export mode + +```PowerShell +$credential = Get-Credential domain\farmadministrator +Export-SPConfiguration -Mode 'Full' -Credentials $credential -OutputPath 'C:\DscExport' +``` diff --git a/SharePointDsc/WikiSource/Getting-Started.md b/SharePointDsc/WikiSource/Getting-Started.md new file mode 100644 index 000000000..53e786147 --- /dev/null +++ b/SharePointDsc/WikiSource/Getting-Started.md @@ -0,0 +1,21 @@ +# Introduction + +SharePointDSC is an add-on to PowerShell Desired State Configuration (DSC). +The high level concept is that you can take a specific piece of configuration and deploy how this should act as code. + +You can then take the generated configuration file (.MOF) and Target this configuration to an environment / single server(node). + +This is useful in various scenarios, but can become complex depending how broad the scope is of the configuration and sub components and when aligning this with best practices for SharePoint or specific SharePoint Operating procedures i.e. Extending a Web Application instead of renaming. + +## Scenarios + +|Scenario|Description|Complexity| Estimated Effort| +| ----------- | ----------- |----------- |----------- | +|Deploying a new SharePoint Version| Creating an environment from scratch or using an example template for 2016 / 2019 / Subscription Edition for automation and guaranteed repeatability.|Medium|8-16 Hrs| +|Extracting an old farms Configuration|Taking a backup / extract of the entire configuration or piece/s of configuration.Has many additional use cases once extracted.|Low|2 Hrs| +|Comparison of configuration|Comparing the configuration between a last update , change or between environment i.e. Dev / Prod|High| 6 Hrs +|Restoring configuration from Prod-->Dev|This depends on the scope of configuration(More Scope = More Lines of PowerShell) and the intended action i.e. Change / Update / Add / Remove and aligning to Best Practices|Extremely High| Unknown| + +It's entirely possible that DSC is the right fit for you , and that there is a learning / discipline requirement. Or a Gap in your knowledge/ experience this Getting Started section is designed to help you. + +More information on PowerShell Desired State Configuration in general, can be found [here](https://docs.microsoft.com/en-us/powershell/scripting/dsc/overview/overview). \ No newline at end of file diff --git a/SharePointDsc/WikiSource/Home.md b/SharePointDsc/WikiSource/Home.md new file mode 100644 index 000000000..1320ccca2 --- /dev/null +++ b/SharePointDsc/WikiSource/Home.md @@ -0,0 +1,58 @@ +# Welcome to the SharePointDsc wiki + +SharePointDsc v#.#.# + +Here you will find all the information you need to make use of the SharePoint DSC resources, including details of the resources that are available, current capabilities and known issues, and information to help plan a DSC based implementation of SharePoint. + +Please leave comments, feature requests, and bug reports in the [issues section](../issues) for this module. + +## Quick start + +To get started, download SharePointDsc from the [PowerShell Gallery](http://www.powershellgallery.com/packages/SharePointDsc/) and then unzip it to one of your PowerShell modules folders (such as $env:ProgramFiles\WindowsPowerShell\Modules). +To install from the PowerShell gallery using PowerShellGet (in PowerShell 5.0), run the following command: + + Find-Module -Name SharePointDsc -Repository PSGallery | Install-Module + +To confirm installation, run the below command and ensure you see the SharePoint DSC resources available: + + Get-DscResource -Module SharePointDsc + +To view a more detailed explanation, view our [Getting Started](Getting-Started) page. + + +## Supported SharePoint versions + +SharePointDsc currently supports: + +- SharePoint Server 2013 with Service Pack 1 (or a higher update level) installed, running on Windows Server 2008 R2, Windows Server 2012 or Windows Server 2012 R2. +- SharePoint Server 2016 RTM (or higher) running on either Windows Server 2012 R2 or Windows Server 2019. +- SharePoint Server 2019 RTM (or higher) running on either Windows Server 2016 or Windows Server 2019. +- SharePoint Server Subscription Edition RTM (or higher) running on either Windows Server 2019 or Windows Server 2022. + + > For SharePoint 2013 to ensure correct provisioning of the User Profile Service and the User Profile Sync Service, the [February 2015 Cumulative Update](https://support.microsoft.com/en-us/kb/2920804) is also required. If you are installing SharePoint via the DSC resources, you can [slipstream it in to the update directory](http://www.toddklindt.com/blog/Lists/Posts/Post.aspx?ID=403) so it is applied during the initial installation. + +> SharePoint Foundation is not supported. + +## Known Issues +There are some known issues (and their solutions/workarounds) with SharePointDsc or PowerShell: + +[Error Exceeded the configured MaxEnvelopeSize quota](Error-Exceeded-the-configured-MaxEnvelopeSize-quota) + +[Setting up Central Administration on HTTPS](Setting-up-Central-Administration-on-HTTPS) + +[Using CredSSP on a domain controller / single server farm](Using-CredSSP-on-a-Domain-Controller) + +## Multilingual support + +Where possible, resources in SharePointDsc have been written in a way that they should support working with multiple language packs for multilingual deployments. However due to constraints in how we set up and install the product, only English ISOs are supported for installing SharePoint. + +## Resource Structure + +Resources inside the SharePointDSC module are categorized into 4 main groups. + +- Common Resources +- Specific Resources +- Distributed Resources +- Utility Resources + +To understand how to use these resources in your Configuration to avoid Syntax and undesired results go to our [Understanding Resources](Understanding-Resources) section. diff --git a/SharePointDsc/WikiSource/Installing-the-module.md b/SharePointDsc/WikiSource/Installing-the-module.md new file mode 100644 index 000000000..e8de7872c --- /dev/null +++ b/SharePointDsc/WikiSource/Installing-the-module.md @@ -0,0 +1,34 @@ +When working on Windows Server 2012R2 or any server without PowerShell 5.0. It's recommended to first upgrade PowerShell to v5.1. + +> [Download Windows Management Framework 5.1](https://www.microsoft.com/en-us/download/details.aspx?id=54616) + +If PowerShell is not regularly used or not connected to the internet like in many secure environments or servers you may need to switch PowerShell from using TLS 1.0 to TLS 1.2, so it can download the modules. +More information is published by the PowerShell Product Group in this [TLS1.2 and PowerShell](https://devblogs.microsoft.com/powershell/powershell-gallery-tls-support/) support article. +Line 16 shows how to install a new version of Powershell Get. + +> To mitigate this chance we have released a minor update to PowerShellGet which will allow you to continue to interact with the PowerShell Gallery. + +To install SharePointDsc, run the following commands: + +1. Open PowerShell as Administrator +1. Run `[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12` +1. Run `Register-PSRepository -Default` +1. Run `Install-Module -Name SharePointDSC` +1. Run `Install-Module ReverseDsc` (only if you want to export configurations) + +## Installing in a secure environment + +>If you followed steps above and received no errors you now have SharePoint DSC installed on your Machine and you can skip the next 2 steps. + +1. If your server is not connected to the internet you should have received an error in the previous steps. +2. Run `Save-Module -Name SharePointDSC,ReverseDsc -Path C:\Temp` on the machine connected to the Internet. This will download the modules to the specified folder. +3. Alternatively you can also install the module on the local machine, but this is not necessary: `Install-Module -Name SharePointDSC,ReverseDsc` on the machine connected to the Internet. Type `[A]` for All. +4. Manually copy the SharePointDsc and ReverseDsc folders from `C:\Temp` (from step 2) or `C:\Program Files\WindowsPowerShell\Modules` (from step 3) folders. You can optionally zip the folders. +5. Copy / Unzip the folders to the target machine into the Modules folder at `C:\Program Files\WindowsPowerShell` + +## Testing if the module is Installed + +You can use the Verb `Get-InstalledModule` to see All modules you have installed. +You can also use this block specifically. + + Get-InstalledModule SharePointDSC ,ReverseDSC diff --git a/SharePointDsc/WikiSource/Known-issues-with-remote-sessions.md b/SharePointDsc/WikiSource/Known-issues-with-remote-sessions.md new file mode 100644 index 000000000..ab5cdca6f --- /dev/null +++ b/SharePointDsc/WikiSource/Known-issues-with-remote-sessions.md @@ -0,0 +1,5 @@ +Due to the way that SharePointDsc uses a "remote" session to the local computer to impersonate a user for PowerShell 4 support (documented at "[Remote sessions and the InstallAccount variable](Remote-sessions-and-the-InstallAccount-variable)") there are a couple of known scenarios that do not work with this approach. The known scenarios are: + +## Updating SharePoint Designer settings in SPDesignerSettings + +The work around to this is to remove the InstallAccount property and instead us PsDscRunAsCredential (documented in the same link as above). This approach does require PowerShell 5 to work however, so if it is not possible to install PowerShell 5 then the above scenarios will not work and can not be used. diff --git a/SharePointDsc/WikiSource/Other-useful-modules-for-SharePoint-DSC-configurations.md b/SharePointDsc/WikiSource/Other-useful-modules-for-SharePoint-DSC-configurations.md new file mode 100644 index 000000000..41de5c92a --- /dev/null +++ b/SharePointDsc/WikiSource/Other-useful-modules-for-SharePoint-DSC-configurations.md @@ -0,0 +1,40 @@ +When working with SharePoint servers with PowerShell DSC, there are a number of other DSC modules which contain useful resources which can further assist with the automation of your environments. + +## xWebAdministration + +Available at: [https://www.powershellgallery.com/packages/xWebAdministration](https://www.powershellgallery.com/packages/xWebAdministration) + +This module contains resources which are responsible for managing IIS, which obviously play a key role in the front end server role of a SharePoint farm. +These resources can manage site configuring for tasks such as bindings, or remove the default IIS sites and app pools to reduce clutter. + + xWebAppPool RemoveDotNet2Pool { Name = ".NET v2.0"; Ensure = "Absent"; } + xWebAppPool RemoveDotNet2ClassicPool { Name = ".NET v2.0 Classic"; Ensure = "Absent"; } + xWebAppPool RemoveDotNet45Pool { Name = ".NET v4.5"; Ensure = "Absent"; } + xWebAppPool RemoveDotNet45ClassicPool { Name = ".NET v4.5 Classic"; Ensure = "Absent"; } + xWebAppPool RemoveClassicDotNetPool { Name = "Classic .NET AppPool"; Ensure = "Absent"; } + xWebAppPool RemoveDefaultAppPool { Name = "DefaultAppPool"; Ensure = "Absent"; } + xWebSite RemoveDefaultWebSite { Name = "Default Web Site"; Ensure = "Absent"; PhysicalPath = "C:\inetpub\wwwroot"; } + +## xCredSSP + +Available at [https://www.powershellgallery.com/packages/xCredSSP](https://www.powershellgallery.com/packages/xCredSSP) + +The xCredSSP module is a simple way to automate CredSSP configuration. See [Remote sessions and the InstallAccount variable](Remote-sessions-and-the-InstallAccount-variable) for more information on this. + +## SchannelDsc + +Available at [https://www.powershellgallery.com/packages/SchannelDsc](https://www.powershellgallery.com/packages/SchannelDsc) + +This module can be used to configure Secure Channel (SSL/TLS) settings in Windows, like disabling SSLv3 and enabling TLSv1.2. + +## OfficeOnlineServerDsc + +Available at [https://www.powershellgallery.com/packages/OfficeOnlineServerDsc](https://www.powershellgallery.com/packages/OfficeOnlineServerDsc) + +This module can be used to install and manage [Office Online Server](https://docs.microsoft.com/en-us/officeonlineserver/office-online-server). + +## WorkflowManagerDsc + +Available at [https://www.powershellgallery.com/packages/WorkflowManagerDsc](https://www.powershellgallery.com/packages/WorkflowManagerDsc) + +This module can be used to install and manage [Workflow Manager](https://docs.microsoft.com/en-us/sharepoint/governance/install-and-configure-workflow-for-sharepoint-server#install-workflow-manager). diff --git a/SharePointDsc/WikiSource/Prerequisites.md b/SharePointDsc/WikiSource/Prerequisites.md new file mode 100644 index 000000000..8b5a854c4 --- /dev/null +++ b/SharePointDsc/WikiSource/Prerequisites.md @@ -0,0 +1,10 @@ +To run PowerShell DSC, you need to have PowerShell 4.0 or higher (which is included in Windows Management Framework 4.0 or higher). +This version of PowerShell is shipped with Windows Server 2012 R2, and Windows 8.1 or higher. + +To use DSC on earlier versions of Windows, install the Windows Management Framework 4.0. + +However it is strongly recommended that PowerShell 5.0 (or above) is used, as it adds support for the PsDscRunAsCredential parameter and has overall better performance and troubleshooting capabilities. + +The logic behind this is explained on the page "[Remote sessions and the InstallAccount variable](Remote-sessions-and-the-InstallAccount-variable)" page. + +[PowerShell 5.1](https://www.microsoft.com/en-us/download/details.aspx?id=54616) includes significant improvements in Desired State Configuration and PowerShell Script Debugging. diff --git a/SharePointDsc/WikiSource/Remote-sessions-and-the-InstallAccount-variable.md b/SharePointDsc/WikiSource/Remote-sessions-and-the-InstallAccount-variable.md new file mode 100644 index 000000000..6eefdabd4 --- /dev/null +++ b/SharePointDsc/WikiSource/Remote-sessions-and-the-InstallAccount-variable.md @@ -0,0 +1,49 @@ +# PowerShell 4 + +In PowerShell 4, by default the normal behavior of the [local configuration manager](https://technet.microsoft.com/en-us/library/dn249922.aspx) in DSC is to execute configuration elements in the context of the local system account. +This presents an issue in a SharePoint environment as all access to SharePoint databases and resources is managed by allowing the appropriate service accounts permission to do so, and these service accounts are domain accounts, not local machine accounts. + +To get around this for the resources that manipulate SharePoint content, we need to impersonate another account to execute the commands. +This is achieved through the use of the parameter "InstallAccount", which is present in almost all of the resources in the SharePointDsc module. +The InstallAccount parameter represents the account that is responsible for the creation and management of all SharePoint resources in the farm. +It is likely to be a highly privileged account (which may include local administrator rights - so do not use an account that is also used to run services or components anywhere in SharePoint, use a dedicated account instead). + +The impersonation is managed through the use of the Invoke-Command cmdlet in PowerShell, in conjunction with creating an appropriate "remote" session through New-PSSession. +Each session that is created this way will always target "localhost" as opposed to a genuinely remote computer, but it gives us the opportunity to control the authentication for that session. +In the SharePointDsc module, we authenticate as the InstallAccount, and we specify that CredSSP is used as the authentication mechanism. + +To enable CredSSP, there is some configuration that needs to take place first, and there are two methods of doing this. + +## Option 1: Manually configure CredSSP + +You can manually configure CredSSP through the use of some PowerShell cmdlet's (and potentially group policy to configure the allowed delegate computers). Some basic instructions can be found at [https://technet.microsoft.com/en-us/magazine/ff700227.aspx](https://technet.microsoft.com/en-us/magazine/ff700227.aspx). + +### Option 2: Configure CredSSP through a DSC resource + +It is possible to use a DSC resource to configure your CredSSP settings on a server, and include this in all of your SharePoint server configurations. +This is done through the use of the [xCredSSP](https://github.com/PowerShell/xCredSSP) resource. The below example shows how this can be used. + + xCredSSP CredSSPServer { Ensure = "Present"; Role = "Server" } + xCredSSP CredSSPClient { Ensure = "Present"; Role = "Client"; DelegateComputers = $CredSSPDelegates } + +In the above example, $CredSSPDelegates can be a wildcard name (such as "*.contoso.com" to allow all servers in the contoso.com domain), or a list of specific servers (such as "server1", "server 2" to allow only specific servers). + +## PowerShell 5 + +PowerShell 5 offers a different approach to how impersonation is done. With WMF 5 installed, all DSC resources (not just those in SharePointDsc) can add a parameter called PsDscRunAsCredential. +This property tells the LCM to run that specific resource with the credential that is supplied instead of the local system account. +This removes the need to have InstallAccount on SharePointDsc resources. However, instead of removing it, logic was added that would allow you to use either InstallAccount or PsDscRunAsCredential. +The SharePointDsc resources will detect if they are running as the local system account or not and will only use a "remote" session as described above where it is needed. + +Also note that some resources in SharePointDsc still use the above described remote session technique to simulate other others regardless of whether or not PsDscRunAsCredential is used. +An example of this is [SPUserProfileSyncService](SPUserProfileSyncService) which uses this approach to run as the farm account value. + +An example of how to use this property in PowerShell 5 is shown below: + + SPCacheAccounts SetCacheAccounts + { + WebAppUrl = "http://sharepoint.contoso.com" + SuperUserAlias = "DEMO\svcSPSuperUser" + SuperReaderAlias = "DEMO\svcSPReader" + PsDscRunAsCredential = $InstallAccount + } diff --git a/SharePointDsc/WikiSource/Setting-up-Central-Administration-on-HTTPS.md b/SharePointDsc/WikiSource/Setting-up-Central-Administration-on-HTTPS.md new file mode 100644 index 000000000..0280dadf5 --- /dev/null +++ b/SharePointDsc/WikiSource/Setting-up-Central-Administration-on-HTTPS.md @@ -0,0 +1,24 @@ +Setting up Central Administration on HTTPS is still not a straight forward process. Here, we describe one way to accomplish this using DSC with a choice of a couple of workarounds to ensure it stays configured properly. Starting in SharePoint 2016, the PowerShell cmdlet New-SPCentralAdministration added support for a -SecureSocketsLayer argument to initialize CA with HTTPS. This cmdlet still does not, however, support specifying a hostname to use with SNI to avoid conflicts with creating web applications on the same IP/port in IIS. So we're going to use DSC to create our farm with CA on HTTP using a high port like 9999 and then later (after creating our web apps) update the IIS binding to HTTPS with a hostname using SNI and update the AAM in SharePoint. + +For the code, please see the [SharePoint.SSL.ps1](https://github.com/PowerShell/SharePointDsc/blob/dev/Modules/SharePointDsc/Examples/Small-Farm/SharePoint.SSL.ps1) example in the Examples/Small Farm folder. + +## Workarounds + +When running the SharePoint Products Configuration Wizard (psconfigUI.exe) on the Central Administration server, it will try to reconfigure the Central Administration web application as part of the process. In most cases, it will not recognize the hostname as part of the binding and may reset the IIS HTTPS binding and add an HTTP binding and corresponding Alternate Access Mapping (AAM). + +To avoid this problem, you can use psconfig.exe from the SharePoint Management Shell instead: + +``` +PSConfig.exe -cmd upgrade -inplace b2b -wait -cmd applicationcontent -install -cmd installfeatures -cmd secureresources -cmd services -install +``` + +An alternative workaround involves removing and recreating the Central Administration web application after the farm has been provisioned. Use the following PowerShell commands in an elevated SharePoint Management Shell: + +```powershell +Remove-SPWebApplication -Identity https://admin.contoso.com -Zone Default -DeleteIISSite + +New-SPWebApplicationExtension -Identity https://admin.contoso.com -Name "SharePoint Central Administration v4" -Zone Default -HostHeader admin.contoso.com -Port 443 -SecureSocketsLayer +``` + +This method stores the IIS binding information in SharePoint so that the configuration wizard will not wipe out the existing IIS bindings when running psconfigUI.exe. + diff --git a/SharePointDsc/WikiSource/Understanding-Resources.md b/SharePointDsc/WikiSource/Understanding-Resources.md new file mode 100644 index 000000000..77c9cf39d --- /dev/null +++ b/SharePointDsc/WikiSource/Understanding-Resources.md @@ -0,0 +1,159 @@ +# Resource Types + +## Common Resources + +These resources need to be defined within every node in the farm. The parameters specify for the resources associated with Common Resources should be the same for each server (e.g. the same language packs need to be installed on all servers in the farm). As an example, the SPInstall resource, which installs the SharePoint binaries on a server, needs to be present within every node in the farm. It is not enough to have only one server with the binaries installed on in a multi-server farm. Common Resources are identified in the list below with the mention **Common**. + +## Specific Resources + +Just like the Common Resources, the Specific Resources need to be included within every node in the farm. Their only difference, compare to Common Resources, is that the resources' parameters may differ from one node to another in the farm. As an example, the SPServiceInstance resource, which allows us to enable specific services on a SharePoint Server, will be specified for each server in the farm, but with different "Ensure" value to allow certain services to be started on specific servers, but not on others. Specific Resources are identified in the list below with the mention **Specific**. + +## Distributed Resources + +This category covers the major part of the resources. Distributed Resources should ONLY be defined within ONE node in the farm. As the name states it, those are distributed which means that resources of this type are normally stored in a central database. Specifying these resources on more than one node in the farm may introduce unexpected behaviors (race condition, performance issues, etc.). For example, if you wanted to create a new Web Application using the traditional PowerShell approach, you would pick one server and run the New-SPWebApplication cmdlet on it, you would not run it on each of the servers in the farm. To define these resources, identify one server in your configuration (e.g. the first server to create/join the farm), and define all the Distributed Resources within it. Distributed Resources are identified in the list below with the mention **Distributed**. + +## Utility Resources + +Utility Resources are resources that do not generate an artefact per say. Their sole purpose is to help you initiate a check or apply a patch. As an example, the SPMinRoleCompliance resource simply returns true or false (in its Test-TargetResource function) if the services running on a server correspond to the services that are associated with its assigned MinRole. It does not enable, disable or even create any service instances. Utility Resources are identified in the list below with the mention **Utility** . + +# Available resources + +The SharePointDsc module includes the following DSC resources + +|Resource|Type|Requires CredSSP| +|--|--|--| +|[SPAccessServiceApp](SPAccessServiceApp) | Distributed | - | +|[SPAccessServices2010](SPAccessServices2010) | Distributed | - | +|[SPAlternateUrl](SPAlternateUrl) | Distributed | - | +|[SPAntivirusSettings](SPAntivirusSettings) | Distributed | - | +|[SPAppCatalog](SPAppCatalog) | Distributed | Yes | +|[SPAppDomain](SPAppDomain) | Distributed | - | +|[SPAppManagementServiceApp](SPAppManagementServiceApp) | Distributed | - | +|[SPAppStoreSettings](SPAppStoreSettings) | Distributed | - | +|[SPAuthenticationRealm](SPAuthenticationRealm) | Distributed | - | +|[SPAzureAccessControlServiceAppProxy](SPAzureAccessControlServiceAppProxy) | Distributed | - | +|[SPBCSServiceApp](SPBCSServiceApp) | Distributed | - | +|[SPBlobCacheSettings](SPBlobCacheSettings) | Specific | - | +|[SPCacheAccounts](SPCacheAccounts) | Distributed | - | +|[SPCertificate](SPCertificate) | Distributed | - | +|[SPCertificateSettings](SPCertificate) | Distributed | - | +|[SPConfigWizard](SPConfigWizard) | Utility | - | +|[SPContentDatabase](SPContentDatabase) | Distributed | - | +|[SPDatabaseAAG](SPDatabaseAAG) | Distributed | - | +|[SPDesignerSettings](SPDesignerSettings) | Distributed | - | +|[SPDiagnosticLoggingSettings](SPDiagnosticLoggingSettings) | Distributed | - | +|[SPDiagnosticsProvider](SPDiagnosticsProvider) | Distributed | - | +|[SPDistributedCacheClientSettings](SPDistributedCacheClientSettings) | Distributed | - | +|[SPDistributedCacheService](SPDistributedCacheService) | Specific | - | +|[SPDocIcon](SPDocIcon) | Common | - | +|[SPExcelServiceApp](SPExcelServiceApp) | Distributed | - | +|[SPFarm](SPFarm) | Specific | - | +|[SPFarmAdministrators](SPFarmAdministrators) | Distributed | - | +|[SPFarmPropertyBag](SPFarmPropertyBag) | Distributed | - | +|[SPFarmSolution](SPFarmSolution) | Distributed | - | +|[SPFeature](SPFeature) | Distributed | - | +|[SPHealthAnalyzerRuleState](SPHealthAnalyzerRuleState) | Distributed | - | +|[SPIncomingEmailSettings](SPIncomingEmailSettings) | Distributed | - | +|[SPInfoPathFormsServiceConfig](SPInfoPathFormsServiceConfig) | Distributed | - | +|[SPInstall](SPInstall) | Common | - | +|[SPInstallLanguagePack](SPInstallLanguagePack) | Common | - | +|[SPInstallPrereqs](SPInstallPrereqs) | Common | - | +|[SPIrmSettings](SPIrmSettings) | Distributed | - | +|[SPLogLevel](SPLogLevel) | Distributed | - | +|[SPMachineTranslationServiceApp](SPMachineTranslationServiceApp) | Distributed | - | +|[SPManagedAccount](SPManagedAccount) | Distributed | - | +|[SPManagedMetaDataServiceApp](SPManagedMetaDataServiceApp) | Distributed | - | +|[SPManagedMetaDataServiceAppDefault](SPManagedMetaDataServiceAppDefault) | Distributed | - | +|[SPManagedPath](SPManagedPath) | Distributed | - | +|[SPMinRoleCompliance](SPMinRoleCompliance) | Utility | - | +|[SPOAppPrincipalMgmtServiceAppProxy](SPOAppPrincipalMgmtServiceAppProxy) | Distributed | - | +|[SPOfficeOnlineServerBinding](SPOfficeOnlineServerBinding) | Distributed | - | +|[SPOfficeOnlineServerSupressionSettings](SPOfficeOnlineServerSupressionSettings) | Distributed | - | +|[SPOutgoingEmailSettings](SPOutgoingEmailSettings) | Distributed | - | +|[SPPasswordChangeSettings](SPPasswordChangeSettings) | Distributed | - | +|[SPPerformancePointServiceApp](SPPerformancePointServiceApp) | Distributed | - | +|[SPPowerPointAutomationServiceApp](SPPowerPointAutomationServiceApp) | Distributed | - | +|[SPProductUpdate](SPProductUpdate) | Common | - | +|[SPProjectServerAdditionalSettings](SPProjectServerAdditionalSettings) | Distributed | - | +|[SPProjectServerADResourcePoolSync](SPProjectServerADResourcePoolSync) | Distributed | - | +|[SPProjectServerGlobalPermissions](SPProjectServerGlobalPermissions) | Distributed | - | +|[SPProjectServerGroup](SPProjectServerGroup) | Distributed | - | +|[SPProjectServerLicense](SPProjectServerLicense) | Distributed | - | +|[SPProjectServerPermissionMode](SPProjectServerPermissionMode) | Distributed | - | +|[SPProjectServerServiceApp](SPProjectServerServiceApp) | Distributed | - | +|[SPProjectServerTimeSheetSettings](SPProjectServerTimeSheetSettings) | Distributed | - | +|[SPProjectServerUserSyncSettings](SPProjectServerUserSyncSettings) | Distributed | - | +|[SPProjectServerWssSettings](SPProjectServerWssSettings) | Distributed | - | +|[SPPublishServiceApplication](SPPublishServiceApplication) | Distributed | - | +|[SPQuotaTemplate](SPQuotaTemplate) | Distributed | - | +|[SPRemoteFarmTrust](SPRemoteFarmTrust) | Distributed | - | +|[SPSearchAuthoritivePage](SPSearchAuthoritivePage) | Distributed | - | +|[SPSearchContentSource](SPSearchContentSource) | Distributed | - | +|[SPSearchCrawlerImpactRule](SPSearchCrawlerImpactRule) | Distributed | - | +|[SPSearchCrawlMapping](SPSearchCrawlMapping) | Distributed | - | +|[SPSearchCrawlRule](SPSearchCrawlRule) | Distributed | - | +|[SPSearchFileType](SPSearchFileType) | Distributed | - | +|[SPSearchIndexPartition](SPSearchIndexPartition) | Distributed | - | +|[SPSearchManagedProperty](SPSearchManagedProperty) | Distributed | - | +|[SPSearchMetadataCategory](SPSearchMetadataCategory) | Distributed | - | +|[SPSearchResultSource](SPSearchResultSource) | Distributed | - | +|[SPSearchServiceApp](SPSearchServiceApp) | Distributed | - | +|[SPSearchServiceSettings](SPSearchServiceSettings) | Distributed | - | +|[SPSearchTopology](SPSearchTopology) | Distributed | - | +|[SPSecureStoreServiceApp](SPSecureStoreServiceApp) | Distributed | - | +|[SPSecurityTokenServiceConfig](SPSecurityTokenServiceConfig) | Distributed | - | +|[SPSelfServiceSiteCreation](SPSelfServiceSiteCreation) | Distributed | - | +|[SPService](SPService) | Distributed | - | +|[SPServiceAppPool](SPServiceAppPool) | Distributed | - | +|[SPServiceAppProxyGroup](SPServiceAppProxyGroup) | Distributed | - | +|[SPServiceAppSecurity](SPServiceAppSecurity) | Distributed | - | +|[SPServiceIdentity](SPServiceIdentity) | Distributed | - | +|[SPServiceInstance](SPServiceInstance) | Specific | - | +|[SPSessionStateService](SPSessionStateService) | Distributed | - | +|[SPShellAdmins](SPShellAdmins) | Distributed | - | +|[SPSite](SPSite) | Distributed | - | +|[SPSitePropertyBag](SPSitePropertyBag) | Distributed | - | +|[SPSiteUrl](SPSiteUrl) | Distributed | - | +|[SPStateServiceApp](SPStateServiceApp) | Distributed | - | +|[SPSubscriptionSettingsServiceApp](SPSubscriptionSettingsServiceApp) | Distributed | - | +|[SPTimerJobState](SPTimerJobState) | Distributed | - | +|[SPTrustedIdentityTokenIssuer](SPTrustedIdentityTokenIssuer) | Distributed | - | +|[SPTrustedIdentityTokenIssuerProviderRealms](SPTrustedIdentityTokenIssuerProviderRealms) | Distributed | - | +|[SPTrustedRootAuthority](SPTrustedRootAuthority) | Distributed | - | +|[SPTrustedSecurityTokenIssuer](SPTrustedSecurityTokenIssuer) | Distributed | - | +|[SPUsageApplication](SPUsageApplication) | Distributed | - | +|[SPUsageDefinition](SPUsageDefinition) | Distributed | - | +|[SPUserProfileProperty](SPUserProfileProperty) | Distributed | - | +|[SPUserProfileSection](SPUserProfileSection) | Distributed | - | +|[SPUserProfileServiceApp](SPUserProfileServiceApp) | Distributed | - | Yes | +|[SPUserProfileServiceAppPermissions](SPUserProfileServiceAppPermissions) | Distributed | - | +|[SPUserProfileSyncConnection](SPUserProfileSyncConnection) | Distributed | - | +|[SPUserProfileSyncService](SPUserProfileSyncService) | Specific | Yes | +|[SPVisioServiceApp](SPVisioServiceApp) | Distributed | - | +|[SPWeb](SPWeb) | Distributed | - | +|[SPWebAppAuthentication](SPWebAppAuthentication) | Distributed | - | +|[SPWebAppBlockedFileTypes](SPWebAppBlockedFileTypes) | Distributed | - | +|[SPWebAppClientCallableSettings](SPWebAppClientCallableSettings) | Distributed | - | +|[SPWebAppGeneralSettings](SPWebAppGeneralSettings) | Distributed | - | +|[SPWebAppHttpThrottlingMonitor](SPWebAppHttpThrottlingMonitor) | Distributed | - | +|[SPWebApplication](SPWebApplication) | Distributed | - | +|[SPWebApplicationAppDomain](SPWebApplicationAppDomain) | Distributed | - | +|[SPWebApplicationExtension](SPWebApplicationExtension) | Distributed | - | +|[SPWebAppPeoplePickerSettings](SPWebAppPeoplePickerSettings) | Distributed | - | +|[SPWebAppPermissions](SPWebAppPermissions) | Distributed | - | +|[SPWebAppPolicy](SPWebAppPolicy) | Distributed | - | +|[SPWebAppPropertyBag](SPWebAppPropertyBag) | Distributed | - | +|[SPWebAppProxyGroup](SPWebAppProxyGroup) | Distributed | - | +|[SPWebAppSiteUseAndDeletion](SPWebAppSiteUseAndDeletion) | Distributed | - | +|[SPWebAppSuiteBar](SPWebAppSuiteBar) | Distributed | - | +|[SPWebAppThrottlingSettings](SPWebAppThrottlingSettings) | Distributed | - | +|[SPWebAppWorkflowSettings](SPWebAppWorkflowSettings) | Distributed | - | +|[SPWordAutomationServiceApp](SPWordAutomationServiceApp) | Distributed | - | +|[SPWorkflowService](SPWorkflowService) | Distributed | - | +|[SPWorkManagementServiceApp](SPWorkManagementServiceApp) | Distributed | - | + +## Using the Script resource in configurations with SharePointDsc + +Check-out this [article](Using-the-Script-resource-in-configurations-that-use-SharePointDsc) if you want to use the Script resource to implement custom functionality that is not included in SharePointDsc. + +> Of course you can also create an issue in the issue list to request the functionality to be added. Sharing code that you already have will greatly speed up the development effort. \ No newline at end of file diff --git a/SharePointDsc/WikiSource/Using-CredSSP-on-a-Domain-Controller.md b/SharePointDsc/WikiSource/Using-CredSSP-on-a-Domain-Controller.md new file mode 100644 index 000000000..e97fd215d --- /dev/null +++ b/SharePointDsc/WikiSource/Using-CredSSP-on-a-Domain-Controller.md @@ -0,0 +1,25 @@ +When you are trying to use the resources that require CredSSP, you can run into issues when deploying to a single server which is also a domain controller. + +> **NOTE:** Installing SharePoint on a domain controller should not be done in Production scenarios! + +Even though you configured CredSSP as required, you can run into the following error message: +``` +Test-WSMan : The WinRM client cannot process the request. A computer policy does not allow the delegation of the user credentials to the target computer because the computer is not trusted. The identity of the t +arget computer can be verified if you configure the WSMAN service to use a valid certificate using the following command: winrm set winrm/config/service @{CertificateThumbprint="<thumbprint>"} Or you can check the Event Viewer for an event that specifies that the following SPN could not be created: WSMAN/<computerFQDN>. If you find + this event, you can manually create the SPN using setspn.exe . If the SPN exists, but CredSSP cannot use Kerberos to validate the identity of the target computer and you still want to allow the delegation of the user credentials to the target computer, use gpedit.msc and look at the following policy: Computer Configuration -> Administrativ +e Templates -> System -> Credentials Delegation -> Allow Fresh Credentials with NTLM-only Server Authentication. Verify that it is enabled and configured with an SPN appropriate for the target computer. For example, for a target computer name "myserver.domain.com", the SPN can be one of the following: WSMAN/myserver.domain.com or WSMA +N/*.domain.com. Try the request again after these changes. +At line:1 char:1 ++ Test-WSMan -Authentication Credssp -ComputerName Server1 -Credential ... ++ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + CategoryInfo : InvalidOperation: (Server1:String) [Test-WSMan], InvalidOperationException + + FullyQualifiedErrorId : WsManError,Microsoft.WSMan.Management.TestWSManCommand +``` + +You can resolve this issue by configuring Service Principal Names in Active Directory for the server: +``` +setspn -S wsman/server1.domain.com server1 +setspn -S wsman/server1 server1 +``` + +After configuring these SPNs, CredSSP will run as expected again! \ No newline at end of file diff --git a/SharePointDsc/WikiSource/Using-the-Script-resource-in-configurations-that-use-SharePointDsc.md b/SharePointDsc/WikiSource/Using-the-Script-resource-in-configurations-that-use-SharePointDsc.md new file mode 100644 index 000000000..6ef142ac0 --- /dev/null +++ b/SharePointDsc/WikiSource/Using-the-Script-resource-in-configurations-that-use-SharePointDsc.md @@ -0,0 +1,19 @@ +In some circumstances you may find yourself needing to use a [Script resource](https://msdn.microsoft.com/en-us/powershell/dsc/scriptresource) to be able to perform a function that is not included in SharePointDsc. If your script resource needs to add the SharePoint snap-in you may find that this will cause issues with other resources provided by SharePointDsc (as discussed in in [this issue](https://github.com/PowerShell/SharePointDsc/issues/566)). To work around this, it is recommended that instead of loading the snap-in yourself you use the Invoke-SPDscCommand helper to achieve this. This helper method will load the snap-in for you in the same way that the native resources of SharePointDsc do, and will avoid conflicts with it being loaded multiple times. + +An example of this in a script resources is shown below: + +```PowerShell +Script SPDscExample +{ + GetScript = { + Invoke-SPDscCommand -ScriptBlock { + # your code goes here + $params = $args[0] + Write-Verbose $params.Foo + } -Arguments @{ Foo = "Bar" } -Credentials (Get-Credentials) + } + ... +} +``` + +If you need to pass a credential or additional arguments, you can use the -Credential and -Arguments parameters for these purposes also. \ No newline at end of file diff --git a/SharePointDsc/WikiSource/_Footer.md b/SharePointDsc/WikiSource/_Footer.md new file mode 100644 index 000000000..f7b23b61f --- /dev/null +++ b/SharePointDsc/WikiSource/_Footer.md @@ -0,0 +1 @@ +![SharePointDSC](media/footer.png "SharePointDsc") \ No newline at end of file diff --git a/SharePointDsc/WikiSource/_Sidebar.md b/SharePointDsc/WikiSource/_Sidebar.md new file mode 100644 index 000000000..adfcc0ddd --- /dev/null +++ b/SharePointDsc/WikiSource/_Sidebar.md @@ -0,0 +1,14 @@ +# SharePointDsc Module + +- [Home](Home) +- [Getting Started](Getting-Started) +- [Pre-requisites](Prerequisites) +- [Installing the module](Installing-the-module) +- [Exporting SharePoint Configuration](Export-SharePoint-Configuration) +- [Creating Configuration Files](Creating-Configuration-Files) +- [Pre-created Examples](https://github.com/dsccommunity/SharePointDsc/tree/master/SharePointDsc/Examples) +- [Creating an Azure development environment](Creating-an-Azure-development-environment) +- [Understanding Resources & Syntax](Understanding-Resources) +- [Remote PowerShell Authentication](Remote-sessions-and-the-InstallAccount-variable) +- [Contributing to SharePointDsc](Contributing-to-SharePointDsc) +- [Other useful modules for SharePoint DSC configurations](Other-useful-modules-for-SharePoint-DSC-configurations) diff --git a/SharePointDsc/WikiSource/media/ExportGUI.png b/SharePointDsc/WikiSource/media/ExportGUI.png new file mode 100644 index 0000000000000000000000000000000000000000..0df2c9153fd39b974ce6be97394e539afac1d546 GIT binary patch literal 75280 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 literal 0 HcmV?d00001 diff --git a/SharePointDsc/WikiSource/media/footer.png b/SharePointDsc/WikiSource/media/footer.png new file mode 100644 index 0000000000000000000000000000000000000000..7d3e0e198609ba8fc0df405bbba0cd74a24a4a5c GIT binary patch literal 47135 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 Lp-}PUb + if ($BuiltModuleSubdirectory) + { + if (-not (Split-Path -IsAbsolute -Path $BuiltModuleSubdirectory)) + { + $BuildModuleOutput = Join-Path -Path $OutputDirectory -ChildPath $BuiltModuleSubdirectory + } + else + { + $BuildModuleOutput = $BuiltModuleSubdirectory + } + } # test if BuiltModuleSubDirectory set in build config file + elseif ($BuildInfo.ContainsKey('BuiltModuleSubDirectory')) + { + $BuildModuleOutput = Join-Path -Path $OutputDirectory -ChildPath $BuildInfo['BuiltModuleSubdirectory'] + } + else + { + $BuildModuleOutput = $OutputDirectory + } + + # Pre-pending $BuildModuleOutput folder to PSModulePath to resolve built module from this folder. + if ($powerShellModulePaths -notcontains $BuildModuleOutput) + { + Write-Host -Object "[build] Pre-pending '$BuildModuleOutput' folder to PSModulePath" -ForegroundColor Green + + $env:PSModulePath = $BuildModuleOutput + [System.IO.Path]::PathSeparator + $env:PSModulePath + } + <# Import Tasks from modules via their exported aliases when defined in Build Manifest. https://github.com/nightroman/Invoke-Build/tree/master/Tasks/Import#example-2-import-from-a-module-with-tasks @@ -403,30 +440,6 @@ Begin } } - if ($BuiltModuleSubdirectory) - { - if (-not (Split-Path -IsAbsolute -Path $BuiltModuleSubdirectory)) - { - $BuildModuleOutput = Join-Path -Path $OutputDirectory -ChildPath $BuiltModuleSubdirectory - } - else - { - $BuildModuleOutput = $BuiltModuleSubdirectory - } - } - else - { - $BuildModuleOutput = $OutputDirectory - } - - # Pre-pending $BuildModuleOutput folder to PSModulePath to resolve built module from this folder. - if ($powerShellModulePaths -notcontains $BuildModuleOutput) - { - Write-Host -Object "[pre-build] Pre-pending '$BuildModuleOutput' folder to PSModulePath" -ForegroundColor Green - - $env:PSModulePath = $BuildModuleOutput + [System.IO.Path]::PathSeparator + $env:PSModulePath - } - <# The variable $PSDependTarget will be used below when building the splatting variable before calling Resolve-Dependency.ps1, unless overridden in the diff --git a/build.yaml b/build.yaml index f70c953b5..b5c8db7bb 100644 --- a/build.yaml +++ b/build.yaml @@ -52,13 +52,13 @@ BuildWorkflow: # code coverage files and needs to get merged into one file. #- Merge_CodeCoverage_Files - merge: - Merge_CodeCoverage_Files publish: - Publish_Release_To_GitHub - Publish_Module_To_Gallery + - Publish_GitHub_Wiki_Content #################################################### # PESTER Configuration # diff --git a/tests/Unit/SharePointDsc/SharePointDsc.SPWebAppPeoplePickerSettings.Tests.ps1 b/tests/Unit/SharePointDsc/SharePointDsc.SPWebAppPeoplePickerSettings.Tests.ps1 index f10ece39a..c45ea920d 100644 --- a/tests/Unit/SharePointDsc/SharePointDsc.SPWebAppPeoplePickerSettings.Tests.ps1 +++ b/tests/Unit/SharePointDsc/SharePointDsc.SPWebAppPeoplePickerSettings.Tests.ps1 @@ -49,7 +49,7 @@ try InModuleScope -ModuleName $script:DSCResourceFullName -ScriptBlock { Describe -Name $Global:SPDscHelper.DescribeHeader -Fixture { BeforeAll { - Invoke-Command -ScriptBlock $Global:SPDscHelper.InitializeScript -NoNewScope + Invoke-Command -Scriptblock $Global:SPDscHelper.InitializeScript -NoNewScope # Initialize tests $mockPassword = ConvertTo-SecureString -String "password" -AsPlainText -Force @@ -57,7 +57,8 @@ try -ArgumentList @("username", $mockPassword) try - { [Microsoft.SharePoint.Administration.SPPeoplePickerSearchActiveDirectoryDomain] + { + [Microsoft.SharePoint.Administration.SPPeoplePickerSearchActiveDirectoryDomain] } catch { @@ -135,42 +136,43 @@ try WebAppUrl = "http://sharepoint.contoso.com" SearchActiveDirectoryDomains = @( (New-CimInstance -ClassName MSFT_SPWebAppPPSearchDomain -Property @{ - FQDN = "contoso.intra" - IsForest = $false - AccessAccount = (New-CimInstance -ClassName MSFT_Credential ` - -Property @{ - Username = [string]$mockAccount.UserName; - Password = [string]$mockAccount.Password; - } ` - -Namespace root/microsoft/windows/desiredstateconfiguration ` - -ClientOnly) - } -ClientOnly) + FQDN = "contoso.intra" + IsForest = $false + AccessAccount = (New-CimInstance -ClassName MSFT_Credential ` + -Property @{ + Username = [string]$mockAccount.UserName; + Password = [string]$mockAccount.Password; + } ` + -Namespace root/microsoft/windows/desiredstateconfiguration ` + -ClientOnly) + } -ClientOnly) ) } Mock -CommandName Get-SPWebApplication -MockWith { $searchADdom = New-Object -TypeName "System.Collections.Generic.List[System.Object]" $searchDom1 = New-Object -TypeName "Object" | ` - Add-Member -MemberType NoteProperty ` - -Name DomainName ` - -Value ( "contosonew.intra" ) -PassThru | ` - Add-Member -MemberType NoteProperty ` - -Name IsForest ` - -Value ( $false ) -PassThru | ` - Add-Member -MemberType NoteProperty ` - -Name LoginName ` - -Value ( $mockAccount.UserName ) -PassThru + Add-Member -MemberType NoteProperty ` + -Name DomainName ` + -Value ( "contosonew.intra" ) -PassThru | ` + Add-Member -MemberType NoteProperty ` + -Name IsForest ` + -Value ( $false ) -PassThru | ` + Add-Member -MemberType NoteProperty ` + -Name LoginName ` + -Value ( $mockAccount.UserName ) -PassThru $searchADdom.Add($searchDom1) $returnval = @{ PeoplePickerSettings = @{ - ActiveDirectoryCustomFilter = "()" - ActiveDirectoryCustomQuery = "()" - ActiveDirectorySearchTimeout = @{ + ActiveDirectoryCustomFilter = "()" + ActiveDirectoryCustomQuery = "()" + ActiveDirectorySearchTimeout = @{ TotalSeconds = 10 } - OnlySearchWithinSiteCollection = $true - SearchActiveDirectoryDomains = $searchADdom + OnlySearchWithinSiteCollection = $true + PeopleEditorOnlyResolveWithinSiteCollection = $true + SearchActiveDirectoryDomains = $searchADdom } } $returnval = $returnval | Add-Member -MemberType ScriptMethod -Name Update -Value { @@ -199,36 +201,38 @@ try Context -Name "Settings do not match actual values" -Fixture { BeforeAll { $testParams = @{ - WebAppUrl = "http://sharepoint.contoso.com" - ActiveDirectoryCustomFilter = $null - ActiveDirectoryCustomQuery = $null - ActiveDirectorySearchTimeout = 30 - OnlySearchWithinSiteCollection = $false + WebAppUrl = "http://sharepoint.contoso.com" + ActiveDirectoryCustomFilter = $null + ActiveDirectoryCustomQuery = $null + ActiveDirectorySearchTimeout = 30 + OnlySearchWithinSiteCollection = $false + PeopleEditorOnlyResolveWithinSiteCollection = $false } Mock -CommandName Get-SPWebApplication -MockWith { $searchADdom = New-Object -TypeName "System.Collections.Generic.List[System.Object]" $searchDom1 = New-Object -TypeName "Object" | ` - Add-Member -MemberType NoteProperty ` - -Name DomainName ` - -Value ( "contoso.intra" ) -PassThru | ` - Add-Member -MemberType NoteProperty ` - -Name IsForest ` - -Value ( $false ) -PassThru | ` - Add-Member -MemberType NoteProperty ` - -Name LoginName ` - -Value ( $mockAccount.UserName ) -PassThru + Add-Member -MemberType NoteProperty ` + -Name DomainName ` + -Value ( "contoso.intra" ) -PassThru | ` + Add-Member -MemberType NoteProperty ` + -Name IsForest ` + -Value ( $false ) -PassThru | ` + Add-Member -MemberType NoteProperty ` + -Name LoginName ` + -Value ( $mockAccount.UserName ) -PassThru $searchADdom.Add($searchDom1) $returnval = @{ PeoplePickerSettings = @{ - ActiveDirectoryCustomFilter = "()" - ActiveDirectoryCustomQuery = "()" - ActiveDirectorySearchTimeout = @{ + ActiveDirectoryCustomFilter = "()" + ActiveDirectoryCustomQuery = "()" + ActiveDirectorySearchTimeout = @{ TotalSeconds = 10 } - OnlySearchWithinSiteCollection = $true - SearchActiveDirectoryDomains = $searchADdom + OnlySearchWithinSiteCollection = $true + PeopleEditorOnlyResolveWithinSiteCollection = $true + SearchActiveDirectoryDomains = $searchADdom } } $returnval = $returnval | Add-Member -MemberType ScriptMethod -Name Update -Value { @@ -260,42 +264,43 @@ try WebAppUrl = "http://sharepoint.contoso.com" SearchActiveDirectoryDomains = @( (New-CimInstance -ClassName MSFT_SPWebAppPPSearchDomain -Property @{ - FQDN = "contoso.intra" - IsForest = $false - AccessAccount = (New-CimInstance -ClassName MSFT_Credential ` - -Property @{ - Username = [string]$mockAccount.UserName; - Password = [string]$mockAccount.Password; - } ` - -Namespace root/microsoft/windows/desiredstateconfiguration ` - -ClientOnly) - } -ClientOnly) + FQDN = "contoso.intra" + IsForest = $false + AccessAccount = (New-CimInstance -ClassName MSFT_Credential ` + -Property @{ + Username = [string]$mockAccount.UserName; + Password = [string]$mockAccount.Password; + } ` + -Namespace root/microsoft/windows/desiredstateconfiguration ` + -ClientOnly) + } -ClientOnly) ) } Mock -CommandName Get-SPWebApplication -MockWith { $searchADdom = New-Object -TypeName "System.Collections.Generic.List[System.Object]" $searchDom1 = New-Object -TypeName "Object" | ` - Add-Member -MemberType NoteProperty ` - -Name DomainName ` - -Value ( "contoso.intra" ) -PassThru | ` - Add-Member -MemberType NoteProperty ` - -Name IsForest ` - -Value ( $false ) -PassThru | ` - Add-Member -MemberType NoteProperty ` - -Name LoginName ` - -Value ( $mockAccount.UserName ) -PassThru + Add-Member -MemberType NoteProperty ` + -Name DomainName ` + -Value ( "contoso.intra" ) -PassThru | ` + Add-Member -MemberType NoteProperty ` + -Name IsForest ` + -Value ( $false ) -PassThru | ` + Add-Member -MemberType NoteProperty ` + -Name LoginName ` + -Value ( $mockAccount.UserName ) -PassThru $searchADdom.Add($searchDom1) $returnval = @{ PeoplePickerSettings = @{ - ActiveDirectoryCustomFilter = "()" - ActiveDirectoryCustomQuery = "()" - ActiveDirectorySearchTimeout = @{ + ActiveDirectoryCustomFilter = "()" + ActiveDirectoryCustomQuery = "()" + ActiveDirectorySearchTimeout = @{ TotalSeconds = 10 } - OnlySearchWithinSiteCollection = $true - SearchActiveDirectoryDomains = $searchADdom + OnlySearchWithinSiteCollection = $true + PeopleEditorOnlyResolveWithinSiteCollection = $true + SearchActiveDirectoryDomains = $searchADdom } } $returnval = $returnval | Add-Member -MemberType ScriptMethod -Name Update -Value { @@ -329,13 +334,14 @@ try Mock -CommandName Get-SPWebApplication -MockWith { $returnval = @{ PeoplePickerSettings = @{ - ActiveDirectoryCustomFilter = $null - ActiveDirectoryCustomQuery = $null - ActiveDirectorySearchTimeout = @{ + ActiveDirectoryCustomFilter = $null + ActiveDirectoryCustomQuery = $null + ActiveDirectorySearchTimeout = @{ TotalSeconds = 30 } - OnlySearchWithinSiteCollection = $false - SearchActiveDirectoryDomains = @() + OnlySearchWithinSiteCollection = $false + PeopleEditorOnlyResolveWithinSiteCollection = $true + SearchActiveDirectoryDomains = @() } } $returnval = $returnval | Add-Member -MemberType ScriptMethod -Name Update -Value { From 07eea200a4eb5d9c9a9717e42dc052dca150754b Mon Sep 17 00:00:00 2001 From: Yorick Kuijs Date: Thu, 10 Feb 2022 13:30:58 +0100 Subject: [PATCH 2/5] Fixing #1375 --- CHANGELOG.md | 3 +++ RequiredModules.psd1 | 2 +- .../DSCResources/MSFT_SPLogLevel/MSFT_SPLogLevel.psm1 | 2 +- .../Modules/SharePointDsc.Util/SharePointDsc.Util.psm1 | 4 ++-- SharePointDsc/SharePointDsc.psd1 | 7 +------ .../Unit/SharePointDsc/SharePointDsc.SPLogLevel.Tests.ps1 | 4 ++-- .../SharePointDsc/SharePointDsc.SPWebAppPolicy.Tests.ps1 | 2 +- .../SharePointDsc/SharePointDsc.SPWebApplication.Tests.ps1 | 4 ++-- 8 files changed, 13 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92e29a596..261d1ec1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- SharePointDsc + - Updated ReverseDsc version requirement to 2.0.0.10 to fix an issue + with Exporting an array of CIM instances - SPFarm - Suppress a useless reboot that was triggered once a server joined the farm - Suppress a useless 5 minutes sleep triggered once a server joined the farm diff --git a/RequiredModules.psd1 b/RequiredModules.psd1 index 1ea9b203e..61b6d83b9 100644 --- a/RequiredModules.psd1 +++ b/RequiredModules.psd1 @@ -26,5 +26,5 @@ xWebAdministration = '3.1.0' # Required for Export of Config - ReverseDSC = "2.0.0.7" + ReverseDSC = "2.0.0.10" } diff --git a/SharePointDsc/DSCResources/MSFT_SPLogLevel/MSFT_SPLogLevel.psm1 b/SharePointDsc/DSCResources/MSFT_SPLogLevel/MSFT_SPLogLevel.psm1 index 8839ddedc..78528f039 100644 --- a/SharePointDsc/DSCResources/MSFT_SPLogLevel/MSFT_SPLogLevel.psm1 +++ b/SharePointDsc/DSCResources/MSFT_SPLogLevel/MSFT_SPLogLevel.psm1 @@ -405,7 +405,7 @@ function Export-TargetResource $currentBlock = Convert-DSCStringParamToVariable -DSCBlock $currentBlock -ParameterName "PsDscRunAsCredential" # Change hashtable format into CIM Instance format - $currentBlock = $currentBlock -replace "@{", "`r`n MSFT_SPLogLevelItem {" -replace '}', '},' -replace ',\);', "`r`n );" -replace '(\w+)=', '$1="' -replace '; ', '"; ' -replace '}', '"}' + $currentBlock = $currentBlock -replace "@{", "`r`n MSFT_SPLogLevelItem {" -replace '\);', "`r`n );" -replace '(\w+)=', '$1="' -replace '; ', '"; ' -replace '}', '"}' $PartialContent += $currentBlock $PartialContent += " }`r`n" diff --git a/SharePointDsc/Modules/SharePointDsc.Util/SharePointDsc.Util.psm1 b/SharePointDsc/Modules/SharePointDsc.Util/SharePointDsc.Util.psm1 index 4616e9901..a4d13b065 100644 --- a/SharePointDsc/Modules/SharePointDsc.Util/SharePointDsc.Util.psm1 +++ b/SharePointDsc/Modules/SharePointDsc.Util/SharePointDsc.Util.psm1 @@ -1582,8 +1582,8 @@ function Export-SPConfiguration $BinaryLocation ) - $reverseDSCVersion = [Version]"2.0.0.7" - $reverseDSCModule = Get-Module ReverseDsc -ListAvailable | Where-Object -FilterScript { $_.Version -eq $reverseDSCVersion } + $reverseDSCVersion = [Version]"2.0.0.10" + $reverseDSCModule = Get-Module ReverseDsc -ListAvailable | Where-Object -FilterScript { $_.Version -ge $reverseDSCVersion } if ($null -eq $reverseDSCModule) { Write-Host "[ERROR} ReverseDsc v$($reverseDSCVersion.ToString()) could not be found. Make sure you have this module installed before running this cmdlet!" -ForegroundColor Red diff --git a/SharePointDsc/SharePointDsc.psd1 b/SharePointDsc/SharePointDsc.psd1 index b23d28db9..cdf92a3ff 100644 --- a/SharePointDsc/SharePointDsc.psd1 +++ b/SharePointDsc/SharePointDsc.psd1 @@ -48,12 +48,7 @@ # ProcessorArchitecture = '' # Modules that must be imported into the global environment prior to importing this module - # RequiredModules = @( - # @{ - # ModuleName = "ReverseDSC" - # RequiredVersion = "2.0.0.7" - # } - # ) + # RequiredModules = @() # Assemblies that must be loaded prior to importing this module # RequiredAssemblies = @() diff --git a/tests/Unit/SharePointDsc/SharePointDsc.SPLogLevel.Tests.ps1 b/tests/Unit/SharePointDsc/SharePointDsc.SPLogLevel.Tests.ps1 index ac896144f..c5fe85f9a 100644 --- a/tests/Unit/SharePointDsc/SharePointDsc.SPLogLevel.Tests.ps1 +++ b/tests/Unit/SharePointDsc/SharePointDsc.SPLogLevel.Tests.ps1 @@ -49,7 +49,7 @@ try InModuleScope -ModuleName $script:DSCResourceFullName -ScriptBlock { Describe -Name $Global:SPDscHelper.DescribeHeader -Fixture { BeforeAll { - Invoke-Command -ScriptBlock $Global:SPDscHelper.InitializeScript -NoNewScope + Invoke-Command -Scriptblock $Global:SPDscHelper.InitializeScript -NoNewScope # Mocks for all contexts Mock -CommandName Set-SPLogLevel -MockWith { } @@ -966,7 +966,7 @@ try Name = "Export"; PsDscRunAsCredential = $Credsspfarm; SPLogLevelSetting = @( - MSFT_SPLogLevelItem {TraceLevel="Default"; Name="Administration"; EventLevel="Default"; Area="Access Services"}, + MSFT_SPLogLevelItem {TraceLevel="Default"; Name="Administration"; EventLevel="Default"; Area="Access Services"} MSFT_SPLogLevelItem {TraceLevel="Default"; Name="General"; EventLevel="Default"; Area="SharePoint Server"} ); } diff --git a/tests/Unit/SharePointDsc/SharePointDsc.SPWebAppPolicy.Tests.ps1 b/tests/Unit/SharePointDsc/SharePointDsc.SPWebAppPolicy.Tests.ps1 index 4694c6b99..1a3bafb30 100644 --- a/tests/Unit/SharePointDsc/SharePointDsc.SPWebAppPolicy.Tests.ps1 +++ b/tests/Unit/SharePointDsc/SharePointDsc.SPWebAppPolicy.Tests.ps1 @@ -1768,7 +1768,7 @@ try Username = 'contoso\\user1' PermissionLevel = 'Full Control' ActAsSystemAccount = \$True - }, + } MSFT_SPWebPolicyPermissions { Username = 'contoso\\Group 1' PermissionLevel = 'Full Read' diff --git a/tests/Unit/SharePointDsc/SharePointDsc.SPWebApplication.Tests.ps1 b/tests/Unit/SharePointDsc/SharePointDsc.SPWebApplication.Tests.ps1 index 71abe6c99..e6fc32b0e 100644 --- a/tests/Unit/SharePointDsc/SharePointDsc.SPWebApplication.Tests.ps1 +++ b/tests/Unit/SharePointDsc/SharePointDsc.SPWebApplication.Tests.ps1 @@ -50,7 +50,7 @@ try InModuleScope -ModuleName $script:DSCResourceFullName -ScriptBlock { Describe -Name $Global:SPDscHelper.DescribeHeader -Fixture { BeforeAll { - Invoke-Command -ScriptBlock $Global:SPDscHelper.InitializeScript -NoNewScope + Invoke-Command -Scriptblock $Global:SPDscHelper.InitializeScript -NoNewScope # Initialize tests try @@ -1949,7 +1949,7 @@ try MSFT_SPWebAppSiteDataServers { Zone = 'Default' Uri = 'http://spbackend' - }, + } MSFT_SPWebAppSiteDataServers { Zone = 'Intranet' Uri = 'http://spbackend2' From 5af1436e1d5daadabc4f57cf69dd53eb4cf48c8d Mon Sep 17 00:00:00 2001 From: Yorick Kuijs Date: Wed, 9 Feb 2022 17:14:15 +0100 Subject: [PATCH 3/5] Update pipeline and fix issue #1377 --- .gitattributes | 2 + .../ISSUE_TEMPLATE/Problem_with_resource.md | 62 ------ .../ISSUE_TEMPLATE/Problem_with_resource.yml | 97 +++++++++ .github/ISSUE_TEMPLATE/Resource_proposal.md | 21 -- .github/ISSUE_TEMPLATE/Resource_proposal.yml | 39 ++++ CHANGELOG.md | 3 + CODE_OF_CONDUCT.md | 10 +- Resolve-Dependency.ps1 | 11 +- SECURITY.md | 30 +++ .../MSFT_SPWebAppPeoplePickerSettings.psm1 | 36 +++- ...FT_SPWebAppPeoplePickerSettings.schema.mof | 1 + .../Contributing-to-SharePointDsc.md | 194 ++++++++++++++++++ .../Creating-Configuration-Files.md | 103 ++++++++++ ...eating-an-Azure-development-environment.md | 87 ++++++++ ...ed-the-configured-MaxEnvelopeSize-quota.md | 27 +++ .../WikiSource/Export-Diagnostic-Data.md | 47 +++++ .../Export-SharePoint-Configuration.md | 75 +++++++ SharePointDsc/WikiSource/Getting-Started.md | 21 ++ SharePointDsc/WikiSource/Home.md | 58 ++++++ .../WikiSource/Installing-the-module.md | 34 +++ .../Known-issues-with-remote-sessions.md | 5 + ...dules-for-SharePoint-DSC-configurations.md | 40 ++++ SharePointDsc/WikiSource/Prerequisites.md | 10 + ...essions-and-the-InstallAccount-variable.md | 49 +++++ ...ting-up-Central-Administration-on-HTTPS.md | 24 +++ .../WikiSource/Understanding-Resources.md | 159 ++++++++++++++ .../Using-CredSSP-on-a-Domain-Controller.md | 25 +++ ...n-configurations-that-use-SharePointDsc.md | 19 ++ SharePointDsc/WikiSource/_Footer.md | 1 + SharePointDsc/WikiSource/_Sidebar.md | 14 ++ SharePointDsc/WikiSource/media/ExportGUI.png | Bin 0 -> 75280 bytes SharePointDsc/WikiSource/media/footer.png | Bin 0 -> 47135 bytes azure-pipelines.yml | 12 +- build.ps1 | 63 +++--- build.yaml | 2 +- ...Dsc.SPWebAppPeoplePickerSettings.Tests.ps1 | 154 +++++++------- 36 files changed, 1330 insertions(+), 205 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/Problem_with_resource.md create mode 100644 .github/ISSUE_TEMPLATE/Problem_with_resource.yml delete mode 100644 .github/ISSUE_TEMPLATE/Resource_proposal.md create mode 100644 .github/ISSUE_TEMPLATE/Resource_proposal.yml create mode 100644 SECURITY.md create mode 100644 SharePointDsc/WikiSource/Contributing-to-SharePointDsc.md create mode 100644 SharePointDsc/WikiSource/Creating-Configuration-Files.md create mode 100644 SharePointDsc/WikiSource/Creating-an-Azure-development-environment.md create mode 100644 SharePointDsc/WikiSource/Error-Exceeded-the-configured-MaxEnvelopeSize-quota.md create mode 100644 SharePointDsc/WikiSource/Export-Diagnostic-Data.md create mode 100644 SharePointDsc/WikiSource/Export-SharePoint-Configuration.md create mode 100644 SharePointDsc/WikiSource/Getting-Started.md create mode 100644 SharePointDsc/WikiSource/Home.md create mode 100644 SharePointDsc/WikiSource/Installing-the-module.md create mode 100644 SharePointDsc/WikiSource/Known-issues-with-remote-sessions.md create mode 100644 SharePointDsc/WikiSource/Other-useful-modules-for-SharePoint-DSC-configurations.md create mode 100644 SharePointDsc/WikiSource/Prerequisites.md create mode 100644 SharePointDsc/WikiSource/Remote-sessions-and-the-InstallAccount-variable.md create mode 100644 SharePointDsc/WikiSource/Setting-up-Central-Administration-on-HTTPS.md create mode 100644 SharePointDsc/WikiSource/Understanding-Resources.md create mode 100644 SharePointDsc/WikiSource/Using-CredSSP-on-a-Domain-Controller.md create mode 100644 SharePointDsc/WikiSource/Using-the-Script-resource-in-configurations-that-use-SharePointDsc.md create mode 100644 SharePointDsc/WikiSource/_Footer.md create mode 100644 SharePointDsc/WikiSource/_Sidebar.md create mode 100644 SharePointDsc/WikiSource/media/ExportGUI.png create mode 100644 SharePointDsc/WikiSource/media/footer.png diff --git a/.gitattributes b/.gitattributes index 547657769..770aeb622 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6,4 +6,6 @@ *.jpg binary *.xl* binary *.pfx binary +*.png binary *.dll binary +*.so binary diff --git a/.github/ISSUE_TEMPLATE/Problem_with_resource.md b/.github/ISSUE_TEMPLATE/Problem_with_resource.md deleted file mode 100644 index 3da140be0..000000000 --- a/.github/ISSUE_TEMPLATE/Problem_with_resource.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -name: Problem with a resource -about: If you have a problem, bug, or enhancement with a resource in this resource module. ---- - -#### Details of the scenario you tried and the problem that is occurring - -#### Verbose logs showing the problem - -#### Suggested solution to the issue - -#### The DSC configuration that is used to reproduce the issue (as detailed as possible) -```powershell -# insert configuration here -``` - -#### The operating system the target node is running - - -#### Version and build of PowerShell the target node is running - - -#### Version of the DSC module that was used - - diff --git a/.github/ISSUE_TEMPLATE/Problem_with_resource.yml b/.github/ISSUE_TEMPLATE/Problem_with_resource.yml new file mode 100644 index 000000000..ab1928b9e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/Problem_with_resource.yml @@ -0,0 +1,97 @@ +name: Problem with a resource +description: If you have a problem, bug, or enhancement with a resource in this resource module. +labels: [] +assignees: [] +body: + - type: markdown + attributes: + value: | + Please prefix the issue title (above) with the resource name, e.g. 'ResourceName: Short description of my issue'! + + Your feedback and support is greatly appreciated, thanks for contributing! + - type: textarea + id: description + attributes: + label: Problem description + description: Details of the scenario you tried and the problem that is occurring. + validations: + required: true + - type: textarea + id: logs + attributes: + label: Verbose logs + description: | + Verbose logs showing the problem. **NOTE! Sensitive information should be obfuscated.** _Will be automatically formatted as plain text._ + placeholder: | + Paste verbose logs here + render: text + validations: + required: true + - type: textarea + id: configuration + attributes: + label: DSC configuration + description: | + The DSC configuration that is used to reproduce the issue (as detailed as possible). **NOTE! Sensitive information should be obfuscated.** _Will be automatically formatted as PowerShell code._ + placeholder: | + Paste DSC configuration here + render: powershell + validations: + required: true + - type: textarea + id: suggestedSolution + attributes: + label: Suggested solution + description: Do you have any suggestions how to solve the issue? + validations: + required: true + - type: textarea + id: targetSPVersion + attributes: + label: SharePoint version and build + description: | + Please provide version and build information of the SharePoint Server the target node is running. _Will be automatically formatted as plain text._ + placeholder: | + Add SharePoint Server information here + render: text + validations: + required: true + - type: textarea + id: targetNodeOS + attributes: + label: Operating system the target node is running + description: | + Please provide as much as possible about the target node, for example edition, version, build, and language. _Will be automatically formatted as plain text._ + + On OS with WMF 5.1 the following command can help get this information: `Get-ComputerInfo -Property @('OsName','OsOperatingSystemSKU','OSArchitecture','WindowsVersion','WindowsBuildLabEx','OsLanguage','OsMuiLanguages')` + placeholder: | + Add operating system information here + render: text + validations: + required: true + - type: textarea + id: targetNodePS + attributes: + label: PowerShell version and build the target node is running + description: | + Please provide the version and build of PowerShell the target node is running. _Will be automatically formatted as plain text._ + + To help with this information, please run this command: `$PSVersionTable` + placeholder: | + Add PowerShell information here + render: text + validations: + required: true + - type: textarea + id: moduleVersion + attributes: + label: SharePointDsc version + description: | + Please provide the version of the SharePointDsc module that was used. _Will be automatically formatted as plain text._ + + To help with this information, please run this command: `Get-Module -Name 'SharePointDsc' -ListAvailable | ft Name,Version,Path` + placeholder: | + Add module information here + render: text + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/Resource_proposal.md b/.github/ISSUE_TEMPLATE/Resource_proposal.md deleted file mode 100644 index 9f2a069a0..000000000 --- a/.github/ISSUE_TEMPLATE/Resource_proposal.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -name: New resource proposal -about: If you have a new resource proposal that you think should be added to this resource module. ---- - -### Description - -### Proposed properties - -### Special considerations or limitations diff --git a/.github/ISSUE_TEMPLATE/Resource_proposal.yml b/.github/ISSUE_TEMPLATE/Resource_proposal.yml new file mode 100644 index 000000000..2ddd09860 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/Resource_proposal.yml @@ -0,0 +1,39 @@ +name: New resource proposal +description: If you have a new resource proposal that you think should be added to this resource module. +title: "NewResourceName: New resource proposal" +labels: [] +assignees: [] +body: + - type: markdown + attributes: + value: | + Please replace `NewResourceName` in the issue title (above) with your proposed resource name. + + Thank you for contributing and making this resource module better! + - type: textarea + id: description + attributes: + label: Resource proposal + description: Provide information how this resource will/should work and how it will help users. + validations: + required: true + - type: textarea + id: proposedProperties + attributes: + label: Proposed properties + description: | + List all the proposed properties that the resource should have (key, required, write, and/or read). For each property provide a detailed description, the data type, if a default value should be used, and if the property is limited to a set of values. + value: | + Property | Type qualifier | Data type | Description | Default value | Allowed values + --- | --- | --- | --- | --- | --- + PropertyName | Key | String | Detailed description | None | None + validations: + required: true + - type: textarea + id: considerations + attributes: + label: Special considerations or limitations + description: | + Provide any considerations or limitations you can think of that a contributor should take in account when coding the proposed resource, and or what limitations a user will encounter or should consider when using the proposed resource. + validations: + required: true diff --git a/CHANGELOG.md b/CHANGELOG.md index e7d63cde8..92e29a596 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - SharePointDsc - Added generic unit tests files to quickly run all or a specific unit test + - Updated pipeline scripts to a recent version - SPTrustedIdentityTokenIssuer - Added parameters to support OIDC authentication in SharePoint Server Subscription Edition +- SPWebAppPeoplePickerSettings + - Added the PeopleEditorOnlyResolveWithinSiteCollection parameter to the resource ### Changed diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index f9ba8cf65..d7589ddbb 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,9 +1,3 @@ -# Microsoft Open Source Code of Conduct +# Code of Conduct -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). - -Resources: - -- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) -- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) -- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns +This project has adopted the [DSC Community Code of Conduct](https://dsccommunity.org/code_of_conduct). diff --git a/Resolve-Dependency.ps1 b/Resolve-Dependency.ps1 index 760df2398..a8c6b4d10 100644 --- a/Resolve-Dependency.ps1 +++ b/Resolve-Dependency.ps1 @@ -290,7 +290,14 @@ try if ($PSBoundParameters.ContainsKey('MinimumPSDependVersion')) { - $psDependModule = $psDependModule | Where-Object -Property -eq $MinimumPSDependVersion + try + { + $psDependModule = $psDependModule | Where-Object -FilterScript { $_.Version -ge $MinimumPSDependVersion } + } + catch + { + throw ('There was a problem finding the minimum version of PSDepend. Error: {0}' -f $_) + } } if (-not $psDependModule) @@ -328,6 +335,7 @@ try Name = 'PSDepend' Repository = $Gallery Path = $PSDependTarget + Force = $true } if ($MinimumPSDependVersion) @@ -371,6 +379,7 @@ try Name = 'PowerShell-Yaml' Repository = $Gallery Path = $PSDependTarget + Force = $true } Save-Module @SaveModuleParam diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..7bd7bc20f --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,30 @@ +## Security + +The DSC Community takes the security of our modules seriously, which includes all source code repositories managed through our GitHub organization. + +If you believe you have found a security vulnerability in any DSC Community owned repository, please report it to us as described below. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** + +Instead, please report them to one or several members of the DSC Community organization. +The easiest way to do so is to send us a direct message via twitter or slack. + +You should receive a response within 48 hours. If for some reason you do not, please follow up to other member of the community. + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + + * Type of issue + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +## Preferred Languages + +We prefer all communications to be in English. diff --git a/SharePointDsc/DSCResources/MSFT_SPWebAppPeoplePickerSettings/MSFT_SPWebAppPeoplePickerSettings.psm1 b/SharePointDsc/DSCResources/MSFT_SPWebAppPeoplePickerSettings/MSFT_SPWebAppPeoplePickerSettings.psm1 index 6bf43fbbc..96e776b69 100644 --- a/SharePointDsc/DSCResources/MSFT_SPWebAppPeoplePickerSettings/MSFT_SPWebAppPeoplePickerSettings.psm1 +++ b/SharePointDsc/DSCResources/MSFT_SPWebAppPeoplePickerSettings/MSFT_SPWebAppPeoplePickerSettings.psm1 @@ -24,6 +24,10 @@ function Get-TargetResource [System.Boolean] $OnlySearchWithinSiteCollection, + [Parameter()] + [System.Boolean] + $PeopleEditorOnlyResolveWithinSiteCollection, + [Parameter()] [Microsoft.Management.Infrastructure.CimInstance[]] $SearchActiveDirectoryDomains @@ -61,12 +65,13 @@ function Get-TargetResource } return @{ - WebAppUrl = $params.WebAppUrl - ActiveDirectoryCustomFilter = $wa.PeoplePickerSettings.ActiveDirectoryCustomFilter - ActiveDirectoryCustomQuery = $wa.PeoplePickerSettings.ActiveDirectoryCustomQuery - ActiveDirectorySearchTimeout = $wa.PeoplePickerSettings.ActiveDirectorySearchTimeout.TotalSeconds - OnlySearchWithinSiteCollection = $wa.PeoplePickerSettings.OnlySearchWithinSiteCollection - SearchActiveDirectoryDomains = $searchADDomains + WebAppUrl = $params.WebAppUrl + ActiveDirectoryCustomFilter = $wa.PeoplePickerSettings.ActiveDirectoryCustomFilter + ActiveDirectoryCustomQuery = $wa.PeoplePickerSettings.ActiveDirectoryCustomQuery + ActiveDirectorySearchTimeout = $wa.PeoplePickerSettings.ActiveDirectorySearchTimeout.TotalSeconds + OnlySearchWithinSiteCollection = $wa.PeoplePickerSettings.OnlySearchWithinSiteCollection + PeopleEditorOnlyResolveWithinSiteCollection = $wa.PeoplePickerSettings.PeopleEditorOnlyResolveWithinSiteCollection + SearchActiveDirectoryDomains = $searchADDomains } } return $result @@ -98,6 +103,10 @@ function Set-TargetResource [System.Boolean] $OnlySearchWithinSiteCollection, + [Parameter()] + [System.Boolean] + $PeopleEditorOnlyResolveWithinSiteCollection, + [Parameter()] [Microsoft.Management.Infrastructure.CimInstance[]] $SearchActiveDirectoryDomains @@ -155,6 +164,14 @@ function Set-TargetResource } } + if ($params.ContainsKey("PeopleEditorOnlyResolveWithinSiteCollection")) + { + if ($params.PeopleEditorOnlyResolveWithinSiteCollection -ne $wa.PeoplePickerSettings.PeopleEditorOnlyResolveWithinSiteCollection) + { + $wa.PeoplePickerSettings.PeopleEditorOnlyResolveWithinSiteCollection = $params.PeopleEditorOnlyResolveWithinSiteCollection + } + } + if ($params.ContainsKey("SearchActiveDirectoryDomains")) { foreach ($searchADDomain in $params.SearchActiveDirectoryDomains) @@ -250,6 +267,10 @@ function Test-TargetResource [System.Boolean] $OnlySearchWithinSiteCollection, + [Parameter()] + [System.Boolean] + $PeopleEditorOnlyResolveWithinSiteCollection, + [Parameter()] [Microsoft.Management.Infrastructure.CimInstance[]] $SearchActiveDirectoryDomains @@ -306,7 +327,8 @@ function Test-TargetResource -ValuesToCheck @("ActiveDirectoryCustomFilter", ` "ActiveDirectoryCustomQuery", ` "ActiveDirectorySearchTimeout", ` - "OnlySearchWithinSiteCollection") + "OnlySearchWithinSiteCollection", + "PeopleEditorOnlyResolveWithinSiteCollection") Write-Verbose -Message "Test-TargetResource returned $result" diff --git a/SharePointDsc/DSCResources/MSFT_SPWebAppPeoplePickerSettings/MSFT_SPWebAppPeoplePickerSettings.schema.mof b/SharePointDsc/DSCResources/MSFT_SPWebAppPeoplePickerSettings/MSFT_SPWebAppPeoplePickerSettings.schema.mof index d11075c76..fd2bdf8c7 100644 --- a/SharePointDsc/DSCResources/MSFT_SPWebAppPeoplePickerSettings/MSFT_SPWebAppPeoplePickerSettings.schema.mof +++ b/SharePointDsc/DSCResources/MSFT_SPWebAppPeoplePickerSettings/MSFT_SPWebAppPeoplePickerSettings.schema.mof @@ -13,5 +13,6 @@ class MSFT_SPWebAppPeoplePickerSettings : OMI_BaseResource [Write, Description("Sets the custom query that is sent to Active Directory")] String ActiveDirectoryCustomQuery; [Write, Description("Sets the time-out in seconds when a query is issued to Active Directory")] Uint16 ActiveDirectorySearchTimeout; [Write, Description("Specifies whether to search only the current site collection")] Boolean OnlySearchWithinSiteCollection; + [Write, Description("Specifies whether to check the user against the existing site collection users")] Boolean PeopleEditorOnlyResolveWithinSiteCollection; [Write, Description("List of all domains/forests that must be searched"), EmbeddedInstance("MSFT_SPWebAppPPSearchDomain")] String SearchActiveDirectoryDomains[]; }; diff --git a/SharePointDsc/WikiSource/Contributing-to-SharePointDsc.md b/SharePointDsc/WikiSource/Contributing-to-SharePointDsc.md new file mode 100644 index 000000000..2b6abf54c --- /dev/null +++ b/SharePointDsc/WikiSource/Contributing-to-SharePointDsc.md @@ -0,0 +1,194 @@ +If you are keen to make SharePointDsc better, why not consider contributing your work to the project? Every little change helps us make a better resource for everyone to use, and we would love to have contributions from the community. + +# Core contribution guidelines + +We follow all of the standard contribution guidelines for DSC resources [outlined in the DscResources repo](https://github.com/PowerShell/DscResources/blob/master/CONTRIBUTING.md), so please review these as a baseline for contributing. Specifically, be sure to read the following linked article from that page: + +* [Style Guidelines and Best Practices](https://github.com/PowerShell/DscResources/blob/master/StyleGuidelines.md) + +## SharePointDsc specific coding principles + +The Get-TargetResource function should not return $null as a result. It may, however, return a hashtable where some properties have a $null value. For example: +```PowerShell +function Get-TargetResource +{ + $nullreturn = @{ + ServiceAppName = $ServiceAppName + Name = $Name + RequestLimit = $null + WaitTime = $null + Ensure = "Absent" + } + return $nullreturn +} +``` + +In some cases, SharePoint does not publically publish information via the object model. If this is the case, reflection can be used to call the internal method. Since this comes with significant risks, however, we only allow reflection to be used to retrieve data and **not** to set data. + +## Design Guidelines + +To help ensure that SharePointDsc resources are created in a consistent manner, there are a number of design guidelines that guide the thinking applied to how the resources should be built. These design rules should be taken into account when submitting changes or new functionality to the SharePointDsc module. + +1. Each resource in SharePointDsc should strive to make changes to only the current server, and not require a remote connection to other servers to complete their work. +2. Supported versions of SharePoint for SharePointDsc are SharePoint Server 2013 with Service Pack 1 or higher, SharePoint Server 2016 and SharePoint Server 2019. SharePoint 2010 is not supported due to requiring PowerShell 4, which is not supported with that version of the product. Where a resource will not work with all versions we support (such as functionality or features being added or deprecated between versions), a clear and concise error should be returned that explains this. + +3. Any breaking change should be committed to a new branch so that it can be included in the next major version release. A change will be considered a 'breaking' change under the following circumstances: + +* A new mandatory property is added to a resource +* The data type of any resource property is changed +* Any property is removed or renamed in a resource +* A resource is removed +* A change in the expected outcome of how a resource behaves is made +* Any change that modifies the list of prerequisites for the module to run + +4. Resources that will make changes within site collections should not be part of SharePointDsc. The reason is that these types of changes can conflict with actions performed by the site collection owners/administrators. For example: In SPSite we use the title field during site creation, but do not update the title later on. This is because a site collection administrator can have a reason for changing the title and in such a case, SharePointDsc would reset the title, confusing the site collection administrator. + + * Only in specific cases can we deviate from this principle. + * One exception is the SPWeb resource. That was fully coded already and submitted as a Pull Request. Since we didn't want to throw away that code, we decided to include it into the module. + +# SharePointDsc specific guidelines + +## Dynamic documentation + +With over 100 resources in our module, we want to keep the documentation work light. To aid this, we are generating our documentation dynamically. Therefore, for each DSC resource we have, the following items must be completed so we can generate these: + +1. In the folder for the resource, place a readme.md file that contains heading 'Description' and a text description of the module. +2. In the schema.mof file for the resource, ensure that there are description attributes on all properties. +3. Generate 1 or more example configurations for the resource in the Examples/resources/[resource name] folder using PowerShell help syntax to describe the example at the top of the file. Each example configuration must be complete and runnable, must be called "example" and it must only take parameters of PSCredential types. This will allow our unit tests to validate the examples as part of our build process. + +With these items in place, we can dynamically generate the help files for PowerShell as well as this wiki. + +## Testing against SharePoint Server 2013, 2016, 2019 and Subscription Edition + +SharePointDsc is designed to work correctly against the Server 2013, 2016, 2019 and Subscription Edition versions of the product. The automated unit tests that are run in SharePointDsc will execute against all versions of the product using the stub modules we include in the unit tests directory. + +Where a resource applies to only a specific version (such as [SPUserProfileSyncService](https://github.com/dsccommunity/SharePointDsc/blob/master/SharePointDsc/DSCResources/MSFT_SPUserProfileSyncService/MSFT_SPUserProfileSyncService.psm1)) the code should throw meaningful errors to indicate that it should not be used with the installed version of the product. + +## Test your changes on a SharePoint test environment + +This might sound a little stupid, but in the past we noticed that code changes were submitted that could never work on a SharePoint environment. So always make sure you test your updates against a real life SharePoint environment! You can use [this](https://github.com/dsccommunity/SharePointDsc/wiki/Creating-an-Azure-development-environment) article to create your own test environment in Azure. + +# Tools + +For SharePointDsc there are several tools available to help developing or are being used in the GitHub repository. + +## GitHub Desktop + +In order to work with a local copy of the repository, you need the [GitHub Desktop](https://desktop.github.com/). The GitHub Desktop include the [Git tools](https://git-scm.com/downloads), but adds a nice GUI on top of it. Using this GUI you can see what commits have been made and what changes where made in those commits. Checkout the training section below if you want to learn more about Git. + +## Visual Studio Code + +To develop SharePointDsc, we recommend the use of [Visual Studio Code](https://code.visualstudio.com/) with the [PowerShell extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode.PowerShell) to enable PowerShell support. The SharePointDsc project already contains some definitions that configure Visual Studio Code to use the correct formatting. + +## PSScriptAnalyzer +To check code for compliance to PowerShell best practices, we are using [PSScriptAnalyzer](https://github.com/PowerShell/PSScriptAnalyzer). You can install this module locally as well and have your code checked. Visual Studio Code is also using this module to display possible issues in your PowerShell code. + +## Azure DevOps + +We are using [Azure DevOps](https://dev.azure.com/dsccommunity/SharePointDsc/) as the Continuous Integration solution for our project. When a Pull Request is submitted, Azure DevOps will run all the required tests against all supported SharePoint versions. If you want to see what happened, for example if the test fails, you can review the Azure DevOps log by clicking on the "Details" link behind the Azure DevOps test. + +Since the log is very big, a quick way to see which tests failed is to click "View raw log" link and searching for "[-]", which is present in all failed tests. + +## Pester + +All DSC Resource Kit modules are using [Pester](https://github.com/pester/Pester) to perform Unit tests on the code. Pester is also able to calculate the code coverage off all tests. Check out the training section below if you want to learn more about Pester. + +> _**IMPORTANT**: Make sure you run the below commands:_ +> * _Using Windows PowerShell v5.1. Running unit tests might work on PowerShell v7, but this hasn't been tested yet (because SharePoint itself requires Windows PowerShell v5.1). Testing running unit tests with PowerShell v7 is on the roadmap._ +> * _In an elevated PowerShell session. The code will throw a lot of errors when you don't!_ + +You can run all tests by performing these steps: +* Open PowerShell +* Browse to the local clone folder (e.g. c:\src\SharePointDsc) +* Build the module by running `.\build.ps1 -Tasks Build` +* Start all tests by running `.\build.ps1 -Tasks Test` + +This executes all tests for SharePoint 2013 on the code. This can take several hours to complete, depending on the specifications of your machine. If you want to run the tests for a different SharePoint version, use: + +**SharePoint 2016** +```PowerShell +.\build.ps1 -Tasks test -PesterScript @(@{ Path = '/Tests/Unit'; Parameters = @{SharePointCmdletModule = '/Tests/Unit/Stubs/SharePoint/16.0.4456.1000/Microsoft.SharePoint.PowerShell.psm1' }}) +``` +**SharePoint 2019** +```PowerShell + .\build.ps1 -Tasks test -PesterScript @(@{ Path = '/Tests/Unit'; Parameters = @{SharePointCmdletModule = '/Tests/Unit/Stubs/SharePoint/16.0.10337.12109/Microsoft.SharePoint.PowerShell.psm1' }}) +``` +**SharePoint Subscription Edition** +```PowerShell + .\build.ps1 -Tasks test -PesterScript @(@{ Path = '/Tests/Unit'; Parameters = @{SharePointCmdletModule = '/Tests/Unit/Stubs/SharePoint/16.0.14326.20450/SharePointServer.psm1' }}) +``` + +We are also checking for compliance to the [coding style guide and other generic tests](https://github.com/PowerShell/DscResource.Tests#dsc-resource-common-meta-tests). You can run these tests locally by executing the following steps: +* Open PowerShell +* Browse to the local clone folder +* Build the module by running (required if you restarted PowerShell or updated a resource) `.\build.ps1 -Tasks Build` +* Start all High Quality Resource Module (HQRM) tests by running `.\build.ps1 -Tasks hqrmtests` +This executes all HQRM tests on the code. + +## Test single resource +To run an individual Pester test, run the following script (update the first two lines with the correct values): +```PowerShell +$modulePath = '' # e.g. C:\src\SharePointDsc +$resource = '' # e.g. SPSite + +cd $modulePath +.\build.ps1 -Tasks Build + +$path15 = Join-Path -Path $modulePath -ChildPath '\Tests\Unit\Stubs\SharePoint\15.0.4805.1000\Microsoft.SharePoint.PowerShell.psm1' +$path16 = Join-Path -Path $modulePath -ChildPath '\Tests\Unit\Stubs\SharePoint\16.0.4456.1000\Microsoft.SharePoint.PowerShell.psm1' +$path19 = Join-Path -Path $modulePath -ChildPath '\Tests\Unit\Stubs\SharePoint\16.0.10337.12109\Microsoft.SharePoint.PowerShell.psm1' +$pathSE = Join-Path -Path $modulePath -ChildPath '\Tests\Unit\Stubs\SharePoint\16.0.14326.20450\SharePointServer.psm1' + +$testPath = Join-Path -Path $modulePath -ChildPath ".\Tests\Unit\SharePointDsc\SharePointDsc.$resource.Tests.ps1" +$compiledModulePath = Split-Path -Path (Get-Module SharePointDsc).Path +$resourcePath = Join-Path -Path $compiledModulePath -ChildPath "\DSCResources\MSFT_$resource\MSFT_$resource.psm1" +Invoke-Pester -Script @( + @{ Path = $testPath; Parameters = @{SharePointCmdletModule = $path15 } }, + @{ Path = $testPath; Parameters = @{SharePointCmdletModule = $path16 } }, + @{ Path = $testPath; Parameters = @{SharePointCmdletModule = $path19 } }, + @{ Path = $testPath; Parameters = @{SharePointCmdletModule = $pathSE } } +) -CodeCoverage $resourcePath +``` +This will run the unit tests for all four SharePoint versions **and** will calculate code coverage of the unit tests across these versions. + +**NOTE:** Make sure you have version 4.10.1 of Pester. Update the module from the PowerShell Gallery by running the command `Install-Module Pester -RequiredVersion 4.10.1 -Force` + +**NOTE 2:** If you have Windows 10, please read [this page](https://github.com/pester/Pester/wiki/Installation-and-Update) to update successfully to the most recent version: + +**NOTE 3:** When you are troubleshooting Pester tests and you make a code change in the resource, you have to build the module again. Updates to the Pester test itself do not require this. + +## Reviewable + +When a Pull Request is submitted, a code review will have to take place to ensure it meets all defined standards. The code review will be done via [Reviewable](https://reviewable.io), a platform that easily enables reviewers to check code changes, add comments and approve changes. Only when all review comments are resolved will we be able to merge the Pull Request. + +# Troubleshooting + +The Microsoft Docs site has a good [article on troubleshooting DSC](https://docs.microsoft.com/en-us/powershell/dsc/troubleshooting) which has a list of tips and tricks on how to collect information while troubleshooting DSC. + +When troubleshooting an issue, you can use the [built-in debugging possibilities](https://docs.microsoft.com/en-us/powershell/dsc/debugresource) in PowerShell DSC. Running the command `Enable-DscDebug -BreakAll` on the target machine enables debugging. By running `Start-DscConfiguration` and specifying the configuration to deploy, a new deployment starts, stopping with the following information: + ```PowerShell +Enter-PSSession -ComputerName TEST-SRV -Credential +Enter-PSHostProcess -Id 9000 -AppDomainName DscPsPluginWkr_AppDomain +Debug-Runspace -Id 9 + ``` +By running these commands, you connect to the remote machine, entering a debug session. + +Another debug option is to open the Pester file and the resource psm1 file. By placing breakpoints in those files and running the Pester file, PowerShell stops at the set breakpoint. This enables you to step through the code, troubleshooting either the resource or the Pester test. + +# Training + +The following resources can be used to get familiar with several technologies used within SharePointDsc: + +* PowerShell Desired State Configuration and SharePointDsc + * [Microsoft Learn: "Getting Started with PowerShell Desired State Configuration"](https://docs.microsoft.com/en-us/shows/getting-started-with-powershell-dsc/) + * [Microsoft Learn: "Advanced PowerShell Desired State Configuration"](https://docs.microsoft.com/en-us/shows/advanced-powershell-dsc-and-custom-resources/) + * [Microsoft Learn: "SharePoint Automation with DSC"](https://docs.microsoft.com/en-us/shows/sharepoint-automation-with-dsc/) +* Git + * [Git manual](https://git-scm.com/book/en/v2) + * [PluralSight: "How Git Works"](https://app.pluralsight.com/library/courses/how-git-works/table-of-contents) This is a very good training to get familiar with the Git concept. + * [PluralSight: "Mastering Git"](https://app.pluralsight.com/library/courses/mastering-git/table-of-contents) This is a very good training to get familiar with the Git concept. +* Pester + * [Microsoft Learn: "Testing PowerShell with Pester"](https://docs.microsoft.com/en-us/shows/testing-powershell-with-pester/) + * [PluralSight: "Testing PowerShell with Pester"](https://www.pluralsight.com/courses/powershell-testing-pester) + +**NOTE:** A subscription is required for the PluralSight trainings diff --git a/SharePointDsc/WikiSource/Creating-Configuration-Files.md b/SharePointDsc/WikiSource/Creating-Configuration-Files.md new file mode 100644 index 000000000..55eed79e1 --- /dev/null +++ b/SharePointDsc/WikiSource/Creating-Configuration-Files.md @@ -0,0 +1,103 @@ +PowerShell DSC allows for a single configuration file to be applied to a server to describe +what is should 'look like' - what services will run, what products are installed, and how +they are configured. +In the context of deploying a SharePoint farm this gives us a number of options for how to +go about deploying the farm with a number of different configurations based on roles, with +a number of components that are common across all deployments. + +## Things every configuration is likely to have + +When describing a configuration for a SharePoint Server, there are a number of common +components that are likely to exist in every configuration. +Namely the components related to the installation of the product - +[SPInstallPreReqs](SPInstallPreReqs) and [SPInstall](SPInstall). + +It is also important to understand how the SharePointDsc resources impersonate and communicate +with the SharePoint PowerShell cmdlet's. +For PowerShell 5 (which we recommend) you should use the PsDscRunAsCredential property to specify + the account a resource should run as. +However for PowerShell 4 this is not an option, and the InstallAccount option is to be used in +that situation, which relies on creating a local PowerShell session that uses CredSSP authentication. +This means you are likely to want to use the xCredSSP resources also (see [Remote sessions and +the InstallAccount variable](Remote-sessions-and-the-InstallAccount-variable)) for more information +on this). +There are also a limited number of scenario's in SharePointDsc that will always use this CredSSP +approach (such as provisioning the user profile sync service) so it is recommended that even if +you use PowerShell 5 and PsDscRunAsCredential, you should still configure the CredSSP settings. + +## Creating a single server deployment + +The single server deployment is the most straightforward - you will have one configuration file +that will describe all of the components that you want to have on that server. +This is not likely to be a production deployment, but more a development or testing server. +The specifics of what you put in to this configuration are largely up to what you want this server +to be running, but you will always include [SPFarm](SPFarm) to create the farm, and +[SPDistributedCacheService](SPDistributedCacheService) to enable the distributed cache service +in the farm. +The rest can be as little or as detailed as you need it to be in order to achieve your desired +configuration. + +## Expanding the model out to multiple servers + +When we begin to explore scenarios that include more than one server, the implementation of our +configuration changes significantly. +There can no longer be a single configuration that applies to all servers, you need to start +looking at what "roles" a server will fulfill within your farm. +Common roles would include "application server", or "front end server", perhaps in a large +deployment you might have a "distributed cache server" or a "search server". +The individual roles you have within your architecture will dictate the number of unique +configurations that you need to create. + +For example, consider a farm that has the following architecture: + +- 2x Web Front End Servers +- 2x Application Servers + +This is a typical "small" SharePoint deployment, as it separates out the services to the two layers to +handle the different workloads, and still provides redundancy through having at least 2 servers in +each "role". +In this case, I would need to have two configurations, one for the front ends and one for the +application servers. +Each configuration would describe what a server in that role would look like, since I would expect +all of my front end servers to have the same services and configuration applied, and again for the +application servers. +Then if I decide I need to scale out to accommodate more load and add a new front end server, I would +just apply the same configuration to it based on its role. + +## Understanding the need for a "farm server" configuration + +Continuing with the above example of a small server farm, we have two configurations for each role. +There is a need for a third configuration though, and this is referred to as a "farm" configuration. +This configuration is planned to be applied to one server only (and typically this will be a back end +application server, so its configuration will be very similar to the other application server). +There are some differences though, the farm configuration will: + +- Be responsible for creating the farm +- Also be responsible for provisioning and configuring logical components in the farm + +It is important to understand the difference between a logical component and a physical component in +our configurations. +For example, a SharePoint web application is a logical component in a SharePoint farm - you create it +on one server, configure it from one server, but all the other servers in the farm know about it. +The physical component for a web application is the IIS website, which exists on specific servers and +can be configured per server (such as making changes to bindings). +So I would use my "farm server" configuration to provision logical components like web applications and +service applications, and my individual role configurations to validate the components that apply to a +server specifically as opposed to something that exists logically within the farm. + +The other factor here is around how the DSC is going to be run from every server - if I have a SharePoint +web application that exists in a large server from (let's assume 10 servers), I don't need all 10 servers +checking for it every 30 minutes. +Even if it was just a handful of front end servers, it is still unnecessary for them all to be managing +this when it does not map directly to a physical thing that has to happen on each server. +This means that the farm server configuration will likely be much larger than any other role +configuration, but it also provides more flexibility in the implementation as all logical components are +in one spot on one server. + +## Examples + +In the module is an examples directory which demonstrates both a single server deployment, as well as the +three configurations needed for the above mentioned multi-server example (so one "farm" configuration, +then an app server and a front end server). +These examples demonstrate the concepts discussed here and can be used as as starting point for your own +configurations. diff --git a/SharePointDsc/WikiSource/Creating-an-Azure-development-environment.md b/SharePointDsc/WikiSource/Creating-an-Azure-development-environment.md new file mode 100644 index 000000000..cefb17183 --- /dev/null +++ b/SharePointDsc/WikiSource/Creating-an-Azure-development-environment.md @@ -0,0 +1,87 @@ +To help speed up development with SharePointDsc, a set of scripts has been created that will deploy an environment that is ready to use for development purposes in to your own Azure subscription. This page outlines the requirements for using this script. + +## Step One - Get an Azure subscription + +If you do not currently have an Azure subscription, you can sign up for a free trial at [https://azure.microsoft.com/free](https://azure.microsoft.com/free) + +## Step Two - Install the Azure PowerShell cmdlets + +You can install the required Azure management PowerShell cmdlets by running the following script + + Install-Module Azure + Install-Module AzureRm + +## Step Three - Install required DSC modules + +The script requires several PowerShell DSC modules to be installed on your local machine, which are published to the Azure Blob Storage together with the DSC scripts. + +Module Name | Version +------------ | ------------- +xActiveDirectory | 2.16.0.0 +xCredSSP | 1.0.1 +xDnsServer |1.7.0.0 +xComputerManagement | 1.9.0.0 +xNetworking | 3.2.0.0 +SQLServerDsc | 10.0.0.0 +xWebAdministration | +SharePointDsc | + +To install the modules: + +```PowerShell +Install-Module -Name xActiveDirectory -RequiredVersion 2.16.0.0 -SkipPublisherCheck -Force +Install-Module -Name xCredSSP -RequiredVersion 1.0.1 -SkipPublisherCheck -Force +Install-Module -Name xDnsServer -RequiredVersion 1.7.0.0 -SkipPublisherCheck -Force +Install-Module -Name xComputerManagement -RequiredVersion 1.9.0.0 -SkipPublisherCheck -Force +Install-Module -Name xNetworking -RequiredVersion 3.2.0.0 -SkipPublisherCheck -Force +Install-Module -Name SQLServerDsc -RequiredVersion 10.0.0.0 -SkipPublisherCheck -Force +Install-Module -Name xWebAdministration -SkipPublisherCheck -Force +Install-Module -Name SharePointDsc -SkipPublisherCheck -Force +``` +## Step Four- Create a storage account that contains the binaries for SharePoint + +You will need a storage account that will contain the installer for SharePoint so you can have the dev environments download them when needed. See "[Creating a storage account](https://docs.microsoft.com/en-us/azure/storage/storage-create-storage-account#create-a-storage-account)" for instructions on how to create a new storage account. + +Once you have created the account you will need to create a container in it, and then copy the files for SharePoint in to this. This can be done through the portal (under the "blobs" or "containers" section), or via the [New-AzureStorageContainer](https://docs.microsoft.com/en-us/powershell/module/azure.storage/New-AzureStorageContainer?view=azurermps-4.2.0) PowerShell cmdlet. + +There are a number of ways of copying files in to Azure storage - see "[moving data to and from Azure storage](https://docs.microsoft.com/en-us/azure/storage/storage-moving-data)" for specific methods. You will need to take the entire contents of the SharePoint 2013, 2016 or 2019 ISO and copy them in to the container you created above. You can also slipstream updates in to the "Updates" folder at this point to install SharePoint to a specific CU level. + +## Step Five - Create a new dev environment + +To create your development environment, run the following PowerShell commands (see the list below of changes to make to this before running) + + Import-Module C:\repos\SharePointDsc\Tests\Integration\Azure\AzureEnvironmentBuilder.psm1 + Login-AzureRmAccount + New-SPDscAzureLab -ResourceGroupName "SPDSCTestLab" ` + -Location southeastasia ` + -StorageAccountName "spdsctestlab1" ` + -SoftwareStorageAccountName "spdscsoftware1" ` + -SoftwareStorageAccountContainer "sharepoint2016" ` + -SharePointProductKey "AAAAA-AAAAA-AAAAA-AAAAA-AAAAA" ` + -PublicDNSLabel "spdsctestlab1" ` + -AdminCredential (Get-Credential -Message "Enter admin credential") + +In this script you will need to set the following values + +1. The Import-Module cmdlet needs to point to where ever you have a copy of the SharePointDsc source code to import the module from +2. Change the resource group name parameter, this can be anything to help you identify the development environment in your Azure subscription +3. Set the location to the Azure location you wish to deploy to +4. The SoftwareStorageAccountName parameter should be the name of the storage account you created earlier to upload SharePoint in to +5. The SoftwareStorageAccountContainer parameter should be the name of your container that was created earlier +6. The SharePointProductKey parameter should be your valid SharePoint product key +7. The PublicDNSLabel property is used to establish a DNS name for your server once it is created. This will be viewable in the Azure portal when the provisioning is complete + +After these changes have been made you can run the script and you will be prompted first to sign in to Azure, and after that you will be prompted for the admin credentials for your environment (username and password - do not prefix a domain name on to the username). + +# What is in the development environment + +You will see a Domain controller server, a SQL server and a SharePoint server. The AD and SQL servers are both fully configured and ready to use. The SharePoint server will have the following software installed: + +* SharePoint (version will be based on what you uploaded to blob storage) +* Git for Windows +* Visual Studio Code +* Nodejs +* Git Credential Helper for Windows +* PoshGit + +This should be seen as a minimum to begin development with SharePointDsc - you can however install any other software on the servers you need as you have full control of them after they are provisioned from the template. diff --git a/SharePointDsc/WikiSource/Error-Exceeded-the-configured-MaxEnvelopeSize-quota.md b/SharePointDsc/WikiSource/Error-Exceeded-the-configured-MaxEnvelopeSize-quota.md new file mode 100644 index 000000000..38026be47 --- /dev/null +++ b/SharePointDsc/WikiSource/Error-Exceeded-the-configured-MaxEnvelopeSize-quota.md @@ -0,0 +1,27 @@ +When deploying DSC configurations, you may run into the following issue when executing Start-DscConfiguration: + + VERBOSE: Perform operation 'Invoke CimMethod' with following parameters, ''methodName' = SendConfigurationApply,'className' = MSFT_DSCLocalConfigurationManager,'namespaceName' = root/Microsoft/Windows/DesiredStateConfiguration'. + The WinRM client sent a request to the remote WS-Management service and was notified that the request size exceeded the configured MaxEnvelopeSize quota. + + CategoryInfo : LimitsExceeded: [root/Microsoft/...gurationManager:String] [], CimException + + FullyQualifiedErrorId : HRESULT 0x80338111 + + PSComputerName : [servername] + VERBOSE: Operation 'Invoke CimMethod' complete. + VERBOSE: Time taken for configuration job to complete is 0.648 seconds + +## Solution +The solution for this issue is to increase the maximum envelope size, by running the following command in an elevated PowerShell session: + + Set-Item -Path WSMan:\localhost\MaxEnvelopeSizeKb -Value 2048 + +**Note:** The default value is MaxEnvelopeSizeKB is 500 + +**Note 2:** When your computer is configured to use the Public network profile, the Set-Item cmdlet might throw the following error: + + Set-Item : WinRM firewall exception will not work since one of the network connection types on this machine is set to Public. Change the network connection type to either Domain or Private and try again. + +Change the network profile to Domain or Private in order to change the setting. + +## More information +More information about the MaxEnvelopeSize can be found at: +* https://msdn.microsoft.com/en-us/library/cc251449.aspx +* https://msdn.microsoft.com/en-us/library/aa384372%28VS.85%29.aspx \ No newline at end of file diff --git a/SharePointDsc/WikiSource/Export-Diagnostic-Data.md b/SharePointDsc/WikiSource/Export-Diagnostic-Data.md new file mode 100644 index 000000000..229b99e73 --- /dev/null +++ b/SharePointDsc/WikiSource/Export-Diagnostic-Data.md @@ -0,0 +1,47 @@ +If you want to troubleshoot an issue, having some logging or troubleshooting +information available is very useful. Especially when you ask someone else for +assistance. That is why SharePointDsc has a cmdlet available that is able to +export several pieces of information: + +- DSC Verbose logs +- SPDSC Event log +- PowerShell version +- Operating System version +- LCM configuration + +## Parameters + +| Parameter | Attribute | DataType | Description | Allowed Values | +| --- | --- | --- | --- | --- | +| **ExportFilePath** | Mandatory | String | Path where to export the diagnostic data to | | +| **NumberOfDays** | Optional | UInt | The number of days to export the data of (Default = 7) | | +| **Anonymize** | Optional | Switch | Specify to anonymize the exported data | | +| **Server** | Mandatory | String | Specifies the server name to replace during anonimization | | +| **Domain** | Mandatory | Switch | Specifies the domain name to replace during anonimization | | +| **Url** | Mandatory | Switch | Specifies the url to replace during anonimization | | + +## Examples + +### Example 1 + +Export diagnostic info to C:\Output + +```PowerShell +Export-SPDscDiagnosticData -ExportFilePath 'C:\Output' +``` + +### Example 2 + +Export diagnostic info of the last 14 days to C:\Output + +```PowerShell +Export-SPDscDiagnosticData -ExportFilePath 'C:\Output' -NumberOfDays 14 +``` + +### Example 3 + +Export anonymized diagnostic info to C:\Output + +```PowerShell +Export-SPDscDiagnosticData -ExportFilePath 'C:\Output' -Anonymize -Server 'server1' -Domain 'contoso.com' -Url 'https://sharepoint.contoso.com' +``` diff --git a/SharePointDsc/WikiSource/Export-SharePoint-Configuration.md b/SharePointDsc/WikiSource/Export-SharePoint-Configuration.md new file mode 100644 index 000000000..66c5be394 --- /dev/null +++ b/SharePointDsc/WikiSource/Export-SharePoint-Configuration.md @@ -0,0 +1,75 @@ +SharePoint Farms have multiple components on every server which contain configuration. +At a very high level this could be: + +- Web Applications +- Databases +- Servers +- Services +- Service Applications + +PowerShell Desired State Configuration has the ability to make sure these components are compliant +with a desired state. Unfortunately it is not possible to create a desired state configuration +based off an existing server/farm. + +That is why Nik Charlebois created [ReverseDsc](https://www.powershellgallery.com/packages/ReverseDSC). +This module offers generic functionalities to generate DSC configurations and requires a technology +specific orchestrator script to export the data. + +> For a [Full list](Understanding-Resources) of what can be extracted have a look at our Included Resources section. + +Since SharePointDsc v4.5, this orchestrator script (and therefore ReverseDsc support) has been +natively integrated into SharePointDsc. + +>**NOTE:** Running an export does require the module "ReverseDsc" to be installed. Do this by running the following cmdlet: +> +> ```PowerShell +> Install-Module ReverseDsc +> ``` + +To run an export you have to use the `Export-SPConfiguration` cmdlet. When running an export, you +need to specify which resources you want to export. If you don't specify any parameters, the cmdlet +shows a GUI in which you can select the resources you want to export and specify the credentials. + +![Export GUI](media/ExportGUI.png) + +For more information and examples, check the info below. + +## Parameters + +| Parameter | Attribute | DataType | Description | Allowed Values | +| --- | --- | --- | --- | --- | +| **ComponentsToExtract** | Optional | String[] | Names of the resources to export | | +| **Credentials** | Optional | PSCredential | The credentials to connect to SharePoint with | | +| **Mode** | Optional | String | Predefined sets of exported resources | Lite, Default, Full | +| **OutputPath** | Optional | String | Specifies the file name to which to export the exported configuration | | +| **SkipSitesAndWebs** | Optional | Switch | Include Sites and Webs in the output (Default = True) | | +| **Standalone** | Optional | Switch | Create export as if the farm is using a single server | | +| **Quiet** | Optional | Switch | (Deprecated) Run the export without showing the GUI | | + +## Examples + +### Example 1 + +Run an export by using the GUI + +```PowerShell +Export-SPConfiguration +``` + +### Example 2 + +Run an unattended export by specifying the resources + +```PowerShell +$credential = Get-Credential domain\farmadministrator +Export-SPConfiguration -ComponentsToExport "SPInstall", "SPFarm", "SPManagedAccount" -Credentials $credential -OutputPath 'C:\DscExport' +``` + +### Example 3 + +Run a full export by specifying the export mode + +```PowerShell +$credential = Get-Credential domain\farmadministrator +Export-SPConfiguration -Mode 'Full' -Credentials $credential -OutputPath 'C:\DscExport' +``` diff --git a/SharePointDsc/WikiSource/Getting-Started.md b/SharePointDsc/WikiSource/Getting-Started.md new file mode 100644 index 000000000..53e786147 --- /dev/null +++ b/SharePointDsc/WikiSource/Getting-Started.md @@ -0,0 +1,21 @@ +# Introduction + +SharePointDSC is an add-on to PowerShell Desired State Configuration (DSC). +The high level concept is that you can take a specific piece of configuration and deploy how this should act as code. + +You can then take the generated configuration file (.MOF) and Target this configuration to an environment / single server(node). + +This is useful in various scenarios, but can become complex depending how broad the scope is of the configuration and sub components and when aligning this with best practices for SharePoint or specific SharePoint Operating procedures i.e. Extending a Web Application instead of renaming. + +## Scenarios + +|Scenario|Description|Complexity| Estimated Effort| +| ----------- | ----------- |----------- |----------- | +|Deploying a new SharePoint Version| Creating an environment from scratch or using an example template for 2016 / 2019 / Subscription Edition for automation and guaranteed repeatability.|Medium|8-16 Hrs| +|Extracting an old farms Configuration|Taking a backup / extract of the entire configuration or piece/s of configuration.Has many additional use cases once extracted.|Low|2 Hrs| +|Comparison of configuration|Comparing the configuration between a last update , change or between environment i.e. Dev / Prod|High| 6 Hrs +|Restoring configuration from Prod-->Dev|This depends on the scope of configuration(More Scope = More Lines of PowerShell) and the intended action i.e. Change / Update / Add / Remove and aligning to Best Practices|Extremely High| Unknown| + +It's entirely possible that DSC is the right fit for you , and that there is a learning / discipline requirement. Or a Gap in your knowledge/ experience this Getting Started section is designed to help you. + +More information on PowerShell Desired State Configuration in general, can be found [here](https://docs.microsoft.com/en-us/powershell/scripting/dsc/overview/overview). \ No newline at end of file diff --git a/SharePointDsc/WikiSource/Home.md b/SharePointDsc/WikiSource/Home.md new file mode 100644 index 000000000..1320ccca2 --- /dev/null +++ b/SharePointDsc/WikiSource/Home.md @@ -0,0 +1,58 @@ +# Welcome to the SharePointDsc wiki + +SharePointDsc v#.#.# + +Here you will find all the information you need to make use of the SharePoint DSC resources, including details of the resources that are available, current capabilities and known issues, and information to help plan a DSC based implementation of SharePoint. + +Please leave comments, feature requests, and bug reports in the [issues section](../issues) for this module. + +## Quick start + +To get started, download SharePointDsc from the [PowerShell Gallery](http://www.powershellgallery.com/packages/SharePointDsc/) and then unzip it to one of your PowerShell modules folders (such as $env:ProgramFiles\WindowsPowerShell\Modules). +To install from the PowerShell gallery using PowerShellGet (in PowerShell 5.0), run the following command: + + Find-Module -Name SharePointDsc -Repository PSGallery | Install-Module + +To confirm installation, run the below command and ensure you see the SharePoint DSC resources available: + + Get-DscResource -Module SharePointDsc + +To view a more detailed explanation, view our [Getting Started](Getting-Started) page. + + +## Supported SharePoint versions + +SharePointDsc currently supports: + +- SharePoint Server 2013 with Service Pack 1 (or a higher update level) installed, running on Windows Server 2008 R2, Windows Server 2012 or Windows Server 2012 R2. +- SharePoint Server 2016 RTM (or higher) running on either Windows Server 2012 R2 or Windows Server 2019. +- SharePoint Server 2019 RTM (or higher) running on either Windows Server 2016 or Windows Server 2019. +- SharePoint Server Subscription Edition RTM (or higher) running on either Windows Server 2019 or Windows Server 2022. + + > For SharePoint 2013 to ensure correct provisioning of the User Profile Service and the User Profile Sync Service, the [February 2015 Cumulative Update](https://support.microsoft.com/en-us/kb/2920804) is also required. If you are installing SharePoint via the DSC resources, you can [slipstream it in to the update directory](http://www.toddklindt.com/blog/Lists/Posts/Post.aspx?ID=403) so it is applied during the initial installation. + +> SharePoint Foundation is not supported. + +## Known Issues +There are some known issues (and their solutions/workarounds) with SharePointDsc or PowerShell: + +[Error Exceeded the configured MaxEnvelopeSize quota](Error-Exceeded-the-configured-MaxEnvelopeSize-quota) + +[Setting up Central Administration on HTTPS](Setting-up-Central-Administration-on-HTTPS) + +[Using CredSSP on a domain controller / single server farm](Using-CredSSP-on-a-Domain-Controller) + +## Multilingual support + +Where possible, resources in SharePointDsc have been written in a way that they should support working with multiple language packs for multilingual deployments. However due to constraints in how we set up and install the product, only English ISOs are supported for installing SharePoint. + +## Resource Structure + +Resources inside the SharePointDSC module are categorized into 4 main groups. + +- Common Resources +- Specific Resources +- Distributed Resources +- Utility Resources + +To understand how to use these resources in your Configuration to avoid Syntax and undesired results go to our [Understanding Resources](Understanding-Resources) section. diff --git a/SharePointDsc/WikiSource/Installing-the-module.md b/SharePointDsc/WikiSource/Installing-the-module.md new file mode 100644 index 000000000..e8de7872c --- /dev/null +++ b/SharePointDsc/WikiSource/Installing-the-module.md @@ -0,0 +1,34 @@ +When working on Windows Server 2012R2 or any server without PowerShell 5.0. It's recommended to first upgrade PowerShell to v5.1. + +> [Download Windows Management Framework 5.1](https://www.microsoft.com/en-us/download/details.aspx?id=54616) + +If PowerShell is not regularly used or not connected to the internet like in many secure environments or servers you may need to switch PowerShell from using TLS 1.0 to TLS 1.2, so it can download the modules. +More information is published by the PowerShell Product Group in this [TLS1.2 and PowerShell](https://devblogs.microsoft.com/powershell/powershell-gallery-tls-support/) support article. +Line 16 shows how to install a new version of Powershell Get. + +> To mitigate this chance we have released a minor update to PowerShellGet which will allow you to continue to interact with the PowerShell Gallery. + +To install SharePointDsc, run the following commands: + +1. Open PowerShell as Administrator +1. Run `[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12` +1. Run `Register-PSRepository -Default` +1. Run `Install-Module -Name SharePointDSC` +1. Run `Install-Module ReverseDsc` (only if you want to export configurations) + +## Installing in a secure environment + +>If you followed steps above and received no errors you now have SharePoint DSC installed on your Machine and you can skip the next 2 steps. + +1. If your server is not connected to the internet you should have received an error in the previous steps. +2. Run `Save-Module -Name SharePointDSC,ReverseDsc -Path C:\Temp` on the machine connected to the Internet. This will download the modules to the specified folder. +3. Alternatively you can also install the module on the local machine, but this is not necessary: `Install-Module -Name SharePointDSC,ReverseDsc` on the machine connected to the Internet. Type `[A]` for All. +4. Manually copy the SharePointDsc and ReverseDsc folders from `C:\Temp` (from step 2) or `C:\Program Files\WindowsPowerShell\Modules` (from step 3) folders. You can optionally zip the folders. +5. Copy / Unzip the folders to the target machine into the Modules folder at `C:\Program Files\WindowsPowerShell` + +## Testing if the module is Installed + +You can use the Verb `Get-InstalledModule` to see All modules you have installed. +You can also use this block specifically. + + Get-InstalledModule SharePointDSC ,ReverseDSC diff --git a/SharePointDsc/WikiSource/Known-issues-with-remote-sessions.md b/SharePointDsc/WikiSource/Known-issues-with-remote-sessions.md new file mode 100644 index 000000000..ab5cdca6f --- /dev/null +++ b/SharePointDsc/WikiSource/Known-issues-with-remote-sessions.md @@ -0,0 +1,5 @@ +Due to the way that SharePointDsc uses a "remote" session to the local computer to impersonate a user for PowerShell 4 support (documented at "[Remote sessions and the InstallAccount variable](Remote-sessions-and-the-InstallAccount-variable)") there are a couple of known scenarios that do not work with this approach. The known scenarios are: + +## Updating SharePoint Designer settings in SPDesignerSettings + +The work around to this is to remove the InstallAccount property and instead us PsDscRunAsCredential (documented in the same link as above). This approach does require PowerShell 5 to work however, so if it is not possible to install PowerShell 5 then the above scenarios will not work and can not be used. diff --git a/SharePointDsc/WikiSource/Other-useful-modules-for-SharePoint-DSC-configurations.md b/SharePointDsc/WikiSource/Other-useful-modules-for-SharePoint-DSC-configurations.md new file mode 100644 index 000000000..41de5c92a --- /dev/null +++ b/SharePointDsc/WikiSource/Other-useful-modules-for-SharePoint-DSC-configurations.md @@ -0,0 +1,40 @@ +When working with SharePoint servers with PowerShell DSC, there are a number of other DSC modules which contain useful resources which can further assist with the automation of your environments. + +## xWebAdministration + +Available at: [https://www.powershellgallery.com/packages/xWebAdministration](https://www.powershellgallery.com/packages/xWebAdministration) + +This module contains resources which are responsible for managing IIS, which obviously play a key role in the front end server role of a SharePoint farm. +These resources can manage site configuring for tasks such as bindings, or remove the default IIS sites and app pools to reduce clutter. + + xWebAppPool RemoveDotNet2Pool { Name = ".NET v2.0"; Ensure = "Absent"; } + xWebAppPool RemoveDotNet2ClassicPool { Name = ".NET v2.0 Classic"; Ensure = "Absent"; } + xWebAppPool RemoveDotNet45Pool { Name = ".NET v4.5"; Ensure = "Absent"; } + xWebAppPool RemoveDotNet45ClassicPool { Name = ".NET v4.5 Classic"; Ensure = "Absent"; } + xWebAppPool RemoveClassicDotNetPool { Name = "Classic .NET AppPool"; Ensure = "Absent"; } + xWebAppPool RemoveDefaultAppPool { Name = "DefaultAppPool"; Ensure = "Absent"; } + xWebSite RemoveDefaultWebSite { Name = "Default Web Site"; Ensure = "Absent"; PhysicalPath = "C:\inetpub\wwwroot"; } + +## xCredSSP + +Available at [https://www.powershellgallery.com/packages/xCredSSP](https://www.powershellgallery.com/packages/xCredSSP) + +The xCredSSP module is a simple way to automate CredSSP configuration. See [Remote sessions and the InstallAccount variable](Remote-sessions-and-the-InstallAccount-variable) for more information on this. + +## SchannelDsc + +Available at [https://www.powershellgallery.com/packages/SchannelDsc](https://www.powershellgallery.com/packages/SchannelDsc) + +This module can be used to configure Secure Channel (SSL/TLS) settings in Windows, like disabling SSLv3 and enabling TLSv1.2. + +## OfficeOnlineServerDsc + +Available at [https://www.powershellgallery.com/packages/OfficeOnlineServerDsc](https://www.powershellgallery.com/packages/OfficeOnlineServerDsc) + +This module can be used to install and manage [Office Online Server](https://docs.microsoft.com/en-us/officeonlineserver/office-online-server). + +## WorkflowManagerDsc + +Available at [https://www.powershellgallery.com/packages/WorkflowManagerDsc](https://www.powershellgallery.com/packages/WorkflowManagerDsc) + +This module can be used to install and manage [Workflow Manager](https://docs.microsoft.com/en-us/sharepoint/governance/install-and-configure-workflow-for-sharepoint-server#install-workflow-manager). diff --git a/SharePointDsc/WikiSource/Prerequisites.md b/SharePointDsc/WikiSource/Prerequisites.md new file mode 100644 index 000000000..8b5a854c4 --- /dev/null +++ b/SharePointDsc/WikiSource/Prerequisites.md @@ -0,0 +1,10 @@ +To run PowerShell DSC, you need to have PowerShell 4.0 or higher (which is included in Windows Management Framework 4.0 or higher). +This version of PowerShell is shipped with Windows Server 2012 R2, and Windows 8.1 or higher. + +To use DSC on earlier versions of Windows, install the Windows Management Framework 4.0. + +However it is strongly recommended that PowerShell 5.0 (or above) is used, as it adds support for the PsDscRunAsCredential parameter and has overall better performance and troubleshooting capabilities. + +The logic behind this is explained on the page "[Remote sessions and the InstallAccount variable](Remote-sessions-and-the-InstallAccount-variable)" page. + +[PowerShell 5.1](https://www.microsoft.com/en-us/download/details.aspx?id=54616) includes significant improvements in Desired State Configuration and PowerShell Script Debugging. diff --git a/SharePointDsc/WikiSource/Remote-sessions-and-the-InstallAccount-variable.md b/SharePointDsc/WikiSource/Remote-sessions-and-the-InstallAccount-variable.md new file mode 100644 index 000000000..6eefdabd4 --- /dev/null +++ b/SharePointDsc/WikiSource/Remote-sessions-and-the-InstallAccount-variable.md @@ -0,0 +1,49 @@ +# PowerShell 4 + +In PowerShell 4, by default the normal behavior of the [local configuration manager](https://technet.microsoft.com/en-us/library/dn249922.aspx) in DSC is to execute configuration elements in the context of the local system account. +This presents an issue in a SharePoint environment as all access to SharePoint databases and resources is managed by allowing the appropriate service accounts permission to do so, and these service accounts are domain accounts, not local machine accounts. + +To get around this for the resources that manipulate SharePoint content, we need to impersonate another account to execute the commands. +This is achieved through the use of the parameter "InstallAccount", which is present in almost all of the resources in the SharePointDsc module. +The InstallAccount parameter represents the account that is responsible for the creation and management of all SharePoint resources in the farm. +It is likely to be a highly privileged account (which may include local administrator rights - so do not use an account that is also used to run services or components anywhere in SharePoint, use a dedicated account instead). + +The impersonation is managed through the use of the Invoke-Command cmdlet in PowerShell, in conjunction with creating an appropriate "remote" session through New-PSSession. +Each session that is created this way will always target "localhost" as opposed to a genuinely remote computer, but it gives us the opportunity to control the authentication for that session. +In the SharePointDsc module, we authenticate as the InstallAccount, and we specify that CredSSP is used as the authentication mechanism. + +To enable CredSSP, there is some configuration that needs to take place first, and there are two methods of doing this. + +## Option 1: Manually configure CredSSP + +You can manually configure CredSSP through the use of some PowerShell cmdlet's (and potentially group policy to configure the allowed delegate computers). Some basic instructions can be found at [https://technet.microsoft.com/en-us/magazine/ff700227.aspx](https://technet.microsoft.com/en-us/magazine/ff700227.aspx). + +### Option 2: Configure CredSSP through a DSC resource + +It is possible to use a DSC resource to configure your CredSSP settings on a server, and include this in all of your SharePoint server configurations. +This is done through the use of the [xCredSSP](https://github.com/PowerShell/xCredSSP) resource. The below example shows how this can be used. + + xCredSSP CredSSPServer { Ensure = "Present"; Role = "Server" } + xCredSSP CredSSPClient { Ensure = "Present"; Role = "Client"; DelegateComputers = $CredSSPDelegates } + +In the above example, $CredSSPDelegates can be a wildcard name (such as "*.contoso.com" to allow all servers in the contoso.com domain), or a list of specific servers (such as "server1", "server 2" to allow only specific servers). + +## PowerShell 5 + +PowerShell 5 offers a different approach to how impersonation is done. With WMF 5 installed, all DSC resources (not just those in SharePointDsc) can add a parameter called PsDscRunAsCredential. +This property tells the LCM to run that specific resource with the credential that is supplied instead of the local system account. +This removes the need to have InstallAccount on SharePointDsc resources. However, instead of removing it, logic was added that would allow you to use either InstallAccount or PsDscRunAsCredential. +The SharePointDsc resources will detect if they are running as the local system account or not and will only use a "remote" session as described above where it is needed. + +Also note that some resources in SharePointDsc still use the above described remote session technique to simulate other others regardless of whether or not PsDscRunAsCredential is used. +An example of this is [SPUserProfileSyncService](SPUserProfileSyncService) which uses this approach to run as the farm account value. + +An example of how to use this property in PowerShell 5 is shown below: + + SPCacheAccounts SetCacheAccounts + { + WebAppUrl = "http://sharepoint.contoso.com" + SuperUserAlias = "DEMO\svcSPSuperUser" + SuperReaderAlias = "DEMO\svcSPReader" + PsDscRunAsCredential = $InstallAccount + } diff --git a/SharePointDsc/WikiSource/Setting-up-Central-Administration-on-HTTPS.md b/SharePointDsc/WikiSource/Setting-up-Central-Administration-on-HTTPS.md new file mode 100644 index 000000000..0280dadf5 --- /dev/null +++ b/SharePointDsc/WikiSource/Setting-up-Central-Administration-on-HTTPS.md @@ -0,0 +1,24 @@ +Setting up Central Administration on HTTPS is still not a straight forward process. Here, we describe one way to accomplish this using DSC with a choice of a couple of workarounds to ensure it stays configured properly. Starting in SharePoint 2016, the PowerShell cmdlet New-SPCentralAdministration added support for a -SecureSocketsLayer argument to initialize CA with HTTPS. This cmdlet still does not, however, support specifying a hostname to use with SNI to avoid conflicts with creating web applications on the same IP/port in IIS. So we're going to use DSC to create our farm with CA on HTTP using a high port like 9999 and then later (after creating our web apps) update the IIS binding to HTTPS with a hostname using SNI and update the AAM in SharePoint. + +For the code, please see the [SharePoint.SSL.ps1](https://github.com/PowerShell/SharePointDsc/blob/dev/Modules/SharePointDsc/Examples/Small-Farm/SharePoint.SSL.ps1) example in the Examples/Small Farm folder. + +## Workarounds + +When running the SharePoint Products Configuration Wizard (psconfigUI.exe) on the Central Administration server, it will try to reconfigure the Central Administration web application as part of the process. In most cases, it will not recognize the hostname as part of the binding and may reset the IIS HTTPS binding and add an HTTP binding and corresponding Alternate Access Mapping (AAM). + +To avoid this problem, you can use psconfig.exe from the SharePoint Management Shell instead: + +``` +PSConfig.exe -cmd upgrade -inplace b2b -wait -cmd applicationcontent -install -cmd installfeatures -cmd secureresources -cmd services -install +``` + +An alternative workaround involves removing and recreating the Central Administration web application after the farm has been provisioned. Use the following PowerShell commands in an elevated SharePoint Management Shell: + +```powershell +Remove-SPWebApplication -Identity https://admin.contoso.com -Zone Default -DeleteIISSite + +New-SPWebApplicationExtension -Identity https://admin.contoso.com -Name "SharePoint Central Administration v4" -Zone Default -HostHeader admin.contoso.com -Port 443 -SecureSocketsLayer +``` + +This method stores the IIS binding information in SharePoint so that the configuration wizard will not wipe out the existing IIS bindings when running psconfigUI.exe. + diff --git a/SharePointDsc/WikiSource/Understanding-Resources.md b/SharePointDsc/WikiSource/Understanding-Resources.md new file mode 100644 index 000000000..77c9cf39d --- /dev/null +++ b/SharePointDsc/WikiSource/Understanding-Resources.md @@ -0,0 +1,159 @@ +# Resource Types + +## Common Resources + +These resources need to be defined within every node in the farm. The parameters specify for the resources associated with Common Resources should be the same for each server (e.g. the same language packs need to be installed on all servers in the farm). As an example, the SPInstall resource, which installs the SharePoint binaries on a server, needs to be present within every node in the farm. It is not enough to have only one server with the binaries installed on in a multi-server farm. Common Resources are identified in the list below with the mention **Common**. + +## Specific Resources + +Just like the Common Resources, the Specific Resources need to be included within every node in the farm. Their only difference, compare to Common Resources, is that the resources' parameters may differ from one node to another in the farm. As an example, the SPServiceInstance resource, which allows us to enable specific services on a SharePoint Server, will be specified for each server in the farm, but with different "Ensure" value to allow certain services to be started on specific servers, but not on others. Specific Resources are identified in the list below with the mention **Specific**. + +## Distributed Resources + +This category covers the major part of the resources. Distributed Resources should ONLY be defined within ONE node in the farm. As the name states it, those are distributed which means that resources of this type are normally stored in a central database. Specifying these resources on more than one node in the farm may introduce unexpected behaviors (race condition, performance issues, etc.). For example, if you wanted to create a new Web Application using the traditional PowerShell approach, you would pick one server and run the New-SPWebApplication cmdlet on it, you would not run it on each of the servers in the farm. To define these resources, identify one server in your configuration (e.g. the first server to create/join the farm), and define all the Distributed Resources within it. Distributed Resources are identified in the list below with the mention **Distributed**. + +## Utility Resources + +Utility Resources are resources that do not generate an artefact per say. Their sole purpose is to help you initiate a check or apply a patch. As an example, the SPMinRoleCompliance resource simply returns true or false (in its Test-TargetResource function) if the services running on a server correspond to the services that are associated with its assigned MinRole. It does not enable, disable or even create any service instances. Utility Resources are identified in the list below with the mention **Utility** . + +# Available resources + +The SharePointDsc module includes the following DSC resources + +|Resource|Type|Requires CredSSP| +|--|--|--| +|[SPAccessServiceApp](SPAccessServiceApp) | Distributed | - | +|[SPAccessServices2010](SPAccessServices2010) | Distributed | - | +|[SPAlternateUrl](SPAlternateUrl) | Distributed | - | +|[SPAntivirusSettings](SPAntivirusSettings) | Distributed | - | +|[SPAppCatalog](SPAppCatalog) | Distributed | Yes | +|[SPAppDomain](SPAppDomain) | Distributed | - | +|[SPAppManagementServiceApp](SPAppManagementServiceApp) | Distributed | - | +|[SPAppStoreSettings](SPAppStoreSettings) | Distributed | - | +|[SPAuthenticationRealm](SPAuthenticationRealm) | Distributed | - | +|[SPAzureAccessControlServiceAppProxy](SPAzureAccessControlServiceAppProxy) | Distributed | - | +|[SPBCSServiceApp](SPBCSServiceApp) | Distributed | - | +|[SPBlobCacheSettings](SPBlobCacheSettings) | Specific | - | +|[SPCacheAccounts](SPCacheAccounts) | Distributed | - | +|[SPCertificate](SPCertificate) | Distributed | - | +|[SPCertificateSettings](SPCertificate) | Distributed | - | +|[SPConfigWizard](SPConfigWizard) | Utility | - | +|[SPContentDatabase](SPContentDatabase) | Distributed | - | +|[SPDatabaseAAG](SPDatabaseAAG) | Distributed | - | +|[SPDesignerSettings](SPDesignerSettings) | Distributed | - | +|[SPDiagnosticLoggingSettings](SPDiagnosticLoggingSettings) | Distributed | - | +|[SPDiagnosticsProvider](SPDiagnosticsProvider) | Distributed | - | +|[SPDistributedCacheClientSettings](SPDistributedCacheClientSettings) | Distributed | - | +|[SPDistributedCacheService](SPDistributedCacheService) | Specific | - | +|[SPDocIcon](SPDocIcon) | Common | - | +|[SPExcelServiceApp](SPExcelServiceApp) | Distributed | - | +|[SPFarm](SPFarm) | Specific | - | +|[SPFarmAdministrators](SPFarmAdministrators) | Distributed | - | +|[SPFarmPropertyBag](SPFarmPropertyBag) | Distributed | - | +|[SPFarmSolution](SPFarmSolution) | Distributed | - | +|[SPFeature](SPFeature) | Distributed | - | +|[SPHealthAnalyzerRuleState](SPHealthAnalyzerRuleState) | Distributed | - | +|[SPIncomingEmailSettings](SPIncomingEmailSettings) | Distributed | - | +|[SPInfoPathFormsServiceConfig](SPInfoPathFormsServiceConfig) | Distributed | - | +|[SPInstall](SPInstall) | Common | - | +|[SPInstallLanguagePack](SPInstallLanguagePack) | Common | - | +|[SPInstallPrereqs](SPInstallPrereqs) | Common | - | +|[SPIrmSettings](SPIrmSettings) | Distributed | - | +|[SPLogLevel](SPLogLevel) | Distributed | - | +|[SPMachineTranslationServiceApp](SPMachineTranslationServiceApp) | Distributed | - | +|[SPManagedAccount](SPManagedAccount) | Distributed | - | +|[SPManagedMetaDataServiceApp](SPManagedMetaDataServiceApp) | Distributed | - | +|[SPManagedMetaDataServiceAppDefault](SPManagedMetaDataServiceAppDefault) | Distributed | - | +|[SPManagedPath](SPManagedPath) | Distributed | - | +|[SPMinRoleCompliance](SPMinRoleCompliance) | Utility | - | +|[SPOAppPrincipalMgmtServiceAppProxy](SPOAppPrincipalMgmtServiceAppProxy) | Distributed | - | +|[SPOfficeOnlineServerBinding](SPOfficeOnlineServerBinding) | Distributed | - | +|[SPOfficeOnlineServerSupressionSettings](SPOfficeOnlineServerSupressionSettings) | Distributed | - | +|[SPOutgoingEmailSettings](SPOutgoingEmailSettings) | Distributed | - | +|[SPPasswordChangeSettings](SPPasswordChangeSettings) | Distributed | - | +|[SPPerformancePointServiceApp](SPPerformancePointServiceApp) | Distributed | - | +|[SPPowerPointAutomationServiceApp](SPPowerPointAutomationServiceApp) | Distributed | - | +|[SPProductUpdate](SPProductUpdate) | Common | - | +|[SPProjectServerAdditionalSettings](SPProjectServerAdditionalSettings) | Distributed | - | +|[SPProjectServerADResourcePoolSync](SPProjectServerADResourcePoolSync) | Distributed | - | +|[SPProjectServerGlobalPermissions](SPProjectServerGlobalPermissions) | Distributed | - | +|[SPProjectServerGroup](SPProjectServerGroup) | Distributed | - | +|[SPProjectServerLicense](SPProjectServerLicense) | Distributed | - | +|[SPProjectServerPermissionMode](SPProjectServerPermissionMode) | Distributed | - | +|[SPProjectServerServiceApp](SPProjectServerServiceApp) | Distributed | - | +|[SPProjectServerTimeSheetSettings](SPProjectServerTimeSheetSettings) | Distributed | - | +|[SPProjectServerUserSyncSettings](SPProjectServerUserSyncSettings) | Distributed | - | +|[SPProjectServerWssSettings](SPProjectServerWssSettings) | Distributed | - | +|[SPPublishServiceApplication](SPPublishServiceApplication) | Distributed | - | +|[SPQuotaTemplate](SPQuotaTemplate) | Distributed | - | +|[SPRemoteFarmTrust](SPRemoteFarmTrust) | Distributed | - | +|[SPSearchAuthoritivePage](SPSearchAuthoritivePage) | Distributed | - | +|[SPSearchContentSource](SPSearchContentSource) | Distributed | - | +|[SPSearchCrawlerImpactRule](SPSearchCrawlerImpactRule) | Distributed | - | +|[SPSearchCrawlMapping](SPSearchCrawlMapping) | Distributed | - | +|[SPSearchCrawlRule](SPSearchCrawlRule) | Distributed | - | +|[SPSearchFileType](SPSearchFileType) | Distributed | - | +|[SPSearchIndexPartition](SPSearchIndexPartition) | Distributed | - | +|[SPSearchManagedProperty](SPSearchManagedProperty) | Distributed | - | +|[SPSearchMetadataCategory](SPSearchMetadataCategory) | Distributed | - | +|[SPSearchResultSource](SPSearchResultSource) | Distributed | - | +|[SPSearchServiceApp](SPSearchServiceApp) | Distributed | - | +|[SPSearchServiceSettings](SPSearchServiceSettings) | Distributed | - | +|[SPSearchTopology](SPSearchTopology) | Distributed | - | +|[SPSecureStoreServiceApp](SPSecureStoreServiceApp) | Distributed | - | +|[SPSecurityTokenServiceConfig](SPSecurityTokenServiceConfig) | Distributed | - | +|[SPSelfServiceSiteCreation](SPSelfServiceSiteCreation) | Distributed | - | +|[SPService](SPService) | Distributed | - | +|[SPServiceAppPool](SPServiceAppPool) | Distributed | - | +|[SPServiceAppProxyGroup](SPServiceAppProxyGroup) | Distributed | - | +|[SPServiceAppSecurity](SPServiceAppSecurity) | Distributed | - | +|[SPServiceIdentity](SPServiceIdentity) | Distributed | - | +|[SPServiceInstance](SPServiceInstance) | Specific | - | +|[SPSessionStateService](SPSessionStateService) | Distributed | - | +|[SPShellAdmins](SPShellAdmins) | Distributed | - | +|[SPSite](SPSite) | Distributed | - | +|[SPSitePropertyBag](SPSitePropertyBag) | Distributed | - | +|[SPSiteUrl](SPSiteUrl) | Distributed | - | +|[SPStateServiceApp](SPStateServiceApp) | Distributed | - | +|[SPSubscriptionSettingsServiceApp](SPSubscriptionSettingsServiceApp) | Distributed | - | +|[SPTimerJobState](SPTimerJobState) | Distributed | - | +|[SPTrustedIdentityTokenIssuer](SPTrustedIdentityTokenIssuer) | Distributed | - | +|[SPTrustedIdentityTokenIssuerProviderRealms](SPTrustedIdentityTokenIssuerProviderRealms) | Distributed | - | +|[SPTrustedRootAuthority](SPTrustedRootAuthority) | Distributed | - | +|[SPTrustedSecurityTokenIssuer](SPTrustedSecurityTokenIssuer) | Distributed | - | +|[SPUsageApplication](SPUsageApplication) | Distributed | - | +|[SPUsageDefinition](SPUsageDefinition) | Distributed | - | +|[SPUserProfileProperty](SPUserProfileProperty) | Distributed | - | +|[SPUserProfileSection](SPUserProfileSection) | Distributed | - | +|[SPUserProfileServiceApp](SPUserProfileServiceApp) | Distributed | - | Yes | +|[SPUserProfileServiceAppPermissions](SPUserProfileServiceAppPermissions) | Distributed | - | +|[SPUserProfileSyncConnection](SPUserProfileSyncConnection) | Distributed | - | +|[SPUserProfileSyncService](SPUserProfileSyncService) | Specific | Yes | +|[SPVisioServiceApp](SPVisioServiceApp) | Distributed | - | +|[SPWeb](SPWeb) | Distributed | - | +|[SPWebAppAuthentication](SPWebAppAuthentication) | Distributed | - | +|[SPWebAppBlockedFileTypes](SPWebAppBlockedFileTypes) | Distributed | - | +|[SPWebAppClientCallableSettings](SPWebAppClientCallableSettings) | Distributed | - | +|[SPWebAppGeneralSettings](SPWebAppGeneralSettings) | Distributed | - | +|[SPWebAppHttpThrottlingMonitor](SPWebAppHttpThrottlingMonitor) | Distributed | - | +|[SPWebApplication](SPWebApplication) | Distributed | - | +|[SPWebApplicationAppDomain](SPWebApplicationAppDomain) | Distributed | - | +|[SPWebApplicationExtension](SPWebApplicationExtension) | Distributed | - | +|[SPWebAppPeoplePickerSettings](SPWebAppPeoplePickerSettings) | Distributed | - | +|[SPWebAppPermissions](SPWebAppPermissions) | Distributed | - | +|[SPWebAppPolicy](SPWebAppPolicy) | Distributed | - | +|[SPWebAppPropertyBag](SPWebAppPropertyBag) | Distributed | - | +|[SPWebAppProxyGroup](SPWebAppProxyGroup) | Distributed | - | +|[SPWebAppSiteUseAndDeletion](SPWebAppSiteUseAndDeletion) | Distributed | - | +|[SPWebAppSuiteBar](SPWebAppSuiteBar) | Distributed | - | +|[SPWebAppThrottlingSettings](SPWebAppThrottlingSettings) | Distributed | - | +|[SPWebAppWorkflowSettings](SPWebAppWorkflowSettings) | Distributed | - | +|[SPWordAutomationServiceApp](SPWordAutomationServiceApp) | Distributed | - | +|[SPWorkflowService](SPWorkflowService) | Distributed | - | +|[SPWorkManagementServiceApp](SPWorkManagementServiceApp) | Distributed | - | + +## Using the Script resource in configurations with SharePointDsc + +Check-out this [article](Using-the-Script-resource-in-configurations-that-use-SharePointDsc) if you want to use the Script resource to implement custom functionality that is not included in SharePointDsc. + +> Of course you can also create an issue in the issue list to request the functionality to be added. Sharing code that you already have will greatly speed up the development effort. \ No newline at end of file diff --git a/SharePointDsc/WikiSource/Using-CredSSP-on-a-Domain-Controller.md b/SharePointDsc/WikiSource/Using-CredSSP-on-a-Domain-Controller.md new file mode 100644 index 000000000..e97fd215d --- /dev/null +++ b/SharePointDsc/WikiSource/Using-CredSSP-on-a-Domain-Controller.md @@ -0,0 +1,25 @@ +When you are trying to use the resources that require CredSSP, you can run into issues when deploying to a single server which is also a domain controller. + +> **NOTE:** Installing SharePoint on a domain controller should not be done in Production scenarios! + +Even though you configured CredSSP as required, you can run into the following error message: +``` +Test-WSMan : The WinRM client cannot process the request. A computer policy does not allow the delegation of the user credentials to the target computer because the computer is not trusted. The identity of the t +arget computer can be verified if you configure the WSMAN service to use a valid certificate using the following command: winrm set winrm/config/service @{CertificateThumbprint="<thumbprint>"} Or you can check the Event Viewer for an event that specifies that the following SPN could not be created: WSMAN/<computerFQDN>. If you find + this event, you can manually create the SPN using setspn.exe . If the SPN exists, but CredSSP cannot use Kerberos to validate the identity of the target computer and you still want to allow the delegation of the user credentials to the target computer, use gpedit.msc and look at the following policy: Computer Configuration -> Administrativ +e Templates -> System -> Credentials Delegation -> Allow Fresh Credentials with NTLM-only Server Authentication. Verify that it is enabled and configured with an SPN appropriate for the target computer. For example, for a target computer name "myserver.domain.com", the SPN can be one of the following: WSMAN/myserver.domain.com or WSMA +N/*.domain.com. Try the request again after these changes. +At line:1 char:1 ++ Test-WSMan -Authentication Credssp -ComputerName Server1 -Credential ... ++ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + CategoryInfo : InvalidOperation: (Server1:String) [Test-WSMan], InvalidOperationException + + FullyQualifiedErrorId : WsManError,Microsoft.WSMan.Management.TestWSManCommand +``` + +You can resolve this issue by configuring Service Principal Names in Active Directory for the server: +``` +setspn -S wsman/server1.domain.com server1 +setspn -S wsman/server1 server1 +``` + +After configuring these SPNs, CredSSP will run as expected again! \ No newline at end of file diff --git a/SharePointDsc/WikiSource/Using-the-Script-resource-in-configurations-that-use-SharePointDsc.md b/SharePointDsc/WikiSource/Using-the-Script-resource-in-configurations-that-use-SharePointDsc.md new file mode 100644 index 000000000..6ef142ac0 --- /dev/null +++ b/SharePointDsc/WikiSource/Using-the-Script-resource-in-configurations-that-use-SharePointDsc.md @@ -0,0 +1,19 @@ +In some circumstances you may find yourself needing to use a [Script resource](https://msdn.microsoft.com/en-us/powershell/dsc/scriptresource) to be able to perform a function that is not included in SharePointDsc. If your script resource needs to add the SharePoint snap-in you may find that this will cause issues with other resources provided by SharePointDsc (as discussed in in [this issue](https://github.com/PowerShell/SharePointDsc/issues/566)). To work around this, it is recommended that instead of loading the snap-in yourself you use the Invoke-SPDscCommand helper to achieve this. This helper method will load the snap-in for you in the same way that the native resources of SharePointDsc do, and will avoid conflicts with it being loaded multiple times. + +An example of this in a script resources is shown below: + +```PowerShell +Script SPDscExample +{ + GetScript = { + Invoke-SPDscCommand -ScriptBlock { + # your code goes here + $params = $args[0] + Write-Verbose $params.Foo + } -Arguments @{ Foo = "Bar" } -Credentials (Get-Credentials) + } + ... +} +``` + +If you need to pass a credential or additional arguments, you can use the -Credential and -Arguments parameters for these purposes also. \ No newline at end of file diff --git a/SharePointDsc/WikiSource/_Footer.md b/SharePointDsc/WikiSource/_Footer.md new file mode 100644 index 000000000..f7b23b61f --- /dev/null +++ b/SharePointDsc/WikiSource/_Footer.md @@ -0,0 +1 @@ +![SharePointDSC](media/footer.png "SharePointDsc") \ No newline at end of file diff --git a/SharePointDsc/WikiSource/_Sidebar.md b/SharePointDsc/WikiSource/_Sidebar.md new file mode 100644 index 000000000..adfcc0ddd --- /dev/null +++ b/SharePointDsc/WikiSource/_Sidebar.md @@ -0,0 +1,14 @@ +# SharePointDsc Module + +- [Home](Home) +- [Getting Started](Getting-Started) +- [Pre-requisites](Prerequisites) +- [Installing the module](Installing-the-module) +- [Exporting SharePoint Configuration](Export-SharePoint-Configuration) +- [Creating Configuration Files](Creating-Configuration-Files) +- [Pre-created Examples](https://github.com/dsccommunity/SharePointDsc/tree/master/SharePointDsc/Examples) +- [Creating an Azure development environment](Creating-an-Azure-development-environment) +- [Understanding Resources & Syntax](Understanding-Resources) +- [Remote PowerShell Authentication](Remote-sessions-and-the-InstallAccount-variable) +- [Contributing to SharePointDsc](Contributing-to-SharePointDsc) +- [Other useful modules for SharePoint DSC configurations](Other-useful-modules-for-SharePoint-DSC-configurations) diff --git a/SharePointDsc/WikiSource/media/ExportGUI.png b/SharePointDsc/WikiSource/media/ExportGUI.png new file mode 100644 index 0000000000000000000000000000000000000000..0df2c9153fd39b974ce6be97394e539afac1d546 GIT binary patch literal 75280 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 literal 0 HcmV?d00001 diff --git a/SharePointDsc/WikiSource/media/footer.png b/SharePointDsc/WikiSource/media/footer.png new file mode 100644 index 0000000000000000000000000000000000000000..7d3e0e198609ba8fc0df405bbba0cd74a24a4a5c GIT binary patch literal 47135 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 Lp-}PUb + if ($BuiltModuleSubdirectory) + { + if (-not (Split-Path -IsAbsolute -Path $BuiltModuleSubdirectory)) + { + $BuildModuleOutput = Join-Path -Path $OutputDirectory -ChildPath $BuiltModuleSubdirectory + } + else + { + $BuildModuleOutput = $BuiltModuleSubdirectory + } + } # test if BuiltModuleSubDirectory set in build config file + elseif ($BuildInfo.ContainsKey('BuiltModuleSubDirectory')) + { + $BuildModuleOutput = Join-Path -Path $OutputDirectory -ChildPath $BuildInfo['BuiltModuleSubdirectory'] + } + else + { + $BuildModuleOutput = $OutputDirectory + } + + # Pre-pending $BuildModuleOutput folder to PSModulePath to resolve built module from this folder. + if ($powerShellModulePaths -notcontains $BuildModuleOutput) + { + Write-Host -Object "[build] Pre-pending '$BuildModuleOutput' folder to PSModulePath" -ForegroundColor Green + + $env:PSModulePath = $BuildModuleOutput + [System.IO.Path]::PathSeparator + $env:PSModulePath + } + <# Import Tasks from modules via their exported aliases when defined in Build Manifest. https://github.com/nightroman/Invoke-Build/tree/master/Tasks/Import#example-2-import-from-a-module-with-tasks @@ -403,30 +440,6 @@ Begin } } - if ($BuiltModuleSubdirectory) - { - if (-not (Split-Path -IsAbsolute -Path $BuiltModuleSubdirectory)) - { - $BuildModuleOutput = Join-Path -Path $OutputDirectory -ChildPath $BuiltModuleSubdirectory - } - else - { - $BuildModuleOutput = $BuiltModuleSubdirectory - } - } - else - { - $BuildModuleOutput = $OutputDirectory - } - - # Pre-pending $BuildModuleOutput folder to PSModulePath to resolve built module from this folder. - if ($powerShellModulePaths -notcontains $BuildModuleOutput) - { - Write-Host -Object "[pre-build] Pre-pending '$BuildModuleOutput' folder to PSModulePath" -ForegroundColor Green - - $env:PSModulePath = $BuildModuleOutput + [System.IO.Path]::PathSeparator + $env:PSModulePath - } - <# The variable $PSDependTarget will be used below when building the splatting variable before calling Resolve-Dependency.ps1, unless overridden in the diff --git a/build.yaml b/build.yaml index f70c953b5..b5c8db7bb 100644 --- a/build.yaml +++ b/build.yaml @@ -52,13 +52,13 @@ BuildWorkflow: # code coverage files and needs to get merged into one file. #- Merge_CodeCoverage_Files - merge: - Merge_CodeCoverage_Files publish: - Publish_Release_To_GitHub - Publish_Module_To_Gallery + - Publish_GitHub_Wiki_Content #################################################### # PESTER Configuration # diff --git a/tests/Unit/SharePointDsc/SharePointDsc.SPWebAppPeoplePickerSettings.Tests.ps1 b/tests/Unit/SharePointDsc/SharePointDsc.SPWebAppPeoplePickerSettings.Tests.ps1 index f10ece39a..c45ea920d 100644 --- a/tests/Unit/SharePointDsc/SharePointDsc.SPWebAppPeoplePickerSettings.Tests.ps1 +++ b/tests/Unit/SharePointDsc/SharePointDsc.SPWebAppPeoplePickerSettings.Tests.ps1 @@ -49,7 +49,7 @@ try InModuleScope -ModuleName $script:DSCResourceFullName -ScriptBlock { Describe -Name $Global:SPDscHelper.DescribeHeader -Fixture { BeforeAll { - Invoke-Command -ScriptBlock $Global:SPDscHelper.InitializeScript -NoNewScope + Invoke-Command -Scriptblock $Global:SPDscHelper.InitializeScript -NoNewScope # Initialize tests $mockPassword = ConvertTo-SecureString -String "password" -AsPlainText -Force @@ -57,7 +57,8 @@ try -ArgumentList @("username", $mockPassword) try - { [Microsoft.SharePoint.Administration.SPPeoplePickerSearchActiveDirectoryDomain] + { + [Microsoft.SharePoint.Administration.SPPeoplePickerSearchActiveDirectoryDomain] } catch { @@ -135,42 +136,43 @@ try WebAppUrl = "http://sharepoint.contoso.com" SearchActiveDirectoryDomains = @( (New-CimInstance -ClassName MSFT_SPWebAppPPSearchDomain -Property @{ - FQDN = "contoso.intra" - IsForest = $false - AccessAccount = (New-CimInstance -ClassName MSFT_Credential ` - -Property @{ - Username = [string]$mockAccount.UserName; - Password = [string]$mockAccount.Password; - } ` - -Namespace root/microsoft/windows/desiredstateconfiguration ` - -ClientOnly) - } -ClientOnly) + FQDN = "contoso.intra" + IsForest = $false + AccessAccount = (New-CimInstance -ClassName MSFT_Credential ` + -Property @{ + Username = [string]$mockAccount.UserName; + Password = [string]$mockAccount.Password; + } ` + -Namespace root/microsoft/windows/desiredstateconfiguration ` + -ClientOnly) + } -ClientOnly) ) } Mock -CommandName Get-SPWebApplication -MockWith { $searchADdom = New-Object -TypeName "System.Collections.Generic.List[System.Object]" $searchDom1 = New-Object -TypeName "Object" | ` - Add-Member -MemberType NoteProperty ` - -Name DomainName ` - -Value ( "contosonew.intra" ) -PassThru | ` - Add-Member -MemberType NoteProperty ` - -Name IsForest ` - -Value ( $false ) -PassThru | ` - Add-Member -MemberType NoteProperty ` - -Name LoginName ` - -Value ( $mockAccount.UserName ) -PassThru + Add-Member -MemberType NoteProperty ` + -Name DomainName ` + -Value ( "contosonew.intra" ) -PassThru | ` + Add-Member -MemberType NoteProperty ` + -Name IsForest ` + -Value ( $false ) -PassThru | ` + Add-Member -MemberType NoteProperty ` + -Name LoginName ` + -Value ( $mockAccount.UserName ) -PassThru $searchADdom.Add($searchDom1) $returnval = @{ PeoplePickerSettings = @{ - ActiveDirectoryCustomFilter = "()" - ActiveDirectoryCustomQuery = "()" - ActiveDirectorySearchTimeout = @{ + ActiveDirectoryCustomFilter = "()" + ActiveDirectoryCustomQuery = "()" + ActiveDirectorySearchTimeout = @{ TotalSeconds = 10 } - OnlySearchWithinSiteCollection = $true - SearchActiveDirectoryDomains = $searchADdom + OnlySearchWithinSiteCollection = $true + PeopleEditorOnlyResolveWithinSiteCollection = $true + SearchActiveDirectoryDomains = $searchADdom } } $returnval = $returnval | Add-Member -MemberType ScriptMethod -Name Update -Value { @@ -199,36 +201,38 @@ try Context -Name "Settings do not match actual values" -Fixture { BeforeAll { $testParams = @{ - WebAppUrl = "http://sharepoint.contoso.com" - ActiveDirectoryCustomFilter = $null - ActiveDirectoryCustomQuery = $null - ActiveDirectorySearchTimeout = 30 - OnlySearchWithinSiteCollection = $false + WebAppUrl = "http://sharepoint.contoso.com" + ActiveDirectoryCustomFilter = $null + ActiveDirectoryCustomQuery = $null + ActiveDirectorySearchTimeout = 30 + OnlySearchWithinSiteCollection = $false + PeopleEditorOnlyResolveWithinSiteCollection = $false } Mock -CommandName Get-SPWebApplication -MockWith { $searchADdom = New-Object -TypeName "System.Collections.Generic.List[System.Object]" $searchDom1 = New-Object -TypeName "Object" | ` - Add-Member -MemberType NoteProperty ` - -Name DomainName ` - -Value ( "contoso.intra" ) -PassThru | ` - Add-Member -MemberType NoteProperty ` - -Name IsForest ` - -Value ( $false ) -PassThru | ` - Add-Member -MemberType NoteProperty ` - -Name LoginName ` - -Value ( $mockAccount.UserName ) -PassThru + Add-Member -MemberType NoteProperty ` + -Name DomainName ` + -Value ( "contoso.intra" ) -PassThru | ` + Add-Member -MemberType NoteProperty ` + -Name IsForest ` + -Value ( $false ) -PassThru | ` + Add-Member -MemberType NoteProperty ` + -Name LoginName ` + -Value ( $mockAccount.UserName ) -PassThru $searchADdom.Add($searchDom1) $returnval = @{ PeoplePickerSettings = @{ - ActiveDirectoryCustomFilter = "()" - ActiveDirectoryCustomQuery = "()" - ActiveDirectorySearchTimeout = @{ + ActiveDirectoryCustomFilter = "()" + ActiveDirectoryCustomQuery = "()" + ActiveDirectorySearchTimeout = @{ TotalSeconds = 10 } - OnlySearchWithinSiteCollection = $true - SearchActiveDirectoryDomains = $searchADdom + OnlySearchWithinSiteCollection = $true + PeopleEditorOnlyResolveWithinSiteCollection = $true + SearchActiveDirectoryDomains = $searchADdom } } $returnval = $returnval | Add-Member -MemberType ScriptMethod -Name Update -Value { @@ -260,42 +264,43 @@ try WebAppUrl = "http://sharepoint.contoso.com" SearchActiveDirectoryDomains = @( (New-CimInstance -ClassName MSFT_SPWebAppPPSearchDomain -Property @{ - FQDN = "contoso.intra" - IsForest = $false - AccessAccount = (New-CimInstance -ClassName MSFT_Credential ` - -Property @{ - Username = [string]$mockAccount.UserName; - Password = [string]$mockAccount.Password; - } ` - -Namespace root/microsoft/windows/desiredstateconfiguration ` - -ClientOnly) - } -ClientOnly) + FQDN = "contoso.intra" + IsForest = $false + AccessAccount = (New-CimInstance -ClassName MSFT_Credential ` + -Property @{ + Username = [string]$mockAccount.UserName; + Password = [string]$mockAccount.Password; + } ` + -Namespace root/microsoft/windows/desiredstateconfiguration ` + -ClientOnly) + } -ClientOnly) ) } Mock -CommandName Get-SPWebApplication -MockWith { $searchADdom = New-Object -TypeName "System.Collections.Generic.List[System.Object]" $searchDom1 = New-Object -TypeName "Object" | ` - Add-Member -MemberType NoteProperty ` - -Name DomainName ` - -Value ( "contoso.intra" ) -PassThru | ` - Add-Member -MemberType NoteProperty ` - -Name IsForest ` - -Value ( $false ) -PassThru | ` - Add-Member -MemberType NoteProperty ` - -Name LoginName ` - -Value ( $mockAccount.UserName ) -PassThru + Add-Member -MemberType NoteProperty ` + -Name DomainName ` + -Value ( "contoso.intra" ) -PassThru | ` + Add-Member -MemberType NoteProperty ` + -Name IsForest ` + -Value ( $false ) -PassThru | ` + Add-Member -MemberType NoteProperty ` + -Name LoginName ` + -Value ( $mockAccount.UserName ) -PassThru $searchADdom.Add($searchDom1) $returnval = @{ PeoplePickerSettings = @{ - ActiveDirectoryCustomFilter = "()" - ActiveDirectoryCustomQuery = "()" - ActiveDirectorySearchTimeout = @{ + ActiveDirectoryCustomFilter = "()" + ActiveDirectoryCustomQuery = "()" + ActiveDirectorySearchTimeout = @{ TotalSeconds = 10 } - OnlySearchWithinSiteCollection = $true - SearchActiveDirectoryDomains = $searchADdom + OnlySearchWithinSiteCollection = $true + PeopleEditorOnlyResolveWithinSiteCollection = $true + SearchActiveDirectoryDomains = $searchADdom } } $returnval = $returnval | Add-Member -MemberType ScriptMethod -Name Update -Value { @@ -329,13 +334,14 @@ try Mock -CommandName Get-SPWebApplication -MockWith { $returnval = @{ PeoplePickerSettings = @{ - ActiveDirectoryCustomFilter = $null - ActiveDirectoryCustomQuery = $null - ActiveDirectorySearchTimeout = @{ + ActiveDirectoryCustomFilter = $null + ActiveDirectoryCustomQuery = $null + ActiveDirectorySearchTimeout = @{ TotalSeconds = 30 } - OnlySearchWithinSiteCollection = $false - SearchActiveDirectoryDomains = @() + OnlySearchWithinSiteCollection = $false + PeopleEditorOnlyResolveWithinSiteCollection = $true + SearchActiveDirectoryDomains = @() } } $returnval = $returnval | Add-Member -MemberType ScriptMethod -Name Update -Value { From 091aeb5d0968af5636625dcfd9e130f16bc2b43c Mon Sep 17 00:00:00 2001 From: Yorick Kuijs Date: Thu, 10 Feb 2022 13:30:58 +0100 Subject: [PATCH 4/5] Fixing #1375 --- CHANGELOG.md | 3 +++ RequiredModules.psd1 | 2 +- .../DSCResources/MSFT_SPLogLevel/MSFT_SPLogLevel.psm1 | 2 +- .../Modules/SharePointDsc.Util/SharePointDsc.Util.psm1 | 4 ++-- SharePointDsc/SharePointDsc.psd1 | 7 +------ .../Unit/SharePointDsc/SharePointDsc.SPLogLevel.Tests.ps1 | 4 ++-- .../SharePointDsc/SharePointDsc.SPWebAppPolicy.Tests.ps1 | 2 +- .../SharePointDsc/SharePointDsc.SPWebApplication.Tests.ps1 | 4 ++-- 8 files changed, 13 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92e29a596..261d1ec1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- SharePointDsc + - Updated ReverseDsc version requirement to 2.0.0.10 to fix an issue + with Exporting an array of CIM instances - SPFarm - Suppress a useless reboot that was triggered once a server joined the farm - Suppress a useless 5 minutes sleep triggered once a server joined the farm diff --git a/RequiredModules.psd1 b/RequiredModules.psd1 index 1ea9b203e..61b6d83b9 100644 --- a/RequiredModules.psd1 +++ b/RequiredModules.psd1 @@ -26,5 +26,5 @@ xWebAdministration = '3.1.0' # Required for Export of Config - ReverseDSC = "2.0.0.7" + ReverseDSC = "2.0.0.10" } diff --git a/SharePointDsc/DSCResources/MSFT_SPLogLevel/MSFT_SPLogLevel.psm1 b/SharePointDsc/DSCResources/MSFT_SPLogLevel/MSFT_SPLogLevel.psm1 index 8839ddedc..78528f039 100644 --- a/SharePointDsc/DSCResources/MSFT_SPLogLevel/MSFT_SPLogLevel.psm1 +++ b/SharePointDsc/DSCResources/MSFT_SPLogLevel/MSFT_SPLogLevel.psm1 @@ -405,7 +405,7 @@ function Export-TargetResource $currentBlock = Convert-DSCStringParamToVariable -DSCBlock $currentBlock -ParameterName "PsDscRunAsCredential" # Change hashtable format into CIM Instance format - $currentBlock = $currentBlock -replace "@{", "`r`n MSFT_SPLogLevelItem {" -replace '}', '},' -replace ',\);', "`r`n );" -replace '(\w+)=', '$1="' -replace '; ', '"; ' -replace '}', '"}' + $currentBlock = $currentBlock -replace "@{", "`r`n MSFT_SPLogLevelItem {" -replace '\);', "`r`n );" -replace '(\w+)=', '$1="' -replace '; ', '"; ' -replace '}', '"}' $PartialContent += $currentBlock $PartialContent += " }`r`n" diff --git a/SharePointDsc/Modules/SharePointDsc.Util/SharePointDsc.Util.psm1 b/SharePointDsc/Modules/SharePointDsc.Util/SharePointDsc.Util.psm1 index 4616e9901..a4d13b065 100644 --- a/SharePointDsc/Modules/SharePointDsc.Util/SharePointDsc.Util.psm1 +++ b/SharePointDsc/Modules/SharePointDsc.Util/SharePointDsc.Util.psm1 @@ -1582,8 +1582,8 @@ function Export-SPConfiguration $BinaryLocation ) - $reverseDSCVersion = [Version]"2.0.0.7" - $reverseDSCModule = Get-Module ReverseDsc -ListAvailable | Where-Object -FilterScript { $_.Version -eq $reverseDSCVersion } + $reverseDSCVersion = [Version]"2.0.0.10" + $reverseDSCModule = Get-Module ReverseDsc -ListAvailable | Where-Object -FilterScript { $_.Version -ge $reverseDSCVersion } if ($null -eq $reverseDSCModule) { Write-Host "[ERROR} ReverseDsc v$($reverseDSCVersion.ToString()) could not be found. Make sure you have this module installed before running this cmdlet!" -ForegroundColor Red diff --git a/SharePointDsc/SharePointDsc.psd1 b/SharePointDsc/SharePointDsc.psd1 index b23d28db9..cdf92a3ff 100644 --- a/SharePointDsc/SharePointDsc.psd1 +++ b/SharePointDsc/SharePointDsc.psd1 @@ -48,12 +48,7 @@ # ProcessorArchitecture = '' # Modules that must be imported into the global environment prior to importing this module - # RequiredModules = @( - # @{ - # ModuleName = "ReverseDSC" - # RequiredVersion = "2.0.0.7" - # } - # ) + # RequiredModules = @() # Assemblies that must be loaded prior to importing this module # RequiredAssemblies = @() diff --git a/tests/Unit/SharePointDsc/SharePointDsc.SPLogLevel.Tests.ps1 b/tests/Unit/SharePointDsc/SharePointDsc.SPLogLevel.Tests.ps1 index ac896144f..c5fe85f9a 100644 --- a/tests/Unit/SharePointDsc/SharePointDsc.SPLogLevel.Tests.ps1 +++ b/tests/Unit/SharePointDsc/SharePointDsc.SPLogLevel.Tests.ps1 @@ -49,7 +49,7 @@ try InModuleScope -ModuleName $script:DSCResourceFullName -ScriptBlock { Describe -Name $Global:SPDscHelper.DescribeHeader -Fixture { BeforeAll { - Invoke-Command -ScriptBlock $Global:SPDscHelper.InitializeScript -NoNewScope + Invoke-Command -Scriptblock $Global:SPDscHelper.InitializeScript -NoNewScope # Mocks for all contexts Mock -CommandName Set-SPLogLevel -MockWith { } @@ -966,7 +966,7 @@ try Name = "Export"; PsDscRunAsCredential = $Credsspfarm; SPLogLevelSetting = @( - MSFT_SPLogLevelItem {TraceLevel="Default"; Name="Administration"; EventLevel="Default"; Area="Access Services"}, + MSFT_SPLogLevelItem {TraceLevel="Default"; Name="Administration"; EventLevel="Default"; Area="Access Services"} MSFT_SPLogLevelItem {TraceLevel="Default"; Name="General"; EventLevel="Default"; Area="SharePoint Server"} ); } diff --git a/tests/Unit/SharePointDsc/SharePointDsc.SPWebAppPolicy.Tests.ps1 b/tests/Unit/SharePointDsc/SharePointDsc.SPWebAppPolicy.Tests.ps1 index 4694c6b99..1a3bafb30 100644 --- a/tests/Unit/SharePointDsc/SharePointDsc.SPWebAppPolicy.Tests.ps1 +++ b/tests/Unit/SharePointDsc/SharePointDsc.SPWebAppPolicy.Tests.ps1 @@ -1768,7 +1768,7 @@ try Username = 'contoso\\user1' PermissionLevel = 'Full Control' ActAsSystemAccount = \$True - }, + } MSFT_SPWebPolicyPermissions { Username = 'contoso\\Group 1' PermissionLevel = 'Full Read' diff --git a/tests/Unit/SharePointDsc/SharePointDsc.SPWebApplication.Tests.ps1 b/tests/Unit/SharePointDsc/SharePointDsc.SPWebApplication.Tests.ps1 index 71abe6c99..e6fc32b0e 100644 --- a/tests/Unit/SharePointDsc/SharePointDsc.SPWebApplication.Tests.ps1 +++ b/tests/Unit/SharePointDsc/SharePointDsc.SPWebApplication.Tests.ps1 @@ -50,7 +50,7 @@ try InModuleScope -ModuleName $script:DSCResourceFullName -ScriptBlock { Describe -Name $Global:SPDscHelper.DescribeHeader -Fixture { BeforeAll { - Invoke-Command -ScriptBlock $Global:SPDscHelper.InitializeScript -NoNewScope + Invoke-Command -Scriptblock $Global:SPDscHelper.InitializeScript -NoNewScope # Initialize tests try @@ -1949,7 +1949,7 @@ try MSFT_SPWebAppSiteDataServers { Zone = 'Default' Uri = 'http://spbackend' - }, + } MSFT_SPWebAppSiteDataServers { Zone = 'Intranet' Uri = 'http://spbackend2' From 4b5e6fc9becd6914f9eb36837885398fedce5f61 Mon Sep 17 00:00:00 2001 From: Yorick Kuijs Date: Thu, 10 Feb 2022 15:08:34 +0100 Subject: [PATCH 5/5] Fixed failed HQRMtests --- .../Contributing-to-SharePointDsc.md | 16 +- .../Creating-Configuration-Files.md | 10 +- ...ed-the-configured-MaxEnvelopeSize-quota.md | 2 +- .../Export-SharePoint-Configuration.md | 2 +- SharePointDsc/WikiSource/Getting-Started.md | 2 +- SharePointDsc/WikiSource/Home.md | 12 +- ...dules-for-SharePoint-DSC-configurations.md | 4 +- SharePointDsc/WikiSource/Prerequisites.md | 2 +- ...essions-and-the-InstallAccount-variable.md | 2 +- .../WikiSource/Understanding-Resources.md | 260 +++++++++--------- .../Using-CredSSP-on-a-Domain-Controller.md | 2 +- ...n-configurations-that-use-SharePointDsc.md | 2 +- SharePointDsc/WikiSource/_Footer.md | 2 +- SharePointDsc/WikiSource/_Sidebar.md | 24 +- 14 files changed, 171 insertions(+), 171 deletions(-) diff --git a/SharePointDsc/WikiSource/Contributing-to-SharePointDsc.md b/SharePointDsc/WikiSource/Contributing-to-SharePointDsc.md index 2b6abf54c..0e46dc73d 100644 --- a/SharePointDsc/WikiSource/Contributing-to-SharePointDsc.md +++ b/SharePointDsc/WikiSource/Contributing-to-SharePointDsc.md @@ -12,14 +12,14 @@ The Get-TargetResource function should not return $null as a result. It may, how ```PowerShell function Get-TargetResource { - $nullreturn = @{ - ServiceAppName = $ServiceAppName - Name = $Name - RequestLimit = $null - WaitTime = $null - Ensure = "Absent" - } - return $nullreturn + $nullreturn = @{ + ServiceAppName = $ServiceAppName + Name = $Name + RequestLimit = $null + WaitTime = $null + Ensure = "Absent" + } + return $nullreturn } ``` diff --git a/SharePointDsc/WikiSource/Creating-Configuration-Files.md b/SharePointDsc/WikiSource/Creating-Configuration-Files.md index 55eed79e1..50545474e 100644 --- a/SharePointDsc/WikiSource/Creating-Configuration-Files.md +++ b/SharePointDsc/WikiSource/Creating-Configuration-Files.md @@ -10,7 +10,7 @@ a number of components that are common across all deployments. When describing a configuration for a SharePoint Server, there are a number of common components that are likely to exist in every configuration. Namely the components related to the installation of the product - -[SPInstallPreReqs](SPInstallPreReqs) and [SPInstall](SPInstall). +_[SPInstallPreReqs](SPInstallPreReqs)_ and _[SPInstall](SPInstall)_. It is also important to understand how the SharePointDsc resources impersonate and communicate with the SharePoint PowerShell cmdlet's. @@ -18,8 +18,8 @@ For PowerShell 5 (which we recommend) you should use the PsDscRunAsCredential pr the account a resource should run as. However for PowerShell 4 this is not an option, and the InstallAccount option is to be used in that situation, which relies on creating a local PowerShell session that uses CredSSP authentication. -This means you are likely to want to use the xCredSSP resources also (see [Remote sessions and -the InstallAccount variable](Remote-sessions-and-the-InstallAccount-variable)) for more information +This means you are likely to want to use the xCredSSP resources also (see _[Remote sessions and +the InstallAccount variable](Remote-sessions-and-the-InstallAccount-variable)_) for more information on this). There are also a limited number of scenario's in SharePointDsc that will always use this CredSSP approach (such as provisioning the user profile sync service) so it is recommended that even if @@ -31,8 +31,8 @@ The single server deployment is the most straightforward - you will have one con that will describe all of the components that you want to have on that server. This is not likely to be a production deployment, but more a development or testing server. The specifics of what you put in to this configuration are largely up to what you want this server -to be running, but you will always include [SPFarm](SPFarm) to create the farm, and -[SPDistributedCacheService](SPDistributedCacheService) to enable the distributed cache service +to be running, but you will always include _[SPFarm](SPFarm)_ to create the farm, and +_[SPDistributedCacheService](SPDistributedCacheService)_ to enable the distributed cache service in the farm. The rest can be as little or as detailed as you need it to be in order to achieve your desired configuration. diff --git a/SharePointDsc/WikiSource/Error-Exceeded-the-configured-MaxEnvelopeSize-quota.md b/SharePointDsc/WikiSource/Error-Exceeded-the-configured-MaxEnvelopeSize-quota.md index 38026be47..bccffae11 100644 --- a/SharePointDsc/WikiSource/Error-Exceeded-the-configured-MaxEnvelopeSize-quota.md +++ b/SharePointDsc/WikiSource/Error-Exceeded-the-configured-MaxEnvelopeSize-quota.md @@ -24,4 +24,4 @@ Change the network profile to Domain or Private in order to change the setting. ## More information More information about the MaxEnvelopeSize can be found at: * https://msdn.microsoft.com/en-us/library/cc251449.aspx -* https://msdn.microsoft.com/en-us/library/aa384372%28VS.85%29.aspx \ No newline at end of file +* https://msdn.microsoft.com/en-us/library/aa384372%28VS.85%29.aspx diff --git a/SharePointDsc/WikiSource/Export-SharePoint-Configuration.md b/SharePointDsc/WikiSource/Export-SharePoint-Configuration.md index 66c5be394..6de2da5de 100644 --- a/SharePointDsc/WikiSource/Export-SharePoint-Configuration.md +++ b/SharePointDsc/WikiSource/Export-SharePoint-Configuration.md @@ -15,7 +15,7 @@ That is why Nik Charlebois created [ReverseDsc](https://www.powershellgallery.co This module offers generic functionalities to generate DSC configurations and requires a technology specific orchestrator script to export the data. -> For a [Full list](Understanding-Resources) of what can be extracted have a look at our Included Resources section. +> For a _[Full list](Understanding-Resources)_ of what can be extracted have a look at our Included Resources section. Since SharePointDsc v4.5, this orchestrator script (and therefore ReverseDsc support) has been natively integrated into SharePointDsc. diff --git a/SharePointDsc/WikiSource/Getting-Started.md b/SharePointDsc/WikiSource/Getting-Started.md index 53e786147..7a5483887 100644 --- a/SharePointDsc/WikiSource/Getting-Started.md +++ b/SharePointDsc/WikiSource/Getting-Started.md @@ -18,4 +18,4 @@ This is useful in various scenarios, but can become complex depending how broad It's entirely possible that DSC is the right fit for you , and that there is a learning / discipline requirement. Or a Gap in your knowledge/ experience this Getting Started section is designed to help you. -More information on PowerShell Desired State Configuration in general, can be found [here](https://docs.microsoft.com/en-us/powershell/scripting/dsc/overview/overview). \ No newline at end of file +More information on PowerShell Desired State Configuration in general, can be found [here](https://docs.microsoft.com/en-us/powershell/scripting/dsc/overview/overview). diff --git a/SharePointDsc/WikiSource/Home.md b/SharePointDsc/WikiSource/Home.md index 1320ccca2..ac8864aab 100644 --- a/SharePointDsc/WikiSource/Home.md +++ b/SharePointDsc/WikiSource/Home.md @@ -4,7 +4,7 @@ SharePointDsc v#.#.# Here you will find all the information you need to make use of the SharePoint DSC resources, including details of the resources that are available, current capabilities and known issues, and information to help plan a DSC based implementation of SharePoint. -Please leave comments, feature requests, and bug reports in the [issues section](../issues) for this module. +Please leave comments, feature requests, and bug reports in the [issues section](https://github.com/dsccommunity/SharePointDsc/issues) for this module. ## Quick start @@ -17,7 +17,7 @@ To confirm installation, run the below command and ensure you see the SharePoint Get-DscResource -Module SharePointDsc -To view a more detailed explanation, view our [Getting Started](Getting-Started) page. +To view a more detailed explanation, view our _[Getting Started](Getting-Started)_ page. ## Supported SharePoint versions @@ -36,11 +36,11 @@ SharePointDsc currently supports: ## Known Issues There are some known issues (and their solutions/workarounds) with SharePointDsc or PowerShell: -[Error Exceeded the configured MaxEnvelopeSize quota](Error-Exceeded-the-configured-MaxEnvelopeSize-quota) +_[Error Exceeded the configured MaxEnvelopeSize quota](Error-Exceeded-the-configured-MaxEnvelopeSize-quota)_ -[Setting up Central Administration on HTTPS](Setting-up-Central-Administration-on-HTTPS) +_[Setting up Central Administration on HTTPS](Setting-up-Central-Administration-on-HTTPS)_ -[Using CredSSP on a domain controller / single server farm](Using-CredSSP-on-a-Domain-Controller) +_[Using CredSSP on a domain controller / single server farm](Using-CredSSP-on-a-Domain-Controller)_ ## Multilingual support @@ -55,4 +55,4 @@ Resources inside the SharePointDSC module are categorized into 4 main groups. - Distributed Resources - Utility Resources -To understand how to use these resources in your Configuration to avoid Syntax and undesired results go to our [Understanding Resources](Understanding-Resources) section. +To understand how to use these resources in your Configuration to avoid Syntax and undesired results go to our _[Understanding Resources](Understanding-Resources)_ section. diff --git a/SharePointDsc/WikiSource/Other-useful-modules-for-SharePoint-DSC-configurations.md b/SharePointDsc/WikiSource/Other-useful-modules-for-SharePoint-DSC-configurations.md index 41de5c92a..73ae997ac 100644 --- a/SharePointDsc/WikiSource/Other-useful-modules-for-SharePoint-DSC-configurations.md +++ b/SharePointDsc/WikiSource/Other-useful-modules-for-SharePoint-DSC-configurations.md @@ -19,9 +19,9 @@ These resources can manage site configuring for tasks such as bindings, or remov Available at [https://www.powershellgallery.com/packages/xCredSSP](https://www.powershellgallery.com/packages/xCredSSP) -The xCredSSP module is a simple way to automate CredSSP configuration. See [Remote sessions and the InstallAccount variable](Remote-sessions-and-the-InstallAccount-variable) for more information on this. +The xCredSSP module is a simple way to automate CredSSP configuration. See _[Remote sessions and the InstallAccount variable](Remote-sessions-and-the-InstallAccount-variable)_ for more information on this. -## SchannelDsc +## SChannelDsc Available at [https://www.powershellgallery.com/packages/SchannelDsc](https://www.powershellgallery.com/packages/SchannelDsc) diff --git a/SharePointDsc/WikiSource/Prerequisites.md b/SharePointDsc/WikiSource/Prerequisites.md index 8b5a854c4..a20879a70 100644 --- a/SharePointDsc/WikiSource/Prerequisites.md +++ b/SharePointDsc/WikiSource/Prerequisites.md @@ -5,6 +5,6 @@ To use DSC on earlier versions of Windows, install the Windows Management Framew However it is strongly recommended that PowerShell 5.0 (or above) is used, as it adds support for the PsDscRunAsCredential parameter and has overall better performance and troubleshooting capabilities. -The logic behind this is explained on the page "[Remote sessions and the InstallAccount variable](Remote-sessions-and-the-InstallAccount-variable)" page. +The logic behind this is explained on the page _[Remote sessions and the InstallAccount variable](Remote-sessions-and-the-InstallAccount-variable)_ page. [PowerShell 5.1](https://www.microsoft.com/en-us/download/details.aspx?id=54616) includes significant improvements in Desired State Configuration and PowerShell Script Debugging. diff --git a/SharePointDsc/WikiSource/Remote-sessions-and-the-InstallAccount-variable.md b/SharePointDsc/WikiSource/Remote-sessions-and-the-InstallAccount-variable.md index 6eefdabd4..02d0da40c 100644 --- a/SharePointDsc/WikiSource/Remote-sessions-and-the-InstallAccount-variable.md +++ b/SharePointDsc/WikiSource/Remote-sessions-and-the-InstallAccount-variable.md @@ -36,7 +36,7 @@ This removes the need to have InstallAccount on SharePointDsc resources. However The SharePointDsc resources will detect if they are running as the local system account or not and will only use a "remote" session as described above where it is needed. Also note that some resources in SharePointDsc still use the above described remote session technique to simulate other others regardless of whether or not PsDscRunAsCredential is used. -An example of this is [SPUserProfileSyncService](SPUserProfileSyncService) which uses this approach to run as the farm account value. +An example of this is _[SPUserProfileSyncService](SPUserProfileSyncService)_ which uses this approach to run as the farm account value. An example of how to use this property in PowerShell 5 is shown below: diff --git a/SharePointDsc/WikiSource/Understanding-Resources.md b/SharePointDsc/WikiSource/Understanding-Resources.md index 77c9cf39d..ca1ea656c 100644 --- a/SharePointDsc/WikiSource/Understanding-Resources.md +++ b/SharePointDsc/WikiSource/Understanding-Resources.md @@ -22,138 +22,138 @@ The SharePointDsc module includes the following DSC resources |Resource|Type|Requires CredSSP| |--|--|--| -|[SPAccessServiceApp](SPAccessServiceApp) | Distributed | - | -|[SPAccessServices2010](SPAccessServices2010) | Distributed | - | -|[SPAlternateUrl](SPAlternateUrl) | Distributed | - | -|[SPAntivirusSettings](SPAntivirusSettings) | Distributed | - | -|[SPAppCatalog](SPAppCatalog) | Distributed | Yes | -|[SPAppDomain](SPAppDomain) | Distributed | - | -|[SPAppManagementServiceApp](SPAppManagementServiceApp) | Distributed | - | -|[SPAppStoreSettings](SPAppStoreSettings) | Distributed | - | -|[SPAuthenticationRealm](SPAuthenticationRealm) | Distributed | - | -|[SPAzureAccessControlServiceAppProxy](SPAzureAccessControlServiceAppProxy) | Distributed | - | -|[SPBCSServiceApp](SPBCSServiceApp) | Distributed | - | -|[SPBlobCacheSettings](SPBlobCacheSettings) | Specific | - | -|[SPCacheAccounts](SPCacheAccounts) | Distributed | - | -|[SPCertificate](SPCertificate) | Distributed | - | -|[SPCertificateSettings](SPCertificate) | Distributed | - | -|[SPConfigWizard](SPConfigWizard) | Utility | - | -|[SPContentDatabase](SPContentDatabase) | Distributed | - | -|[SPDatabaseAAG](SPDatabaseAAG) | Distributed | - | -|[SPDesignerSettings](SPDesignerSettings) | Distributed | - | -|[SPDiagnosticLoggingSettings](SPDiagnosticLoggingSettings) | Distributed | - | -|[SPDiagnosticsProvider](SPDiagnosticsProvider) | Distributed | - | -|[SPDistributedCacheClientSettings](SPDistributedCacheClientSettings) | Distributed | - | -|[SPDistributedCacheService](SPDistributedCacheService) | Specific | - | -|[SPDocIcon](SPDocIcon) | Common | - | -|[SPExcelServiceApp](SPExcelServiceApp) | Distributed | - | -|[SPFarm](SPFarm) | Specific | - | -|[SPFarmAdministrators](SPFarmAdministrators) | Distributed | - | -|[SPFarmPropertyBag](SPFarmPropertyBag) | Distributed | - | -|[SPFarmSolution](SPFarmSolution) | Distributed | - | -|[SPFeature](SPFeature) | Distributed | - | -|[SPHealthAnalyzerRuleState](SPHealthAnalyzerRuleState) | Distributed | - | -|[SPIncomingEmailSettings](SPIncomingEmailSettings) | Distributed | - | -|[SPInfoPathFormsServiceConfig](SPInfoPathFormsServiceConfig) | Distributed | - | -|[SPInstall](SPInstall) | Common | - | -|[SPInstallLanguagePack](SPInstallLanguagePack) | Common | - | -|[SPInstallPrereqs](SPInstallPrereqs) | Common | - | -|[SPIrmSettings](SPIrmSettings) | Distributed | - | -|[SPLogLevel](SPLogLevel) | Distributed | - | -|[SPMachineTranslationServiceApp](SPMachineTranslationServiceApp) | Distributed | - | -|[SPManagedAccount](SPManagedAccount) | Distributed | - | -|[SPManagedMetaDataServiceApp](SPManagedMetaDataServiceApp) | Distributed | - | -|[SPManagedMetaDataServiceAppDefault](SPManagedMetaDataServiceAppDefault) | Distributed | - | -|[SPManagedPath](SPManagedPath) | Distributed | - | -|[SPMinRoleCompliance](SPMinRoleCompliance) | Utility | - | -|[SPOAppPrincipalMgmtServiceAppProxy](SPOAppPrincipalMgmtServiceAppProxy) | Distributed | - | -|[SPOfficeOnlineServerBinding](SPOfficeOnlineServerBinding) | Distributed | - | -|[SPOfficeOnlineServerSupressionSettings](SPOfficeOnlineServerSupressionSettings) | Distributed | - | -|[SPOutgoingEmailSettings](SPOutgoingEmailSettings) | Distributed | - | -|[SPPasswordChangeSettings](SPPasswordChangeSettings) | Distributed | - | -|[SPPerformancePointServiceApp](SPPerformancePointServiceApp) | Distributed | - | -|[SPPowerPointAutomationServiceApp](SPPowerPointAutomationServiceApp) | Distributed | - | -|[SPProductUpdate](SPProductUpdate) | Common | - | -|[SPProjectServerAdditionalSettings](SPProjectServerAdditionalSettings) | Distributed | - | -|[SPProjectServerADResourcePoolSync](SPProjectServerADResourcePoolSync) | Distributed | - | -|[SPProjectServerGlobalPermissions](SPProjectServerGlobalPermissions) | Distributed | - | -|[SPProjectServerGroup](SPProjectServerGroup) | Distributed | - | -|[SPProjectServerLicense](SPProjectServerLicense) | Distributed | - | -|[SPProjectServerPermissionMode](SPProjectServerPermissionMode) | Distributed | - | -|[SPProjectServerServiceApp](SPProjectServerServiceApp) | Distributed | - | -|[SPProjectServerTimeSheetSettings](SPProjectServerTimeSheetSettings) | Distributed | - | -|[SPProjectServerUserSyncSettings](SPProjectServerUserSyncSettings) | Distributed | - | -|[SPProjectServerWssSettings](SPProjectServerWssSettings) | Distributed | - | -|[SPPublishServiceApplication](SPPublishServiceApplication) | Distributed | - | -|[SPQuotaTemplate](SPQuotaTemplate) | Distributed | - | -|[SPRemoteFarmTrust](SPRemoteFarmTrust) | Distributed | - | -|[SPSearchAuthoritivePage](SPSearchAuthoritivePage) | Distributed | - | -|[SPSearchContentSource](SPSearchContentSource) | Distributed | - | -|[SPSearchCrawlerImpactRule](SPSearchCrawlerImpactRule) | Distributed | - | -|[SPSearchCrawlMapping](SPSearchCrawlMapping) | Distributed | - | -|[SPSearchCrawlRule](SPSearchCrawlRule) | Distributed | - | -|[SPSearchFileType](SPSearchFileType) | Distributed | - | -|[SPSearchIndexPartition](SPSearchIndexPartition) | Distributed | - | -|[SPSearchManagedProperty](SPSearchManagedProperty) | Distributed | - | -|[SPSearchMetadataCategory](SPSearchMetadataCategory) | Distributed | - | -|[SPSearchResultSource](SPSearchResultSource) | Distributed | - | -|[SPSearchServiceApp](SPSearchServiceApp) | Distributed | - | -|[SPSearchServiceSettings](SPSearchServiceSettings) | Distributed | - | -|[SPSearchTopology](SPSearchTopology) | Distributed | - | -|[SPSecureStoreServiceApp](SPSecureStoreServiceApp) | Distributed | - | -|[SPSecurityTokenServiceConfig](SPSecurityTokenServiceConfig) | Distributed | - | -|[SPSelfServiceSiteCreation](SPSelfServiceSiteCreation) | Distributed | - | -|[SPService](SPService) | Distributed | - | -|[SPServiceAppPool](SPServiceAppPool) | Distributed | - | -|[SPServiceAppProxyGroup](SPServiceAppProxyGroup) | Distributed | - | -|[SPServiceAppSecurity](SPServiceAppSecurity) | Distributed | - | -|[SPServiceIdentity](SPServiceIdentity) | Distributed | - | -|[SPServiceInstance](SPServiceInstance) | Specific | - | -|[SPSessionStateService](SPSessionStateService) | Distributed | - | -|[SPShellAdmins](SPShellAdmins) | Distributed | - | -|[SPSite](SPSite) | Distributed | - | -|[SPSitePropertyBag](SPSitePropertyBag) | Distributed | - | -|[SPSiteUrl](SPSiteUrl) | Distributed | - | -|[SPStateServiceApp](SPStateServiceApp) | Distributed | - | -|[SPSubscriptionSettingsServiceApp](SPSubscriptionSettingsServiceApp) | Distributed | - | -|[SPTimerJobState](SPTimerJobState) | Distributed | - | -|[SPTrustedIdentityTokenIssuer](SPTrustedIdentityTokenIssuer) | Distributed | - | -|[SPTrustedIdentityTokenIssuerProviderRealms](SPTrustedIdentityTokenIssuerProviderRealms) | Distributed | - | -|[SPTrustedRootAuthority](SPTrustedRootAuthority) | Distributed | - | -|[SPTrustedSecurityTokenIssuer](SPTrustedSecurityTokenIssuer) | Distributed | - | -|[SPUsageApplication](SPUsageApplication) | Distributed | - | -|[SPUsageDefinition](SPUsageDefinition) | Distributed | - | -|[SPUserProfileProperty](SPUserProfileProperty) | Distributed | - | -|[SPUserProfileSection](SPUserProfileSection) | Distributed | - | -|[SPUserProfileServiceApp](SPUserProfileServiceApp) | Distributed | - | Yes | -|[SPUserProfileServiceAppPermissions](SPUserProfileServiceAppPermissions) | Distributed | - | -|[SPUserProfileSyncConnection](SPUserProfileSyncConnection) | Distributed | - | -|[SPUserProfileSyncService](SPUserProfileSyncService) | Specific | Yes | -|[SPVisioServiceApp](SPVisioServiceApp) | Distributed | - | -|[SPWeb](SPWeb) | Distributed | - | -|[SPWebAppAuthentication](SPWebAppAuthentication) | Distributed | - | -|[SPWebAppBlockedFileTypes](SPWebAppBlockedFileTypes) | Distributed | - | -|[SPWebAppClientCallableSettings](SPWebAppClientCallableSettings) | Distributed | - | -|[SPWebAppGeneralSettings](SPWebAppGeneralSettings) | Distributed | - | -|[SPWebAppHttpThrottlingMonitor](SPWebAppHttpThrottlingMonitor) | Distributed | - | -|[SPWebApplication](SPWebApplication) | Distributed | - | -|[SPWebApplicationAppDomain](SPWebApplicationAppDomain) | Distributed | - | -|[SPWebApplicationExtension](SPWebApplicationExtension) | Distributed | - | -|[SPWebAppPeoplePickerSettings](SPWebAppPeoplePickerSettings) | Distributed | - | -|[SPWebAppPermissions](SPWebAppPermissions) | Distributed | - | -|[SPWebAppPolicy](SPWebAppPolicy) | Distributed | - | -|[SPWebAppPropertyBag](SPWebAppPropertyBag) | Distributed | - | -|[SPWebAppProxyGroup](SPWebAppProxyGroup) | Distributed | - | -|[SPWebAppSiteUseAndDeletion](SPWebAppSiteUseAndDeletion) | Distributed | - | -|[SPWebAppSuiteBar](SPWebAppSuiteBar) | Distributed | - | -|[SPWebAppThrottlingSettings](SPWebAppThrottlingSettings) | Distributed | - | -|[SPWebAppWorkflowSettings](SPWebAppWorkflowSettings) | Distributed | - | -|[SPWordAutomationServiceApp](SPWordAutomationServiceApp) | Distributed | - | -|[SPWorkflowService](SPWorkflowService) | Distributed | - | -|[SPWorkManagementServiceApp](SPWorkManagementServiceApp) | Distributed | - | +|_[SPAccessServiceApp](SPAccessServiceApp)_ | Distributed | - | +|_[SPAccessServices2010](SPAccessServices2010)_ | Distributed | - | +|_[SPAlternateUrl](SPAlternateUrl)_ | Distributed | - | +|_[SPAntivirusSettings](SPAntivirusSettings)_ | Distributed | - | +|_[SPAppCatalog](SPAppCatalog)_ | Distributed | Yes | +|_[SPAppDomain](SPAppDomain)_ | Distributed | - | +|_[SPAppManagementServiceApp](SPAppManagementServiceApp)_ | Distributed | - | +|_[SPAppStoreSettings](SPAppStoreSettings)_ | Distributed | - | +|_[SPAuthenticationRealm](SPAuthenticationRealm)_ | Distributed | - | +|_[SPAzureAccessControlServiceAppProxy](SPAzureAccessControlServiceAppProxy)_ | Distributed | - | +|_[SPBCSServiceApp](SPBCSServiceApp)_ | Distributed | - | +|_[SPBlobCacheSettings](SPBlobCacheSettings)_ | Specific | - | +|_[SPCacheAccounts](SPCacheAccounts)_ | Distributed | - | +|_[SPCertificate](SPCertificate)_ | Distributed | - | +|_[SPCertificateSettings](SPCertificate)_ | Distributed | - | +|_[SPConfigWizard](SPConfigWizard)_ | Utility | - | +|_[SPContentDatabase](SPContentDatabase)_ | Distributed | - | +|_[SPDatabaseAAG](SPDatabaseAAG)_ | Distributed | - | +|_[SPDesignerSettings](SPDesignerSettings)_ | Distributed | - | +|_[SPDiagnosticLoggingSettings](SPDiagnosticLoggingSettings)_ | Distributed | - | +|_[SPDiagnosticsProvider](SPDiagnosticsProvider)_ | Distributed | - | +|_[SPDistributedCacheClientSettings](SPDistributedCacheClientSettings)_ | Distributed | - | +|_[SPDistributedCacheService](SPDistributedCacheService)_ | Specific | - | +|_[SPDocIcon](SPDocIcon)_ | Common | - | +|_[SPExcelServiceApp](SPExcelServiceApp)_ | Distributed | - | +|_[SPFarm](SPFarm)_ | Specific | - | +|_[SPFarmAdministrators](SPFarmAdministrators)_ | Distributed | - | +|_[SPFarmPropertyBag](SPFarmPropertyBag)_ | Distributed | - | +|_[SPFarmSolution](SPFarmSolution)_ | Distributed | - | +|_[SPFeature](SPFeature)_ | Distributed | - | +|_[SPHealthAnalyzerRuleState](SPHealthAnalyzerRuleState)_ | Distributed | - | +|_[SPIncomingEmailSettings](SPIncomingEmailSettings)_ | Distributed | - | +|_[SPInfoPathFormsServiceConfig](SPInfoPathFormsServiceConfig)_ | Distributed | - | +|_[SPInstall](SPInstall)_ | Common | - | +|_[SPInstallLanguagePack](SPInstallLanguagePack)_ | Common | - | +|_[SPInstallPrereqs](SPInstallPrereqs)_ | Common | - | +|_[SPIrmSettings](SPIrmSettings)_ | Distributed | - | +|_[SPLogLevel](SPLogLevel)_ | Distributed | - | +|_[SPMachineTranslationServiceApp](SPMachineTranslationServiceApp)_ | Distributed | - | +|_[SPManagedAccount](SPManagedAccount)_ | Distributed | - | +|_[SPManagedMetaDataServiceApp](SPManagedMetaDataServiceApp)_ | Distributed | - | +|_[SPManagedMetaDataServiceAppDefault](SPManagedMetaDataServiceAppDefault)_ | Distributed | - | +|_[SPManagedPath](SPManagedPath)_ | Distributed | - | +|_[SPMinRoleCompliance](SPMinRoleCompliance)_ | Utility | - | +|_[SPOAppPrincipalMgmtServiceAppProxy](SPOAppPrincipalMgmtServiceAppProxy)_ | Distributed | - | +|_[SPOfficeOnlineServerBinding](SPOfficeOnlineServerBinding)_ | Distributed | - | +|_[SPOfficeOnlineServerSupressionSettings](SPOfficeOnlineServerSupressionSettings)_ | Distributed | - | +|_[SPOutgoingEmailSettings](SPOutgoingEmailSettings)_ | Distributed | - | +|_[SPPasswordChangeSettings](SPPasswordChangeSettings)_ | Distributed | - | +|_[SPPerformancePointServiceApp](SPPerformancePointServiceApp)_ | Distributed | - | +|_[SPPowerPointAutomationServiceApp](SPPowerPointAutomationServiceApp)_ | Distributed | - | +|_[SPProductUpdate](SPProductUpdate)_ | Common | - | +|_[SPProjectServerAdditionalSettings](SPProjectServerAdditionalSettings)_ | Distributed | - | +|_[SPProjectServerADResourcePoolSync](SPProjectServerADResourcePoolSync)_ | Distributed | - | +|_[SPProjectServerGlobalPermissions](SPProjectServerGlobalPermissions)_ | Distributed | - | +|_[SPProjectServerGroup](SPProjectServerGroup)_ | Distributed | - | +|_[SPProjectServerLicense](SPProjectServerLicense)_ | Distributed | - | +|_[SPProjectServerPermissionMode](SPProjectServerPermissionMode)_ | Distributed | - | +|_[SPProjectServerServiceApp](SPProjectServerServiceApp)_ | Distributed | - | +|_[SPProjectServerTimeSheetSettings](SPProjectServerTimeSheetSettings)_ | Distributed | - | +|_[SPProjectServerUserSyncSettings](SPProjectServerUserSyncSettings)_ | Distributed | - | +|_[SPProjectServerWssSettings](SPProjectServerWssSettings)_ | Distributed | - | +|_[SPPublishServiceApplication](SPPublishServiceApplication)_ | Distributed | - | +|_[SPQuotaTemplate](SPQuotaTemplate)_ | Distributed | - | +|_[SPRemoteFarmTrust](SPRemoteFarmTrust)_ | Distributed | - | +|_[SPSearchAuthoritivePage](SPSearchAuthoritivePage)_ | Distributed | - | +|_[SPSearchContentSource](SPSearchContentSource)_ | Distributed | - | +|_[SPSearchCrawlerImpactRule](SPSearchCrawlerImpactRule)_ | Distributed | - | +|_[SPSearchCrawlMapping](SPSearchCrawlMapping)_ | Distributed | - | +|_[SPSearchCrawlRule](SPSearchCrawlRule)_ | Distributed | - | +|_[SPSearchFileType](SPSearchFileType)_ | Distributed | - | +|_[SPSearchIndexPartition](SPSearchIndexPartition)_ | Distributed | - | +|_[SPSearchManagedProperty](SPSearchManagedProperty)_ | Distributed | - | +|_[SPSearchMetadataCategory](SPSearchMetadataCategory)_ | Distributed | - | +|_[SPSearchResultSource](SPSearchResultSource)_ | Distributed | - | +|_[SPSearchServiceApp](SPSearchServiceApp)_ | Distributed | - | +|_[SPSearchServiceSettings](SPSearchServiceSettings)_ | Distributed | - | +|_[SPSearchTopology](SPSearchTopology)_ | Distributed | - | +|_[SPSecureStoreServiceApp](SPSecureStoreServiceApp)_ | Distributed | - | +|_[SPSecurityTokenServiceConfig](SPSecurityTokenServiceConfig)_ | Distributed | - | +|_[SPSelfServiceSiteCreation](SPSelfServiceSiteCreation)_ | Distributed | - | +|_[SPService](SPService)_ | Distributed | - | +|_[SPServiceAppPool](SPServiceAppPool)_ | Distributed | - | +|_[SPServiceAppProxyGroup](SPServiceAppProxyGroup)_ | Distributed | - | +|_[SPServiceAppSecurity](SPServiceAppSecurity)_ | Distributed | - | +|_[SPServiceIdentity](SPServiceIdentity)_ | Distributed | - | +|_[SPServiceInstance](SPServiceInstance)_ | Specific | - | +|_[SPSessionStateService](SPSessionStateService)_ | Distributed | - | +|_[SPShellAdmins](SPShellAdmins)_ | Distributed | - | +|_[SPSite](SPSite)_ | Distributed | - | +|_[SPSitePropertyBag](SPSitePropertyBag)_ | Distributed | - | +|_[SPSiteUrl](SPSiteUrl)_ | Distributed | - | +|_[SPStateServiceApp](SPStateServiceApp)_ | Distributed | - | +|_[SPSubscriptionSettingsServiceApp](SPSubscriptionSettingsServiceApp)_ | Distributed | - | +|_[SPTimerJobState](SPTimerJobState)_ | Distributed | - | +|_[SPTrustedIdentityTokenIssuer](SPTrustedIdentityTokenIssuer)_ | Distributed | - | +|_[SPTrustedIdentityTokenIssuerProviderRealms](SPTrustedIdentityTokenIssuerProviderRealms)_ | Distributed | - | +|_[SPTrustedRootAuthority](SPTrustedRootAuthority)_ | Distributed | - | +|_[SPTrustedSecurityTokenIssuer](SPTrustedSecurityTokenIssuer)_ | Distributed | - | +|_[SPUsageApplication](SPUsageApplication)_ | Distributed | - | +|_[SPUsageDefinition](SPUsageDefinition)_ | Distributed | - | +|_[SPUserProfileProperty](SPUserProfileProperty)_ | Distributed | - | +|_[SPUserProfileSection](SPUserProfileSection)_ | Distributed | - | +|_[SPUserProfileServiceApp](SPUserProfileServiceApp)_ | Distributed | - | Yes | +|_[SPUserProfileServiceAppPermissions](SPUserProfileServiceAppPermissions)_ | Distributed | - | +|_[SPUserProfileSyncConnection](SPUserProfileSyncConnection)_ | Distributed | - | +|_[SPUserProfileSyncService](SPUserProfileSyncService)_ | Specific | Yes | +|_[SPVisioServiceApp](SPVisioServiceApp)_ | Distributed | - | +|_[SPWeb](SPWeb)_ | Distributed | - | +|_[SPWebAppAuthentication](SPWebAppAuthentication)_ | Distributed | - | +|_[SPWebAppBlockedFileTypes](SPWebAppBlockedFileTypes)_ | Distributed | - | +|_[SPWebAppClientCallableSettings](SPWebAppClientCallableSettings)_ | Distributed | - | +|_[SPWebAppGeneralSettings](SPWebAppGeneralSettings)_ | Distributed | - | +|_[SPWebAppHttpThrottlingMonitor](SPWebAppHttpThrottlingMonitor)_ | Distributed | - | +|_[SPWebApplication](SPWebApplication)_ | Distributed | - | +|_[SPWebApplicationAppDomain](SPWebApplicationAppDomain)_ | Distributed | - | +|_[SPWebApplicationExtension](SPWebApplicationExtension)_ | Distributed | - | +|_[SPWebAppPeoplePickerSettings](SPWebAppPeoplePickerSettings)_ | Distributed | - | +|_[SPWebAppPermissions](SPWebAppPermissions)_ | Distributed | - | +|_[SPWebAppPolicy](SPWebAppPolicy)_ | Distributed | - | +|_[SPWebAppPropertyBag](SPWebAppPropertyBag)_ | Distributed | - | +|_[SPWebAppProxyGroup](SPWebAppProxyGroup)_ | Distributed | - | +|_[SPWebAppSiteUseAndDeletion](SPWebAppSiteUseAndDeletion)_ | Distributed | - | +|_[SPWebAppSuiteBar](SPWebAppSuiteBar)_ | Distributed | - | +|_[SPWebAppThrottlingSettings](SPWebAppThrottlingSettings)_ | Distributed | - | +|_[SPWebAppWorkflowSettings](SPWebAppWorkflowSettings)_ | Distributed | - | +|_[SPWordAutomationServiceApp](SPWordAutomationServiceApp)_ | Distributed | - | +|_[SPWorkflowService](SPWorkflowService)_ | Distributed | - | +|_[SPWorkManagementServiceApp](SPWorkManagementServiceApp)_ | Distributed | - | ## Using the Script resource in configurations with SharePointDsc Check-out this [article](Using-the-Script-resource-in-configurations-that-use-SharePointDsc) if you want to use the Script resource to implement custom functionality that is not included in SharePointDsc. -> Of course you can also create an issue in the issue list to request the functionality to be added. Sharing code that you already have will greatly speed up the development effort. \ No newline at end of file +> Of course you can also create an issue in the issue list to request the functionality to be added. Sharing code that you already have will greatly speed up the development effort. diff --git a/SharePointDsc/WikiSource/Using-CredSSP-on-a-Domain-Controller.md b/SharePointDsc/WikiSource/Using-CredSSP-on-a-Domain-Controller.md index e97fd215d..44635e555 100644 --- a/SharePointDsc/WikiSource/Using-CredSSP-on-a-Domain-Controller.md +++ b/SharePointDsc/WikiSource/Using-CredSSP-on-a-Domain-Controller.md @@ -22,4 +22,4 @@ setspn -S wsman/server1.domain.com server1 setspn -S wsman/server1 server1 ``` -After configuring these SPNs, CredSSP will run as expected again! \ No newline at end of file +After configuring these SPNs, CredSSP will run as expected again! diff --git a/SharePointDsc/WikiSource/Using-the-Script-resource-in-configurations-that-use-SharePointDsc.md b/SharePointDsc/WikiSource/Using-the-Script-resource-in-configurations-that-use-SharePointDsc.md index 6ef142ac0..82d2606d3 100644 --- a/SharePointDsc/WikiSource/Using-the-Script-resource-in-configurations-that-use-SharePointDsc.md +++ b/SharePointDsc/WikiSource/Using-the-Script-resource-in-configurations-that-use-SharePointDsc.md @@ -16,4 +16,4 @@ Script SPDscExample } ``` -If you need to pass a credential or additional arguments, you can use the -Credential and -Arguments parameters for these purposes also. \ No newline at end of file +If you need to pass a credential or additional arguments, you can use the -Credential and -Arguments parameters for these purposes also. diff --git a/SharePointDsc/WikiSource/_Footer.md b/SharePointDsc/WikiSource/_Footer.md index f7b23b61f..825189b8f 100644 --- a/SharePointDsc/WikiSource/_Footer.md +++ b/SharePointDsc/WikiSource/_Footer.md @@ -1 +1 @@ -![SharePointDSC](media/footer.png "SharePointDsc") \ No newline at end of file +![SharePointDSC](media/footer.png "SharePointDsc") diff --git a/SharePointDsc/WikiSource/_Sidebar.md b/SharePointDsc/WikiSource/_Sidebar.md index adfcc0ddd..de65a4118 100644 --- a/SharePointDsc/WikiSource/_Sidebar.md +++ b/SharePointDsc/WikiSource/_Sidebar.md @@ -1,14 +1,14 @@ # SharePointDsc Module -- [Home](Home) -- [Getting Started](Getting-Started) -- [Pre-requisites](Prerequisites) -- [Installing the module](Installing-the-module) -- [Exporting SharePoint Configuration](Export-SharePoint-Configuration) -- [Creating Configuration Files](Creating-Configuration-Files) -- [Pre-created Examples](https://github.com/dsccommunity/SharePointDsc/tree/master/SharePointDsc/Examples) -- [Creating an Azure development environment](Creating-an-Azure-development-environment) -- [Understanding Resources & Syntax](Understanding-Resources) -- [Remote PowerShell Authentication](Remote-sessions-and-the-InstallAccount-variable) -- [Contributing to SharePointDsc](Contributing-to-SharePointDsc) -- [Other useful modules for SharePoint DSC configurations](Other-useful-modules-for-SharePoint-DSC-configurations) +- _[Home](Home)_ +- _[Getting Started](Getting-Started)_ +- _[Pre-requisites](Prerequisites)_ +- _[Installing the module](Installing-the-module)_ +- _[Exporting SharePoint Configuration](Export-SharePoint-Configuration)_ +- _[Creating Configuration Files](Creating-Configuration-Files)_ +- _[Pre-created Examples](https://github.com/dsccommunity/SharePointDsc/tree/master/SharePointDsc/Examples)_ +- _[Creating an Azure development environment](Creating-an-Azure-development-environment)_ +- _[Understanding Resources & Syntax](Understanding-Resources)_ +- _[Remote PowerShell Authentication](Remote-sessions-and-the-InstallAccount-variable)_ +- _[Contributing to SharePointDsc](Contributing-to-SharePointDsc)_ +- _[Other useful modules for SharePoint DSC configurations](Other-useful-modules-for-SharePoint-DSC-configurations)_