Traditionelle Nerdio Manager-Bereitstellungen sollten den Schritten und Anweisungen in unserem Installationshandbuch folgen. Weitere Informationen finden Sie im Nerdio Manager Installationshandbuch. Die hier beschriebenen erweiterten Installationsmethoden sollten nur in spezifischen, gerechtfertigten Situationen verwendet werden.
Warnung
Dies ist eine erweiterte, benutzerdefinierte Installation von Nerdio Manager, die nur für besondere Umstände empfohlen wird. Bitte verwenden Sie dies mit dem Rat und der Anleitung des Nerdio-Support. Bitte kontaktieren Sie uns bei Fragen unter nme.support@getnerdio.com.
Anmerkung
Updates für Nerdio Manager erfordern die Ausführung von Cloud Shell- oder PowerShell-Skripten. Siehe Aktualisieren der Nerdio Manager Anwendung für Details.
Anmerkung
Die PowerShell-Skripte in diesem Artikel verwenden das Microsoft Graph PowerShell SDK, das in Azure Cloud Shell vorinstalliert ist. Wenn Sie die Skripte außerhalb von Azure Cloud Shell ausführen möchten, installieren Sie zuerst die erforderlichen Module: Install-Module Microsoft.Graph.Authentication, Microsoft.Graph.Applications, Microsoft.Graph.Users -Scope CurrentUser. Jedes Skript meldet sich mit Connect-MgGraph an und fordert die benötigten Berechtigungen an. Melden Sie sich als der für diesen Abschnitt beschriebene Admin an.
Erweiterte Installationsschritte zum manuellen Erstellen der Nerdio Manager-Anwendung in Entra ID
-
Azure Marketplace-Bereitstellung (durch den Abonnement-Owner abgeschlossen).
-
Entra ID-Anwendungsregistrierung und -einrichtung (abgeschlossen durch den globalen Admin oder Administrator für privilegierte Rollen in Kombination mit Cloud Application Administrator).
-
Azure-Ressourcenkonfiguration (durch den Abonnement-Owner abgeschlossen).
Lesen Sie Alle Schritte in einem Skript ausführen, um die Schritte für die Entra ID-Anwendung in einem einzigen Durchlauf abzuschließen.
Das folgende Verfahren erstellt die Anwendung und einen Dienstprinzipal.
So erstellen Sie die Anwendung und einen Dienstprinzipal:
-
Navigieren Sie im Azure-Portal zu Microsoft Entra ID > App-Registrierungen > Registrierung.
-
Geben Sie die folgenden Informationen ein:
-
Name: nerdio-nmw-app (benennen Sie die Standardanwendung optional um)
-
Kontotyp: 'Konten nur in diesem Organisations-Directory (einzelner Tenant)'
-
Umleitungs-URL: Web, https://<app_service_name>.azurewebsites.net/
-
-
Speichern Sie die Anwendungs-ID. (Wird für das Nerdio Manager Deployment bereitgestellt.)
-
Navigieren Sie zu Microsoft Entra ID > App-Registrierungen > Alle Anwendungen > nerdio-nmw-app (oder benutzerdefinierter Anwendungsname) > Authentifizierung.
-
Geben Sie die folgenden Informationen ein:
-
Redirect URLs > Add URL: https://<app_service_name>.azurewebsites.net/signin-oidc
-
Front-Channel-Abmelde-URL: https://<app_service_name>.azurewebsites.net/signout-oidc
-
Implizite Gewährung und hybride Flows: Wählen Sie Zugriffstoken und ID-Token nicht aus.
-
-
Navigieren Sie zu Microsoft Entra ID > Unternehmensanwendungen > Alle Anwendungen > nerdio-nmw-app (oder benutzerdefinierter App-Name)
-
Speichern Sie die Objekt-ID. (Wird für das Nerdio Manager Deployment bereitgestellt.)
-
Alternativ führt das folgende PowerShell-Skript diese Änderungen durch:
$webAppName = "" # REQUIRED: Name of app service provisioned in marketplace deployment $appName = "nerdio-nmw-app" # Optionally rename the default application Connect-MgGraph -Scopes "Application.ReadWrite.All" $webAppUrl = 'https://' + $webAppName + '.azurewebsites.net/' $loginUrl = $webAppUrl + 'signin-oidc' $logoutUrl = $webAppUrl + 'signout-oidc' $application = New-MgApplication -DisplayName $appName -SignInAudience "AzureADMyOrg" -Web @{ HomePageUrl = $webAppUrl LogoutUrl = $logoutUrl RedirectUris = @($webAppUrl, $loginUrl) ImplicitGrantSettings = @{ EnableAccessTokenIssuance = $false; EnableIdTokenIssuance = $false } } $servicePrincipal = New-MgServicePrincipal -AppId $application.AppId -AppRoleAssignmentRequired:$true -Tags @("WindowsAzureActiveDirectoryIntegratedApp") Write-Host "Application ID to be saved in to app service: $($application.AppId)" Write-Host "Service Principal ID to be provided to Nerdio Manager deployment: $($servicePrincipal.Id)"
Das folgende Verfahren konfiguriert die Anwendungsrollen und weist den AVD-Administrator zu.
Anmerkung
Die App-Rollen erfordern eine spezifische ID, die jeder Rolle zugewiesen werden muss. Der Rollenname, die Beschreibung und die ID können der App-Registrierung durch Ändern des App-Manifests hinzugefügt werden.
So konfigurieren Sie App-Rollen und weisen den AVD-Administrator zu:
-
Navigieren Sie im Azure-Portal zu Microsoft Entra ID > App-Registrierungen > Alle Anwendungen > nerdio-nmw-app (oder benutzerdefinierter Anwendungsname) > Manifest.
-
Ersetzen Sie den Eintrag \"appRoles\": [] (normalerweise in Zeile 8) durch den folgenden Wert:
"appRoles": [ { "allowedMemberTypes": [ "User" ], "description": "Complete access to all areas of NMW.", "displayName": "WVD Admin", "id": "d1c2ade8-98f8-45fd-aa4a-6d06b947c66f", "isEnabled": true, "origin": "Application", "value": "WvdAdmin" }, { "allowedMemberTypes": [ "User" ], "description": "Complete access to User sessions, ability to view Host Pools, hosts and restart them, but no ability to add/remove or change any settings.", "displayName": "Desktop Admin", "id": "ed0cdef0-4267-4470-bfff-5e0b6944f9e4", "isEnabled": true, "origin": "Application", "value": "DesktopAdmin" }, { "allowedMemberTypes": [ "User" ], "description": "Complete access to User sessions only.", "displayName": "Help Desk", "id": "a94e83da-b314-4232-b8c8-94508c5ed533", "isEnabled": true, "origin": "Application", "value": "HelpDesk" }, { "allowedMemberTypes": [ "User" ], "description": "View access to all areas of NMW; no ability to save or make changes.", "displayName": "Reviewer", "id": "0a1b7425-f55a-44a6-9caa-b9a5cc9448da", "isEnabled": true, "origin": "Application", "value": "Reviewer" }, { "allowedMemberTypes": [ "User" ], "description": "View & manage own sessions (Message, Log off, Disconnect). Personal desktop users can restart, power off and power their personal desktops.", "displayName": "End-user", "id": "e856de81-1e53-486a-8668-7d564866ae39", "isEnabled": true, "origin": "Application", "value": "EndUser" }, { "allowedMemberTypes": [ "Application" ], "description": "Rest client description", "displayName": "Rest client display name", "id": "3807160f-e77a-4fcf-959a-df572bcc3767", "isEnabled": true, "origin": "Application", "value": "RestClient" } ], -
Wählen Sie Speichern.
-
Bestätigen Sie unter App-Rollen, dass jede Rolle verfügbar ist.
-
Navigieren Sie zu Microsoft Entra ID > Unternehmensanwendungen > Alle Anwendungen > nerdio-nmw-app (oder benutzerdefinierter Anwendungsname) > Eigenschaften.
-
Stellen Sie sicher, dass die Option Für User sichtbar? auf Ja gesetzt ist.
-
Navigieren Sie zu Microsoft Entra ID > Unternehmensanwendungen > Alle Anwendungen > nerdio-nmw-app (oder benutzerdefinierter App-Name) > User und Gruppen > User/Gruppe hinzufügen.
-
Geben Sie die folgenden Informationen ein:
-
User und Gruppen: Wählen und suchen Sie den User aus, der die Nerdio Manager Bereitstellung im Azure-Portal durchführt.
-
Rolle auswählen: Wählen Sie aus der Dropdown-Liste WVD Admin aus.
-
-
Sobald Sie alle erforderlichen Informationen eingegeben haben, wählen Sie Speichern.
-
Alternativ führt das folgende PowerShell-Skript diese Änderungen durch:
$userPrincipalName = "" # REQUIRED: Fill in UPN of subscription owner completing Nerdio Manager deployment $appName = "nerdio-nmw-app" # Optionally rename the default application Connect-MgGraph -Scopes "Application.ReadWrite.All","AppRoleAssignment.ReadWrite.All","User.Read.All" function BuildAppRole([string] $displayName, [string] $value, [Guid] $id, [string] $description) { return @{ AllowedMemberTypes = @("User") Description = $description DisplayName = $displayName Id = $id IsEnabled = $true Value = $value } } function GetNewAppRoles() { $reviewer = BuildAppRole -displayName "Reviewer" -value "Reviewer" -id "0a1b7425-f55a-44a6-9caa-b9a5cc9448da" -description "View access to all areas of NMW; no ability to save or make changes." $helpDesk = BuildAppRole -displayName "Help Desk" -value "HelpDesk" -id "a94e83da-b314-4232-b8c8-94508c5ed533" -description "Complete access to User sessions only." $endUser = BuildAppRole -displayName "End-user" -value "EndUser" -id "e856de81-1e53-486a-8668-7d564866ae39" -description "View & manage own sessions (Message, Log off, Disconnect). Personal desktop users can restart, power off and power their personal desktops." $desktopAdmin = BuildAppRole -displayName "Desktop Admin" -value "DesktopAdmin" -id "ed0cdef0-4267-4470-bfff-5e0b6944f9e4" -description "Complete access to User sessions, ability to view Host Pools, hosts and restart them, but no ability to add/remove or change any settings." $wvdAdmin = BuildAppRole -displayName "WVD Admin" -value "WvdAdmin" -id 'd1c2ade8-98f8-45fd-aa4a-6d06b947c66f' -description "Complete access to all areas of NMW." return @($reviewer, $helpDesk, $endUser, $desktopAdmin, $wvdAdmin) } $application = Get-MgApplication -Filter "displayName eq '$appName'" if (-not $application) { throw "No application found with the display name '$appName'. Check that the app registration exists and the name matches exactly." } if (@($application).Count -gt 1) { throw "More than one application found with the display name '$appName'. Resolve this manually before continuing." } $user = Get-MgUser -Filter "userPrincipalName eq '$userPrincipalName'" if (-not $user) { throw "No user found with the user principal name '$userPrincipalName'." } $servicePrincipal = Get-MgServicePrincipal -Filter "appId eq '$($application.AppId)'" Update-MgApplication -ApplicationId $application.Id -AppRoles (GetNewAppRoles) $wvdAdminRoleId = 'd1c2ade8-98f8-45fd-aa4a-6d06b947c66f' New-MgUserAppRoleAssignment -UserId $user.Id -PrincipalId $user.Id -ResourceId $servicePrincipal.Id -AppRoleId $wvdAdminRoleId
Das folgende Verfahren konfiguriert die API-Berechtigungen.
So konfigurieren Sie die API-Berechtigungen:
-
Navigieren Sie im Azure-Portal zu Microsoft Entra ID > App-Registrierungen > Alle Anwendungen > nerdio-nmw-app (oder benutzerdefinierter App-Name) > API-Berechtigungen.
-
Fügen Sie die folgenden Berechtigungen für Microsoft-APIs > Microsoft Graph > Delegierte Berechtigungen hinzu oder bestätigen Sie diese:
-
User.Read (im Standard enthalten)
-
User.ReadBasic.All
-
User.Read.All
-
Group.Read.All
-
GroupMember.Read.All
-
Application.Read.All
-
Organization.Read.All
-
AppRoleAssignment.ReadWrite.All
-
Application.ReadWrite.All
-
Mail.Send (optional zum Aktivieren von E-Mail-Benachrichtigungen)
-
offline_access
-
openid
-
Profil
-
-
Fügen Sie die folgenden Berechtigungen für Microsoft-APIs > Microsoft Graph > Anwendungsberechtigungen hinzu:
-
Group.Read.All
-
GroupMember.Read.All
-
Organization.Read.All
-
User.Read.All
-
-
Fügen Sie die folgenden Berechtigungen für Microsoft APIs > Azure Service Management > Delegierte Berechtigungen hinzu:
-
user_impersonation
-
-
(Nur für WVD Classic) APIs, die meine Organisation verwendet > Windows Virtual Desktop (Anwendungs-ID 5a0aa725-4958-4b0c-80a9-34562e23f3b7):
-
Fügen Sie delegierte Berechtigungen hinzu: user_impersonation
-
Anwendungsberechtigungen hinzufügen: TenantCreator
-
-
Alternativ führt das folgende PowerShell-Skript diese Änderungen durch:
$appName = "nerdio-nmw-app" # Optionally rename the default application $wvdClassicEnabled = $False # Optionally include permissions for WVD Classic $readDelagatedPermissions = "User.Read|User.ReadBasic.All|User.Read.All|Group.Read.All|GroupMember.Read.All|Application.Read.All|Organization.Read.All" Connect-MgGraph -Scopes "Application.ReadWrite.All" function GetResourceAccess($servicePrincipal, [string]$requiredPermissions, [string]$permissionType) { if ($permissionType -eq "Scope") { $exposedPermissions = $servicePrincipal.Oauth2PermissionScopes } else { $exposedPermissions = $servicePrincipal.AppRoles } foreach ($permission in $requiredPermissions.Trim().Split("|")) { $match = $exposedPermissions | Where-Object { $_.Value -eq $permission } if ($match) { @{ Id = $match.Id; Type = $permissionType } } else { Write-Warning "Permission '$permission' (type '$permissionType') was not found on '$($servicePrincipal.DisplayName)' and was skipped." } } } function GetRequiredPermissions([string] $applicationId, [string] $requiredDelegatedPermissions, [string]$requiredApplicationPermissions) { $sp = Get-MgServicePrincipal -Filter "appId eq '$applicationId'" if (-not $sp) { throw "No service principal found with application ID '$applicationId' in this tenant." } $resourceAccess = @() if ($requiredDelegatedPermissions) { $resourceAccess += @(GetResourceAccess $sp $requiredDelegatedPermissions "Scope") } if ($requiredApplicationPermissions) { $resourceAccess += @(GetResourceAccess $sp $requiredApplicationPermissions "Role") } return @{ ResourceAppId = $applicationId; ResourceAccess = $resourceAccess } } $application = Get-MgApplication -Filter "displayName eq '$appName'" if (-not $application) { throw "No application found with the display name '$appName'. Check that the app registration exists and the name matches exactly." } if (@($application).Count -gt 1) { throw "More than one application found with the display name '$appName'. Resolve this manually before continuing." } $graphPermissions = GetRequiredPermissions -applicationId "00000003-0000-0000-c000-000000000000" -requiredDelegatedPermissions "$readDelagatedPermissions|AppRoleAssignment.ReadWrite.All|Application.ReadWrite.All|offline_access|openid|profile|Mail.Send" -requiredApplicationPermissions "Group.Read.All|GroupMember.Read.All|Organization.Read.All|User.Read.All" if ($wvdClassicEnabled) { $wvdClassicPermissions = GetRequiredPermissions -applicationId "5a0aa725-4958-4b0c-80a9-34562e23f3b7" -requiredDelegatedPermissions "user_impersonation" -requiredApplicationPermissions "TenantCreator" # Required for WVD classic only } $rmPermissions = GetRequiredPermissions -applicationId "797f4846-ba00-4fd7-ba43-dac1f8f63013" -requiredDelegatedPermissions "user_impersonation" # Windows Azure Service Management API $requiredResourcesAccess = @($graphPermissions, $rmPermissions) if ($wvdClassicEnabled) { $requiredResourcesAccess += $wvdClassicPermissions # Required for WVD classic only } Update-MgApplication -ApplicationId $application.Id -RequiredResourceAccess $requiredResourcesAccess
Das folgende Verfahren weist das User-Konto des Abonnementbesitzers als Owner für den Dienstprinzipal zu.
So weisen Sie den Abonnementbesitzer zu:
-
Navigieren Sie im Azure-Portal zu Microsoft Entra ID > Unternehmensanwendungen > Alle Anwendungen > nerdio-nmw-app (oder benutzerdefinierter App-Name) > Besitzer > Hinzufügen.
-
Suchen Sie nach dem Benutzerkonto, das Nerdio Manager über den Azure Marketplace bereitgestellt hat und die Installation abschließt, und wählen Sie Auswählen.
-
Alternativ führt das folgende PowerShell-Skript diese Änderungen durch:
$userPrincipalName = "" # REQUIRED: Fill in UPN of subscription owner completing Nerdio Manager deployment $appName = "nerdio-nmw-app" # Optionally rename the default application Connect-MgGraph -Scopes "Application.ReadWrite.All","User.Read.All" $application = Get-MgApplication -Filter "displayName eq '$appName'" if (-not $application) { throw "No application found with the display name '$appName'. Check that the app registration exists and the name matches exactly." } if (@($application).Count -gt 1) { throw "More than one application found with the display name '$appName'. Resolve this manually before continuing." } $user = Get-MgUser -Filter "userPrincipalName eq '$userPrincipalName'" if (-not $user) { throw "No user found with the user principal name '$userPrincipalName'." } $servicePrincipal = Get-MgServicePrincipal -Filter "appId eq '$($application.AppId)'" New-MgServicePrincipalOwnerByRef -ServicePrincipalId $servicePrincipal.Id -BodyParameter @{ "@odata.id" = "https://graph.microsoft.com/v1.0/directoryObjects/$($user.Id)" }
Das folgende Verfahren erteilt die Administratorzustimmung.
So erteilen Sie die Administratorzustimmung:
-
Navigieren Sie im Azure-Portal zu Microsoft Entra ID > App-Registrierungen > Alle Anwendungen > nerdio-nmw-app (oder benutzerdefinierter App-Name) > API-Berechtigungen.
-
Wählen Sie 'Administratorzustimmung für <tenant_name> erteilen'.
-
Wählen Sie 'Zustimmung im Namen meiner Organisation erteilen', falls Sie dazu aufgefordert werden.
-
Navigieren Sie zu Microsoft Entra ID > Unternehmensanwendungen > Alle Anwendungen > nerdio-nmw-app (oder benutzerdefinierter App-Name) > Berechtigungen.
-
Wählen Sie 'Administratorzustimmung für <tenant_name> erteilen'.
-
Wählen Sie 'Zustimmung im Namen meiner Organisation erteilen', falls Sie dazu aufgefordert werden.
-
Alternativ führt das folgende PowerShell-Skript diese Änderungen durch:
Anmerkung
Das Skript verwendet den Tenant, bei dem Sie sich anmelden. Es zeigt einen Link an, anstatt einen Browser zu öffnen, sodass Sie es auch in Azure Cloud Shell ausführen können. Öffnen Sie den Link in einem Webbrowser und melden Sie sich als globaler Admin an, um die Einwilligung zu erteilen.
$appName = "nerdio-nmw-app" # Optionally rename the default application $microsoftLogin = 'https://login.microsoftonline.com' Connect-MgGraph -Scopes "Application.Read.All" $tenantId = (Get-MgContext).TenantId $application = Get-MgApplication -Filter "displayName eq '$appName'" if (-not $application) { throw "No application found with the display name '$appName'. Check that the app registration exists and the name matches exactly." } if (@($application).Count -gt 1) { throw "More than one application found with the display name '$appName'. Resolve this manually before continuing." } $consentUrl = "$microsoftLogin/$tenantId/adminconsent?client_id=$($application.AppId)" Write-Host "Open the following link in a web browser and sign in as a Global Administrator to grant admin consent:" Write-Host $consentUrl
Als Alternative zum nacheinander Ausführen der oben genannten Abschnitte kann ein globaler Admin oder ein Admin für privilegierte Rollen in Kombination mit einem Cloud-Anwendungsadmin das folgende Skript einmal ausführen. Es führt alle Schritte von Anwendung und Dienstprinzipal erstellen bis Admin-Einwilligung erteilen aus. Es generiert kein Anwendungsgeheimnis; schließen Sie diesen Abschnitt separat ab.
So führen Sie alle Schritte in einem Skript aus
-
Öffnen Sie PowerShell oder Azure Cloud Shell.
-
Kopieren Sie das unten stehende Skript und geben Sie die erforderlichen Werte oben ein:
-
$webAppName: Der Name des App Service, der beim Marketplace-Deployment bereitgestellt wurde. -
$userPrincipalName: Der Benutzerprinzipalname (UPN) des Users, der für das Abonnement als Owner festgelegt ist und das Nerdio Manager-Deployment abschließt.
# ============================================ # Create the Nerdio Manager application in Entra ID (advanced install) # ============================================ # Run as a Global Administrator, or as a Privileged Role Administrator # combined with Cloud Application Administrator. # This script: # 1. Creates the application and a service principal. # 2. Configures the application roles and assigns the AVD admin. # 3. Configures the API permissions. # 4. Assigns the subscription owner as owner of the service principal. # 5. Displays the link for granting admin consent. # ============================================ # --- Settings --- $webAppName = "" # REQUIRED: Name of app service provisioned in marketplace deployment $userPrincipalName = "" # REQUIRED: UPN of the subscription owner completing the deployment $appName = "nerdio-nmw-app" # Optionally rename the default application $wvdClassicEnabled = $False # Optionally include permissions for WVD Classic $microsoftLogin = 'https://login.microsoftonline.com' $readDelagatedPermissions = "User.Read|User.ReadBasic.All|User.Read.All|Group.Read.All|GroupMember.Read.All|Application.Read.All|Organization.Read.All" # --- Sign in and check the settings before creating anything --- Connect-MgGraph -Scopes "Application.ReadWrite.All","AppRoleAssignment.ReadWrite.All","User.Read.All" $tenantId = (Get-MgContext).TenantId if (-not $webAppName -or -not $userPrincipalName) { throw "Fill in webAppName and userPrincipalName before running the script." } $user = Get-MgUser -Filter "userPrincipalName eq '$userPrincipalName'" if (-not $user) { throw "No user found with the user principal name '$userPrincipalName'." } if (Get-MgApplication -Filter "displayName eq '$appName'") { throw "An application named '$appName' already exists. Choose a different name or remove the existing application first." } # --- Step 1: Create the application and a service principal --- $webAppUrl = 'https://' + $webAppName + '.azurewebsites.net/' $loginUrl = $webAppUrl + 'signin-oidc' $logoutUrl = $webAppUrl + 'signout-oidc' $application = New-MgApplication -DisplayName $appName -SignInAudience "AzureADMyOrg" -Web @{ HomePageUrl = $webAppUrl LogoutUrl = $logoutUrl RedirectUris = @($webAppUrl, $loginUrl) ImplicitGrantSettings = @{ EnableAccessTokenIssuance = $false; EnableIdTokenIssuance = $false } } $servicePrincipal = New-MgServicePrincipal -AppId $application.AppId -AppRoleAssignmentRequired:$true -Tags @("WindowsAzureActiveDirectoryIntegratedApp") # Allow time for the new application and service principal to replicate Start-Sleep -Seconds 15 # --- Step 2: Configure application roles and assign the AVD admin --- function BuildAppRole([string] $displayName, [string] $value, [Guid] $id, [string] $description) { return @{ AllowedMemberTypes = @("User") Description = $description DisplayName = $displayName Id = $id IsEnabled = $true Value = $value } } function GetNewAppRoles() { $reviewer = BuildAppRole -displayName "Reviewer" -value "Reviewer" -id "0a1b7425-f55a-44a6-9caa-b9a5cc9448da" -description "View access to all areas of NMW; no ability to save or make changes." $helpDesk = BuildAppRole -displayName "Help Desk" -value "HelpDesk" -id "a94e83da-b314-4232-b8c8-94508c5ed533" -description "Complete access to User sessions only." $endUser = BuildAppRole -displayName "End-user" -value "EndUser" -id "e856de81-1e53-486a-8668-7d564866ae39" -description "View & manage own sessions (Message, Log off, Disconnect). Personal desktop users can restart, power off and power their personal desktops." $desktopAdmin = BuildAppRole -displayName "Desktop Admin" -value "DesktopAdmin" -id "ed0cdef0-4267-4470-bfff-5e0b6944f9e4" -description "Complete access to User sessions, ability to view Host Pools, hosts and restart them, but no ability to add/remove or change any settings." $wvdAdmin = BuildAppRole -displayName "WVD Admin" -value "WvdAdmin" -id 'd1c2ade8-98f8-45fd-aa4a-6d06b947c66f' -description "Complete access to all areas of NMW." return @($reviewer, $helpDesk, $endUser, $desktopAdmin, $wvdAdmin) } Update-MgApplication -ApplicationId $application.Id -AppRoles (GetNewAppRoles) $wvdAdminRoleId = 'd1c2ade8-98f8-45fd-aa4a-6d06b947c66f' New-MgUserAppRoleAssignment -UserId $user.Id -PrincipalId $user.Id -ResourceId $servicePrincipal.Id -AppRoleId $wvdAdminRoleId # --- Step 3: Configure API permissions --- function GetResourceAccess($servicePrincipal, [string]$requiredPermissions, [string]$permissionType) { if ($permissionType -eq "Scope") { $exposedPermissions = $servicePrincipal.Oauth2PermissionScopes } else { $exposedPermissions = $servicePrincipal.AppRoles } foreach ($permission in $requiredPermissions.Trim().Split("|")) { $match = $exposedPermissions | Where-Object { $_.Value -eq $permission } if ($match) { @{ Id = $match.Id; Type = $permissionType } } else { Write-Warning "Permission '$permission' (type '$permissionType') was not found on '$($servicePrincipal.DisplayName)' and was skipped." } } } function GetRequiredPermissions([string] $applicationId, [string] $requiredDelegatedPermissions, [string]$requiredApplicationPermissions) { $sp = Get-MgServicePrincipal -Filter "appId eq '$applicationId'" if (-not $sp) { throw "No service principal found with application ID '$applicationId' in this tenant." } $resourceAccess = @() if ($requiredDelegatedPermissions) { $resourceAccess += @(GetResourceAccess $sp $requiredDelegatedPermissions "Scope") } if ($requiredApplicationPermissions) { $resourceAccess += @(GetResourceAccess $sp $requiredApplicationPermissions "Role") } return @{ ResourceAppId = $applicationId; ResourceAccess = $resourceAccess } } $graphPermissions = GetRequiredPermissions -applicationId "00000003-0000-0000-c000-000000000000" -requiredDelegatedPermissions "$readDelagatedPermissions|AppRoleAssignment.ReadWrite.All|Application.ReadWrite.All|offline_access|openid|profile|Mail.Send" -requiredApplicationPermissions "Group.Read.All|GroupMember.Read.All|Organization.Read.All|User.Read.All" if ($wvdClassicEnabled) { $wvdClassicPermissions = GetRequiredPermissions -applicationId "5a0aa725-4958-4b0c-80a9-34562e23f3b7" -requiredDelegatedPermissions "user_impersonation" -requiredApplicationPermissions "TenantCreator" # Required for WVD classic only } $rmPermissions = GetRequiredPermissions -applicationId "797f4846-ba00-4fd7-ba43-dac1f8f63013" -requiredDelegatedPermissions "user_impersonation" # Windows Azure Service Management API $requiredResourcesAccess = @($graphPermissions, $rmPermissions) if ($wvdClassicEnabled) { $requiredResourcesAccess += $wvdClassicPermissions # Required for WVD classic only } Update-MgApplication -ApplicationId $application.Id -RequiredResourceAccess $requiredResourcesAccess # --- Step 4: Assign the subscription owner as owner of the service principal --- New-MgServicePrincipalOwnerByRef -ServicePrincipalId $servicePrincipal.Id -BodyParameter @{ "@odata.id" = "https://graph.microsoft.com/v1.0/directoryObjects/$($user.Id)" } # --- Step 5: Display the values to save and the admin consent link --- $consentUrl = "$microsoftLogin/$tenantId/adminconsent?client_id=$($application.AppId)" Write-Host "Application ID to be saved in to app service: $($application.AppId)" Write-Host "Service Principal ID to be provided to Nerdio Manager deployment: $($servicePrincipal.Id)" Write-Host "Open the following link in a web browser and sign in as a Global Administrator to grant admin consent:" Write-Host $consentUrl -
-
Führen Sie das Skript aus.
-
Speichern Sie die Anwendungs-ID und die Dienstprinzipal-ID, die das Skript anzeigt. (Für das Nerdio Manager-Deployment bereitzustellen.)
-
Öffnen Sie den Link, den das Skript in einem Webbrowser anzeigt, melden Sie sich als globaler Admin an und erteilen Sie die Einwilligung.
Das Skript zeigt einen Link an, anstatt einen Browser zu öffnen, sodass es auch in Azure Cloud Shell funktioniert.
Kommentare (0 Kommentare)