在PowerShell中获取Skype for Business的未分配电话号码

时间:2017-05-25 14:05:29

标签: powershell lync

有没有人在powershell中做过类似的事情?我正在自动创建新用户,并且必须为业务帐户设置Skype。这是我到目前为止所做的:

<# 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'

我剩下的就是分配LineURI,我似乎无法找到有关如何做到这一点的任何内容。但是,我确实找到了script这样做,但看起来并不像我的需要。我的问题是:如何在powershell中查询Skype for Business以获取第一个未分配的号码并将其指定为LineURI?我一直在使用New-CSUnassignedNumber,但似乎无法取得任何进展。

1 个答案:

答案 0 :(得分:0)

SfB没有记录你的号码范围,因此它不知道你指定1299是否是范围中的最后一个,或者该范围是否延伸到1300?

Get-CsUser | ? LineUri | Select LineUri | Sort

这将为您提供组织中所有已分配的uri的排序列表,因此您可以选择可分配的uri,无论您是否可以使用多种方法查找内容你正在寻找,但你可能对这个长期方法感兴趣,它是一个接受你的号码范围的脚本,并在一个漂亮的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