diff --git a/CHANGELOG.md b/CHANGELOG.md index 933cad25f..10df7e97e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - Added `Get-PnPFlowOwner` cmdlet which allows retrieving the owners of a Power Automate flow [#3314](https://github.com/pnp/powershell/pull/3314) - Added `-AvailableForTagging` to `Set-PnPTerm` which allows the available for tagging property on a Term to be set [#3321](https://github.com/pnp/powershell/pull/3321) - Added `Get-PnPPowerPlatformConnector` cmdlet which allows for all custom connectors to be retrieved [#3309](https://github.com/pnp/powershell/pull/3309) +- Added `Get-PnPTenantInfo` which allows retrieving tenant information by its Id or domain name [#3414](https://github.com/pnp/powershell/pull/3414) - Added option to create a Microsft 365 Group with dynamic membership by passing in `-DynamicMembershipRule` ### Fixed diff --git a/documentation/Get-PnPTenantInfo.md b/documentation/Get-PnPTenantInfo.md new file mode 100644 index 000000000..dcdb9dbd5 --- /dev/null +++ b/documentation/Get-PnPTenantInfo.md @@ -0,0 +1,126 @@ +--- +Module Name: PnP.PowerShell +title: Get-PnPTenantInfo +schema: 2.0.0 +applicable: SharePoint Online +external help file: PnP.PowerShell.dll-Help.xml +online version: https://pnp.github.io/powershell/cmdlets/Get-PnPTenantInfo.html +--- + +# Get-PnPTenantInfo + +## SYNOPSIS +Gets information about any tenant + +## SYNTAX + +### Current Tenant (default) +```powershell +Get-PnPTenantInfo [-Verbose] +``` + +### By TenantId +```powershell +Get-PnPTenantInfo -TenantId [-Verbose] +``` + +### By Domain Name +```powershell +Get-PnPTenantInfo -DomainName [-Verbose] +``` + +## DESCRIPTION + +Gets the tenantId, federation brand name, company name and default domain name regarding a specific tenant. If no Domain name or Tenant id is specified, it returns the Tenant Info of the currently connected to tenant. + +## EXAMPLES + +### EXAMPLE 1 +```powershell +Get-PnPTenantInfo -TenantId "e65b162c-6f87-4eb1-a24e-1b37d3504663" +``` + +Returns the tenant information of the specified TenantId. + +### EXAMPLE 2 +```powershell +Get-PnPTenantInfo -DomainName "contoso.com" +``` + +Returns the Tenant Information for the tenant connected to the domain contoso.com. + +### EXAMPLE 3 +```powershell +Get-PnPTenantInfo +``` + +Returns Tenant Information of the currently connected to tenant. + +### EXAMPLE 4 +```powershell +Get-PnPTenantInfo -CurrentTenant +``` + +Returns Tenant Information of the currently connected to tenant. + +## PARAMETERS + +### -CurrentTenant +Gets the Tenant Information of the currently connected to tenant. + +```yaml +Type: SwitchParameter +Parameter Sets: GETINFOOFCURRENTTENANT + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -DomainName +The Domain name of the tenant to lookup. You can use the onmicrosoft.com domain name such as "contoso.onmicrosoft.com" or use any domain that is connected to the tenant, i.e. "contoso.com". + +```yaml +Type: String +Parameter Sets: GETINFOBYTDOMAINNAME + +Required: False +Position: Named +Default value: Production +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -TenantId +The id of the tenant to retrieve the information about + +```yaml +Type: String +Parameter Sets: GETINFOBYTENANTID + +Required: true +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -Verbose +When provided, additional debug statements will be shown while executing the cmdlet. + +```yaml +Type: SwitchParameter +Parameter Sets: (All) + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +## RELATED LINKS + +[Microsoft 365 Patterns and Practices](https://aka.ms/m365pnp) \ No newline at end of file diff --git a/src/Commands/Admin/GetTenantInfo.cs b/src/Commands/Admin/GetTenantInfo.cs new file mode 100644 index 000000000..eed560c45 --- /dev/null +++ b/src/Commands/Admin/GetTenantInfo.cs @@ -0,0 +1,69 @@ +using Microsoft.SharePoint.Client; +using PnP.PowerShell.Commands.Base; +using PnP.PowerShell.Commands.Utilities.REST; +using System; +using System.Management.Automation; + +namespace PnP.PowerShell.Commands.Admin +{ + [Cmdlet(VerbsCommon.Get, "PnPTenantInfo")] + [OutputType(typeof(Model.TenantInfo))] + public class GetTenantInfo : PnPAdminCmdlet + { + private const string GETINFOBYTDOMAINNAME = "By Domain Name"; + private const string GETINFOBYTENANTID = "By TenantId"; + private const string GETINFOOFCURRENTTENANT = "Current Tenant"; + + [Parameter(Mandatory = false, ParameterSetName = GETINFOOFCURRENTTENANT)] + public SwitchParameter CurrentTenant; + + [Parameter(Mandatory = true, ParameterSetName = GETINFOBYTDOMAINNAME)] + public string DomainName; + + [Parameter(Mandatory = true, ParameterSetName = GETINFOBYTENANTID)] + public string TenantId; + + protected override void ExecuteCmdlet() + { + if ((ParameterSetName == GETINFOBYTDOMAINNAME && TenantId != null) || (ParameterSetName == GETINFOBYTENANTID && DomainName != null)) + { + throw new PSArgumentException("Specify either DomainName or TenantId, but not both."); + } + + WriteVerbose("Acquiring access token for Microsoft Graph to look up Tenant"); + var graphAccessToken = TokenHandler.GetAccessToken(this, $"https://{Connection.GraphEndPoint}/.default", Connection); + var requestUrl = BuildRequestUrl(); + + WriteVerbose($"Making call to {requestUrl} to request tenant information"); + var results = RestHelper.GetAsync(Connection.HttpClient, requestUrl, graphAccessToken).GetAwaiter().GetResult(); + WriteObject(results, true); + } + + private string BuildRequestUrl() + { + var baseUrl = $"https://{Connection.GraphEndPoint}/v1.0/tenantRelationships/"; + var query = string.Empty; + switch (ParameterSetName) + { + case GETINFOBYTDOMAINNAME: + query = $"microsoft.graph.findTenantInformationByDomainName(domainName='{DomainName}')"; + break; + case GETINFOBYTENANTID: + query = $"microsoft.graph.findTenantInformationByTenantId(tenantId='{TenantId}')"; + break; + case GETINFOOFCURRENTTENANT: + if (Connection != null) + { + string tenantId = TenantExtensions.GetTenantIdByUrl(Connection.Url, Connection.AzureEnvironment).ToString(); + query = $"microsoft.graph.findTenantInformationByTenantId(tenantId='{tenantId}')"; + } + else + { + throw new InvalidOperationException($"The current connection holds no SharePoint context. Please use one of the Connect-PnPOnline commands which uses the -Url argument to connect."); + } + break; + } + return baseUrl + query; + } + } +} diff --git a/src/Commands/Model/TenantInfo.cs b/src/Commands/Model/TenantInfo.cs new file mode 100644 index 000000000..fa9395cce --- /dev/null +++ b/src/Commands/Model/TenantInfo.cs @@ -0,0 +1,30 @@ +using System; + +namespace PnP.PowerShell.Commands.Model +{ + /// + /// Contains information regarding a tenant + /// + public class TenantInfo + { + /// + /// Unique identifier of the tenant + /// + public Guid? TenantId { get; set; } + + /// + /// The name of the string value shown to users when signing in to Entra ID + /// + public string FederationBrandName { get; set; } + + /// + /// The company name shown in places such as the admin portal + /// + public string DisplayName { get; set; } + + /// + /// The default domain name set on the tenant + /// + public string DefaultDomainName { get; set; } + } +}