2017-05-25 3 views
0

Est-ce que quelqu'un a déjà fait quelque chose comme ça dans PowerShell? J'automatise la création de nouveaux utilisateurs et je dois configurer leur skype pour les comptes professionnels. Voici ce que j'ai jusqu'à présent:Obtenir des numéros de téléphone non attribués pour Skype Entreprise dans PowerShell

<# set up skype for business #> 
Enable-CsUser -Identity $FULLNAME ` 
-RegistrarPool REDACTED 
-SipAddress $SIP 
Set-CsUser $FULLNAME ` 
-EnterpriseVoiceEnabled $true ` 
-ExchangeArchivingPolicy Uninitialized ` 
-LineURI $PHONENUMBER 
# only for driver manager/managers 
Grant-CsConferencingPolicy $FULLNAME ` 
-PolicyName $ConferencingPolicy 
Grant-CsExternalAccessPolicy -identity $FULLNAME ` 
-PolicyName 'Allow external access' 

Tout ce que j'ai laissé est la pour assigner le LineURI, et je ne peux pas sembler trouver quoi que ce soit sur la façon de le faire. J'ai, cependant, trouvé un script qui fait cela, mais il ne semble pas que ce soit spécifique à mes besoins. Ma question est la suivante: comment puis-je interroger Skype for Business dans powershell pour saisir le premier numéro non affecté et l'assigner comme LineURI? J'ai utilisé New-CSUnassignedNumber mais ne semble pas avancer.

+0

Alors, quelle est votre question? –

+0

@Bill_Stewart Je ne peux pas croire que j'ai oublié de mettre cela. Edité avec la question. – Matt

Répondre

0

SfB ne tient pas de registre de votre numéro va, donc il ne sait pas si vous assignant 1299 est la dernière dans une gamme, ou si la plage s'étend dans le 1300

Get-CsUser | ? LineUri | Select LineUri | Sort 

cette volonté vous donner une liste triée de tous les uri assignés dans votre organisation, de sorte que vous serez en mesure de choisir ceux qui peuvent être assignables, peu importe que vous pouvez utiliser un certain nombre de méthodes pour trouver ce que vous cherchez, mais vous pouvez être intéressé dans ce cas, pour une approche à plus long terme, c'est un script qui prend en compte vos plages de nombres et affiche une liste des objets utilisés et disponibles dans un bon Csv.

#region Input 
$NumRangeKeyTable = @{ 
    #Make sure numbers are in the same format as they are in Skype, 
    #Do not include any ';ext' or 'tel:' etc. formatting! 
    #Put single numbers in the format: 
    # "+35313456789" = "" 
    #Put number ranges in the format: 
    # "+35313456700" = "+35313456799" 

    "+35313456789" = "" 
    "+35313456700" = "+35313456799" 
} 

#Save Location, set to $null to be prompted for location. 
$FileName = $null 
#endregion 

#region Code 
#region Helper Functions 
Function Get-CsAssignedURIs { 
$AllNumbers = @() 
$Users = Get-CsUser 
$Users | ? {$_.LineURI -ne ""} | %{ $AllNumbers += New-Object PSObject -Property @{Name = $_.DisplayName ; SipAddress = $_.SipAddress ; Number = $_.LineURI ; Type = "User" }} 
$Users | ? {$_.PrivateLine -ne ""} | %{ $AllNumbers += New-Object PSObject -Property @{Name = $_.DisplayName ; SipAddress = $_.SipAddress ; Number = $_.PrivateLine ; Type = "PrivateLine" }} 
Get-CsRgsWorkflow | Where-Object {$_.LineURI -ne ""} | Select Name,LineURI | %{$AllNumbers += New-Object PSObject -Property @{Name = $_.Name ; SipAddress = $_.PrimaryUri ; Number = $_.LineURI ; Type = "Workflow" }} 
Get-CsCommonAreaPhone -Filter {LineURI -ne $null} | %{ $AllNumbers += New-Object PSObject -Property @{Name = $_.DisplayName ; SipAddress = $_.SipAddress ; Number = $_.LineURI ; Type = "CommonArea" }} 
Get-CsAnalogDevice -Filter {LineURI -ne $null} | %{ $AllNumbers += New-Object PSObject -Property @{Name = $_.DisplayName ; SipAddress = $_.SipAddress ; Number = $_.LineURI ; Type = "AnalogDevice" }} 
Get-CsExUmContact -Filter {LineURI -ne $null} | %{ $AllNumbers += New-Object PSObject -Property @{Name = $_.DisplayName ; SipAddress = $_.SipAddress ; Number = $_.LineURI ; Type = "ExUmContact" }} 
Get-CsDialInConferencingAccessNumber -Filter {LineURI -ne $null} | %{ $AllNumbers += New-Object PSObject -Property @{Name = $_.DisplayName ; SipAddress = $_.PrimaryUri ; Number = $_.LineURI ; Type = "DialInAccess" }} 
Get-CsTrustedApplicationEndpoint -Filter {LineURI -ne $null} | %{ $AllNumbers += New-Object PSObject -Property @{Name = $_.DisplayName ; SipAddress = $_.SipAddress ; Number = $_.LineURI ; Type = "ApplicationEndpoint" }} 
Return $AllNumbers 
} 

