Vmware Cloud Partner Navigator Example Module
This commit is contained in:
572
Modules/VMwareCloudPartnerNavigator/navigator.psm1
Normal file
572
Modules/VMwareCloudPartnerNavigator/navigator.psm1
Normal file
@@ -0,0 +1,572 @@
|
|||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
|
||||||
|
Connects to VMware Cloud Partner Navigator
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
|
||||||
|
Uses refresh token to call the Navigator IAM API and get an access token that is stored in $Global:NavigatorConnection.accessToken
|
||||||
|
|
||||||
|
.PARAMETER RefreshToken
|
||||||
|
VMware Cloud Services Refresh Token
|
||||||
|
|
||||||
|
.PARAMETER Server
|
||||||
|
Used by VMware to connect to internal development instances of Navigator.
|
||||||
|
|
||||||
|
.INPUTS
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
.OUTPUTS
|
||||||
|
|
||||||
|
None. Access Token is written to $Global:NavigatorConnection
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
|
||||||
|
PS> Connect-Navigator -RefreshToken 12312313134123141234234525234523412341234234252451234123123123
|
||||||
|
|
||||||
|
#>
|
||||||
|
function Connect-Navigator {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[String]$RefreshToken,
|
||||||
|
[String]$server = "https://console.navigator.vmware.com"
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
$connectionParams = @{
|
||||||
|
uri = "$($server)/cphub/api/auth/v1/authn/accesstoken";
|
||||||
|
userAgent = "Navigator-PowerShell";
|
||||||
|
contentType = "application/json";
|
||||||
|
headers = @{
|
||||||
|
"X-XSRF-TOKEN" = "j4QPhAAZ-jwDjc4uI1Z8URuXJTqa9U4Y23rg";
|
||||||
|
};
|
||||||
|
body = @{refreshToken = $refreshToken} | ConvertTo-Json;
|
||||||
|
method = "POST";
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
$response = Invoke-WebRequest @connectionParams
|
||||||
|
$Global:NavigatorConnection = @{server = $server; accessToken = (ConvertFrom-Json $response.Content).accessToken}
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
Write-Host $PSItem.Exception.Message -ForegroundColor RED
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
end {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
|
||||||
|
Retrieves Navigator Provider and Tenant organizations
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
|
||||||
|
Retrieves Navigator Provider and Tenant organizations
|
||||||
|
|
||||||
|
.PARAMETER OrgId
|
||||||
|
Specifies a specific OrgId to retrieve
|
||||||
|
|
||||||
|
.PARAMETER DisplayName
|
||||||
|
Retrieves orgs with specified display name
|
||||||
|
|
||||||
|
.PARAMETER OrgType
|
||||||
|
Can be used to search for "PROVIDER" or "TENANT" org types
|
||||||
|
|
||||||
|
.INPUTS
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
.OUTPUTS
|
||||||
|
|
||||||
|
Navigator Org Objects
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
|
||||||
|
PS> Get-NavigatorOrg -DisplayName "Foo" -OrgType "TENANT"
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
|
||||||
|
PS> Get-NavigatorOrg -OrgId c28e8c89-d03d-4572-9be1-5f13edb82af6
|
||||||
|
|
||||||
|
#>
|
||||||
|
function Get-NavigatorOrg {
|
||||||
|
[CmdletBinding(DefaultParameterSetName = 'byNameAndType')]
|
||||||
|
param (
|
||||||
|
# Parameter help description
|
||||||
|
[Parameter(ParameterSetName = 'byOrgId')]
|
||||||
|
[String]$OrgID,
|
||||||
|
# Parameter help description
|
||||||
|
[Parameter(ParameterSetName = 'byNameAndType',Position=0)]
|
||||||
|
[String]$DisplayName,
|
||||||
|
# Parameter help description
|
||||||
|
[Parameter(ParameterSetName = 'byNameAndType')]
|
||||||
|
[String]$OrgType
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
$headers = @{
|
||||||
|
"csp-auth-token" = $Global:NavigatorConnection.accessToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($orgId) {
|
||||||
|
try {
|
||||||
|
$orgData = Invoke-WebRequest `
|
||||||
|
-Uri "$($Global:NavigatorConnection.server)/cphub/api/core/v1/mgmt/orgs/$($orgId)/" `
|
||||||
|
-Headers $headers
|
||||||
|
Write-Verbose $orgData
|
||||||
|
|
||||||
|
if ($orgData) {
|
||||||
|
$content = ConvertFrom-Json $orgData.Content
|
||||||
|
$content
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
Write-Host $PSItem.Exception.Message -ForegroundColor RED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$response = Invoke-WebRequest `
|
||||||
|
-Uri "$($Global:NavigatorConnection.server)/cphub/api/auth/v1/loggedinuser/orgs" `
|
||||||
|
-Headers $headers
|
||||||
|
|
||||||
|
$orgIDs = (ConvertFrom-Json $response.Content).loggedInUserOrgs
|
||||||
|
|
||||||
|
foreach ($orgID in $orgIDs) {
|
||||||
|
$orgData = $null
|
||||||
|
try {
|
||||||
|
$orgData = Invoke-WebRequest `
|
||||||
|
-Uri "$($Global:NavigatorConnection.server)/cphub/api/core/v1/mgmt/orgs/$($orgID)/" `
|
||||||
|
-Headers $headers
|
||||||
|
Write-Verbose $orgData
|
||||||
|
|
||||||
|
if ($orgData) {
|
||||||
|
$content = ConvertFrom-Json $orgData.Content
|
||||||
|
|
||||||
|
if ($orgType) {
|
||||||
|
$content = $content | Where-Object orgType -eq $orgType
|
||||||
|
}
|
||||||
|
if ($DisplayName) {
|
||||||
|
$content = $content | Where-Object DisplayName -like $DisplayName
|
||||||
|
}
|
||||||
|
$content | Add-Member -NotePropertyName orgId -NotePropertyValue $content.id
|
||||||
|
$content
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
catch {
|
||||||
|
#Write-Host $PSItem.Exception.Message -ForegroundColor RED
|
||||||
|
# Had to comment this catch out because we get 404s for orgs we belong to that are not navigator orgs.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
|
||||||
|
Gets support requests for a given organization
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
|
||||||
|
Gets support requests for a given organization
|
||||||
|
|
||||||
|
.PARAMETER OrgId
|
||||||
|
Specifies a specific OrgID for which to retrieve support requests
|
||||||
|
|
||||||
|
.INPUTS
|
||||||
|
|
||||||
|
Navigator Org Object
|
||||||
|
|
||||||
|
.OUTPUTS
|
||||||
|
|
||||||
|
Navigator Support Ticket Object
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
|
||||||
|
PS> Get-NavigatorSupportRequest -OrgId d7f32037-b9b5-41ec-9394-ba3edbbc9cac
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
|
||||||
|
PS> Get-NavigatorOrg -OrgId d7f32037-b9b5-41ec-9394-ba3edbbc9cac | Get-NavigatorSupportRequest
|
||||||
|
#>
|
||||||
|
function Get-NavigatorSupportRequest {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param (
|
||||||
|
# Parameter help description
|
||||||
|
[Parameter(Mandatory=$true,
|
||||||
|
ValueFromPipelineByPropertyName=$true)]
|
||||||
|
[String]
|
||||||
|
$orgID
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
$tickets = @()
|
||||||
|
$headers = @{
|
||||||
|
"csp-auth-token" = $Global:NavigatorConnection.accessToken;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
$response = Invoke-WebRequest `
|
||||||
|
-Headers $headers `
|
||||||
|
-Uri "$($Global:NavigatorConnection.server)/cphub/api/support/v1/orgs/$orgID/support-requests?includeTenantOrgs=true&pageLimit=100&pageStart=1&userTicketsOnly=false"
|
||||||
|
Write-Verbose $response
|
||||||
|
#Write-Verbose ($response.Content | ConvertFrom-Json).supportTickets
|
||||||
|
if ($response.Content) {
|
||||||
|
$tickets += ($response.Content | ConvertFrom-Json).supportTickets
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
Write-Host $PSItem.Exception.Message -ForegroundColor RED
|
||||||
|
}
|
||||||
|
|
||||||
|
$tickets
|
||||||
|
}
|
||||||
|
|
||||||
|
end {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Get-NavigatorSupportRequestMetadata {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory=$true,
|
||||||
|
ValueFromPipelineByPropertyName=$true)]
|
||||||
|
[String]$ParentOrgId,
|
||||||
|
[Parameter(Mandatory=$true,
|
||||||
|
ValueFromPipelineByPropertyName=$true)]
|
||||||
|
[String]$OrgId
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
$headers = @{
|
||||||
|
"csp-auth-token" = $Global:NavigatorConnection.accessToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$response = Invoke-WebRequest `
|
||||||
|
-Headers $headers `
|
||||||
|
-Uri "$($Global:NavigatorConnection.server)/cphub/api/support/v1/orgs/$ParentOrgId/support-requests/metadata?tenantId=$OrgId"
|
||||||
|
Write-Verbose $response
|
||||||
|
|
||||||
|
$jsonResponse = $response | ConvertFrom-Json
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
Write-Host $PSItem.Exception.Message -ForegroundColor RED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
|
||||||
|
Gets subscriptions for a given organization
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
|
||||||
|
Gets subscriptions for a given organization
|
||||||
|
|
||||||
|
.PARAMETER OrgId
|
||||||
|
Specifies a specific OrgID for which to retrieve subscriptions
|
||||||
|
|
||||||
|
.INPUTS
|
||||||
|
|
||||||
|
Navigator Org Object
|
||||||
|
|
||||||
|
.OUTPUTS
|
||||||
|
|
||||||
|
Navigator Subscription Object
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
|
||||||
|
PS> Get-NavigatorSubscriptions -OrgId d7f32037-b9b5-41ec-9394-ba3edbbc9cac
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
|
||||||
|
PS> Get-NavigatorOrg -OrgId d7f32037-b9b5-41ec-9394-ba3edbbc9cac | Get-NavigatorSubscriptions
|
||||||
|
#>
|
||||||
|
function Get-NavigatorSubscriptions {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param (
|
||||||
|
[String]$OrgId
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
$headers = @{
|
||||||
|
"csp-auth-token" = $Global:NavigatorConnection.accessToken;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
$response = Invoke-WebRequest `
|
||||||
|
-Headers $headers `
|
||||||
|
-Uri "$($Global:NavigatorConnection.server)/cphub/api/billing/v1/orgs/$OrgId/subscriptions?allTenants=true"
|
||||||
|
Write-Verbose $response
|
||||||
|
|
||||||
|
$response | ConvertFrom-Json
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
Write-Host $PSItem.Exception.Message -ForegroundColor RED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
|
||||||
|
Gets usage report for a given organization
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
|
||||||
|
Gets usage report for a given organization
|
||||||
|
|
||||||
|
.PARAMETER OrgId
|
||||||
|
Specifies a specific OrgID for which to retrieve usage
|
||||||
|
|
||||||
|
.INPUTS
|
||||||
|
|
||||||
|
Navigator Org Object
|
||||||
|
|
||||||
|
.OUTPUTS
|
||||||
|
|
||||||
|
Navigator usage report Object
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
|
||||||
|
PS> Get-NavigatorUsageReport -OrgId d7f32037-b9b5-41ec-9394-ba3edbbc9cac
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
|
||||||
|
PS> Get-NavigatorOrg -OrgId d7f32037-b9b5-41ec-9394-ba3edbbc9cac | Get-NavigatorUsageReport
|
||||||
|
#>
|
||||||
|
function Get-NavigatorUsageReport {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param (
|
||||||
|
[String]$OrgId
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
$headers = @{
|
||||||
|
"csp-auth-token" = $Global:NavigatorConnection.accessToken;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
$response = Invoke-WebRequest `
|
||||||
|
-Headers $headers `
|
||||||
|
-Uri "$($Global:NavigatorConnection.server)/cphub/api/billing/v1/orgs/$OrgId/usage-report?abd=false&detailView=false&providerReport=false"
|
||||||
|
Write-Verbose $response
|
||||||
|
|
||||||
|
$response | ConvertFrom-Json
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
Write-Host $PSItem.Exception.Message -ForegroundColor RED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
|
||||||
|
Creates a new Customer Organization in VMware Cloud Partner Navigator
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
|
||||||
|
Creates a new Customer Organization in VMware Cloud Partner Navigator
|
||||||
|
|
||||||
|
|
||||||
|
-City "Zionsville" -State "IN" -Zip "46077" -Country "US" -Domain "example.com" -verbose
|
||||||
|
|
||||||
|
.PARAMETER OrgId
|
||||||
|
Specifies a specific OrgID for which to retrieve subscriptions
|
||||||
|
.PARAMETER DisplayName
|
||||||
|
Specifies the short name for the organization
|
||||||
|
.PARAMETER CompanyName
|
||||||
|
Full company name of the organization
|
||||||
|
.PARAMETER AddressLine1
|
||||||
|
Address for the organization
|
||||||
|
.PARAMETER AddressLine2
|
||||||
|
Additional address line for the organization if needed
|
||||||
|
.PARAMETER City
|
||||||
|
City of the organization
|
||||||
|
.PARAMETER State
|
||||||
|
State of the organization
|
||||||
|
.PARAMETER Zip
|
||||||
|
Zip Code of the organizaiton
|
||||||
|
.PARAMETER Country
|
||||||
|
2-letter country code of the organization
|
||||||
|
.PARAMETER Domain
|
||||||
|
Domain name of the organization
|
||||||
|
.PARAMETER OrgId
|
||||||
|
|
||||||
|
|
||||||
|
.INPUTS
|
||||||
|
|
||||||
|
Navigator Provider Org Object
|
||||||
|
|
||||||
|
.OUTPUTS
|
||||||
|
|
||||||
|
Navigator Customer Record Object
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
|
||||||
|
PS> New-NavigatorCustomer -OrgId d7f32037-b9b5-41ec-9394-ba3edbbc9cac -DisplayName Neptune -CompanyName Neptune -AddressLine1 "123 Fake St." -City "Zionsville" -State "IN" -Zip "46077" -Country "US" -Domain "example.com" -verbose
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
|
||||||
|
PS> Get-NavigatorOrg -OrgId d7f32037-b9b5-41ec-9394-ba3edbbc9cac | New-NavigatorCustomer -DisplayName Neptune -CompanyName Neptune -AddressLine1 "123 Fake St." -City "Zionsville" -State "IN" -Zip "46077" -Country "US" -Domain "example.com" -verbose
|
||||||
|
#>
|
||||||
|
function New-NavigatorCustomer {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory=$true,
|
||||||
|
ValueFromPipelineByPropertyName=$true)]
|
||||||
|
[String]$OrgId,
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[String]$DisplayName,
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[String]$CompanyName,
|
||||||
|
[String]$TenantType = "DEFAULT",
|
||||||
|
# [String]$AdminUserEmail, # Call fails if this is provided.
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[String]$Domain,
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[String]$AddressLine1,
|
||||||
|
[String]$AddressLine2 = '',
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[String]$City,
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[String]$State,
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[String]$Zip,
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[String]$Country, # Country list has to come from /csp/gateway/iam/vmwid/api/user-registration/configuration/countries
|
||||||
|
[String]$Tag = ''
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
if ($Country.Length -ne 2) {
|
||||||
|
Write-Error -Message "Please use 2 letter country code." -ErrorAction Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
$headers = @{
|
||||||
|
"csp-auth-token" = $Global:NavigatorConnection.accessToken
|
||||||
|
"Content-Type" = "application/json"
|
||||||
|
}
|
||||||
|
|
||||||
|
$body = @{
|
||||||
|
'displayName' = $DisplayName
|
||||||
|
'companyName' = $CompanyName
|
||||||
|
'tenantType' = $TenantType
|
||||||
|
'adminUserEmail' = ""
|
||||||
|
'domain' = $Domain
|
||||||
|
'addressLine1' = $AddressLine1
|
||||||
|
'addressLine2' = $AddressLine2
|
||||||
|
'city' = $City
|
||||||
|
'state' = $State
|
||||||
|
'zip' = $Zip
|
||||||
|
'country' = $Country
|
||||||
|
'tag' = $Tag
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Write-Verbose ($body | ConvertTo-Json)
|
||||||
|
$response = Invoke-WebRequest `
|
||||||
|
-Headers $headers `
|
||||||
|
-Uri "$($Global:NavigatorConnection.server)/cphub/api/core/v1/mgmt/orgs/$OrgId/tenants" `
|
||||||
|
-Method "POST" `
|
||||||
|
-Body ($body | ConvertTo-Json)
|
||||||
|
Write-Verbose $response
|
||||||
|
|
||||||
|
$response | ConvertFrom-Json
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
Write-Host $PSItem.Exception.Message -ForegroundColor RED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
### GET CMDLET TEMPLATE SNIPPET
|
||||||
|
### COPY AND PASTE THIS FOR CREATING NEW GET CMDLET
|
||||||
|
# function Get-Navigator... {
|
||||||
|
# [CmdletBinding()]
|
||||||
|
# param (
|
||||||
|
# [String]$OrgId
|
||||||
|
# )
|
||||||
|
|
||||||
|
# begin {
|
||||||
|
|
||||||
|
# }
|
||||||
|
|
||||||
|
# process {
|
||||||
|
# $headers = @{
|
||||||
|
# "csp-auth-token" = $Global:NavigatorConnection.accessToken;
|
||||||
|
# }
|
||||||
|
# try {
|
||||||
|
# $response = Invoke-WebRequest `
|
||||||
|
# -Headers $headers `
|
||||||
|
# -Uri "$($Global:NavigatorConnection.server)/cphub/api/..."
|
||||||
|
# Write-Verbose $response
|
||||||
|
|
||||||
|
# $response | ConvertFrom-Json
|
||||||
|
# }
|
||||||
|
# catch {
|
||||||
|
# Write-Host $PSItem.Exception.Message -ForegroundColor RED
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
|
||||||
|
# end {
|
||||||
|
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
|
||||||
|
Export-ModuleMember *
|
||||||
Reference in New Issue
Block a user