function Get-UniqueExt { 
    Param(
     [string]$Uri1, 
     [string]$Uri2 
    ) 

    $Reg = "^([0-9+])+$" 

    if ([string]::IsNullOrEmpty($uri1) -and [string]::IsNullOrEmpty($Uri2)) { return "Two blank strings provided" } 
    if ($Uri1 -eq $Uri2) { return $Uri1 } 
    if ([string]::IsNullOrEmpty($uri1)) { return $Uri2 } 
    if ([string]::IsNullOrEmpty($uri2)) { return $Uri1 } 
    if ($Uri1.Length -ne $Uri2.Length) { return "Strings cannot be different lengths" } 
    if (($Uri1 -notmatch $Reg) -or ($Uri2 -notmatch $Reg)) { return "Strings must be in the format '0123..' or '+123..'" } 

    ($Uri1.Length-1)..0 | % { 
     if ($Uri1[$_] -ne $Uri2[$_]) { $Diff = $_ } 
    } 

    $Start = $Uri1.Substring(0,$Diff) 
    $Sub1 = $Uri2.Substring($Diff) 
    $Sub2 = $Uri1.Substring($Diff) 

    if ($Sub1 -lt $Sub2) { 
     $Min = $Sub1 ; $Max = $Sub2 
    } else { 
     $Min = $Sub2 ; $Max = $Sub1 
    } 

    $FormatStr = "" ; 1..$Min.Length | % { $FormatStr += "0"} 
    $Min..$Max | % { "$($Start)$($_.ToString($FormatStr))" } 
} 

function Save-ToFile { 
    Param(
    [Parameter(ValueFromPipeline=$True)] 
    $Item = $null, 
    [switch]$ReturnName, 
    $ExtFilter = "*", 
    $WinTitle = "Select File", 
    $FileTypeDisplay = $null 
    ) 

    If ($FileTypeDisplay -eq $null) { 
    If ($ExtFilter -eq "*") { 
     $ExtName = "All" 
    } Else { 
     $ExtName = (Get-Culture).TextInfo.ToTitleCase($ExtFilter) 
    }} Else { 
     $ExtName = (Get-Culture).TextInfo.ToTitleCase($FileTypeDisplay) } 

    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null 
    $FolderDialog = New-Object System.Windows.Forms.SaveFileDialog 
    $FolderDialog.Filter = "$($ExtName) files (*.$($ExtFilter.ToLowerInvariant()))| *.$($ExtFilter.ToLowerInvariant())" 
    $FolderDialog.Title = $WinTitle 
    $Result = $FolderDialog.ShowDialog() 

    If ($Result -eq "OK"){ 
    $Item | Out-File $FolderDialog.FileName -Append 
    If ($ReturnName) { return $FolderDialog.FileName }} 
    Else { 
    Write-Error "No file selected" } 
} 
#endregion 

Function Main { 
Param ([Hashtable]$NumRanges) 

#region Process Data 
$AllNums = $NumRanges.Keys | % { 
    Get-UniqueExt -Uri1 $_ -Uri2 $NumRanges[$_] 
} 
$S4BNums = Get-CsAssignedURIs 
$S4BNums | % { $_.Number = ($_.Number.Split(';')[0] -ireplace "tel:","") } 

$KT = @{} 

$S4BNums | % { 
    $KT[$_.Number] = $_ 
} 

$FullRecord = $AllNums | Sort | % { 
    $Number = $_ 
    $Type = "" 
    $Name = "" 

    if ($KT[$_] -ne $null){ 
     $UseDetails = $KT[$_] 
     $Name = $UseDetails.Name 
     $Type = $UseDetails.Type 
    } 

    [PSCustomObject]@{ 
     Number = $Number 
     Name = $Name 
     Type = $Type 
    } 
} 
#endregion 

return $FullRecord 
} 

$Results = Main $NumRangeKeyTable 

#region Output-Data 
    if ($FileName -eq $null) { 
    $FileName = (Save-ToFile -Item "" -ReturnName -ExtFilter "Csv") 
    } 
    if ($FileName -ne $null) { 
    $Results | Export-Csv -Path $FileName -NoTypeInformation 
    } else { $Results | Out-GridView } 
#endregion 
#endregion 
+0

Génial. Merci d'avoir répondu. – Matt

+0

@Matt pas de soucis, j'ai rencontré essentiellement le même problème pour notre propre environnement SfB et je voulais quelque chose que je peux réutiliser sur les sites des clients aussi. – ConnorLSW