Exchange Powershell:来自公用文件夹的联系人

时间:2012-11-12 20:09:59

标签: powershell contacts powershell-v2.0 exchange-server exchange-server-2010

Exchange管理外壳:

[PS] C:\Windows\system32>$AddressBook = Get-PublicFolderItemStatistics -Identity "\Shared Company Address Book"

[PS] C:\Windows\system32>$AddressBook [0] | format-list

RunspaceId           : d8e95055-1f3e-4e7f-a1fc-d5b97ecbcb96
ServerName           : MAILMAN
DatabaseName         : Public Folder Database 0524088380
Subject              : John Q User
PublicFolderName     : \Company Address Book
LastModificationTime : 11/12/2012 2:57:49 PM
CreationTime         : 11/12/2012 2:56:28 PM
HasAttachments       : False
ItemType             : IPM.Contact
MessageSize          : 6.598 KB (6,756 bytes)
Identity             : 000000001A447390AA6611CD9BC800AA002FC45A0900580787449ABF5E4891DD89178938242C0000000250AE00001BE1
                       A5309D57D5439914FD70BDC745C100000B8942FD0000
MapiIdentity         : 000000001A447390AA6611CD9BC800AA002FC45A0900580787449ABF5E4891DD89178938242C0000000250AE00001BE1
                       A5309D57D5439914FD70BDC745C100000B8942FD0000
OriginatingServer    : mailman.company.com
IsValid              : True

[PS] C:\Windows\system32>

好的......我正在尝试导出Exchange Server 2010联系人列表中的联系人。对于我这个世界,我不能弄清楚如何从这个愚蠢的事情中获取“数据”。

如果我做$ AddressBook |格式列表,它列出了所有联系人,所以我知道我在正确的球场。

如何从此列表中获取所有信息?姓氏,名字,电子邮件地址,商务电话等

3 个答案:

答案 0 :(得分:3)

这是一篇旧帖子,但我有几天同样的问题,但无法弄清楚。因此,我选择使用@WernerCD之路,并希望添加我的PowerShell脚本,以便在您决定沿着这条路走下去时帮助您。

在开始之前,请允许我解释一下我的问题。我们有多个包含联系人的文件夹。这些联系人包含由于迁移问题而导致的用户定义字段未添加到其包含的文件夹中。虽然我们使用Outlook,但我们需要能够在当前视图中看到这些字段。但是,当我们尝试添加UDF列时,它只允许我们使用文件夹"中的"用户定义字段,这是空的。

下面是PowerShell脚本,它将检查Outlook中的公用文件夹(及其子文件夹),检查每个联系人UserProperties(等效于UDF),将它们放入一个数组,然后它将检查每个联系人的UDF存在于其包含文件夹(UserDefinedProperties)中,如果它不存在,则会将其添加为没有值的文本字段。

请注意,我们所有的联系人文件夹都位于名为“共享联系人文件夹”的文件夹下。

代码

# Connection to Outlook
$Outlook       = New-Object -com Outlook.Application 
$Namespace     = $outlook.GetNamespace("MAPI") 

# "Location" of public folders (Change me@example.com)
$PublicFolder  = $Namespace.Folders.Item("Public Folders - me@example.com")
$PublicFolders = $PublicFolder.Folders.Item("All Public Folders")

# Folder that you would like to check. We will check Shared Contacts under Shared Contacts Folder
$SharedContactsFolder   = $PublicFolders.Folders.Item("Shared Contacts Folder")
$SharedContacts   = $SharedContactsFolder.Folders.Item("Shared Contacts")

Write-Host ("<----------------------------------------------------------->") -foreground Yellow

function CheckContacts($MyFolder){

    # Check if this folder has subfolder
    If ( $MyFolder.Folders.Count -gt 0) {

        Write-Host ("Folder '" + $MyFolder.Name + "' contains subfolders ("  + $MyFolder.Folders.Count + ")")  -BackgroundColor Yellow -foreground DarkBlue

        Foreach ( $Subfolder in $MyFolder.Folders ) {

            CheckContacts($Subfolder)

        }

    }

    Write-Host ("Working on folder: " + $MyFolder.Name)  -BackgroundColor White -foreground DarkBlue

    $All_UDF = @()

    # Check User Defined Fields (UDF) for each contact and add them to array
    foreach ( $Contacts in $MyFolder.Items ) {

        foreach ( $UDF in $Contacts.UserProperties ) {

            # Check if field was previously added to array
            If ($All_UDF -notcontains $UDF.Name) {
                $All_UDF += $UDF.Name
            }

        }

    }

    # Add all UDF to Folder's UDF
    Write-Host ("We will add the following UDF into '" + $MyFolder.Name + "': ") -foreground Green
    Write-Host ($All_UDF -join "`n") -foreground Green

    Foreach ( $UDF in $All_UDF ){

        # Only add if UDF does not exist on folder's UDF
        if( (CheckFolderUDF $MyFolder $UDF) -eq $false) {
            # Add - Always add UDF as Text field (1)
            Write-Host ("Adding '" + $UDF + "' to '" + $MyFolder.Name + "'")
            $MyFolder.UserDefinedProperties.Add($UDF, 1)
        }else{
            Write-Host ("Already present: " + $UDF)
        }

    }

    Write-Host ("<----------------------------------------------------------->") -foreground Yellow
}

Function CheckFolderUDF ( $MyFolder, $MyUDFName ) {
    $Result = $false

    Foreach ( $Folder_UDF in $MyFolder.UserDefinedProperties ){

        If ( $Folder_UDF.Name -eq $MyUDFName ) {
            $Result = $true
            break
        }

    }

    return $Result

}

# Start - Check Shared Contacts
CheckContacts($SharedContacts) 

如何运行/测试此代码?

1)打开Windows PowerShell ISE(在Windows中)。

2)复制上面的代码并将其粘贴到PowerShell ISE窗口中。

3)阅读并理解代码。

4)根据需要进行修改。

P.S。:我试图添加一个&#34;评论&#34;,但我没有足够的分数。

答案 1 :(得分:1)

经过多次痛苦和痛苦......并在[this post]上磕磕绊绊。这是在Powershell(不是Exchange Powershell控制台)和我的计算机(不是服务器MailMan):

$Outlook       = New-Object -com Outlook.Application 
$Namespace     = $outlook.GetNamespace("MAPI") 
$PublicFolder  = $Namespace.Folders.Item("Public Folders - me@example.com")
$PublicFolders = $PublicFolder.Folders.Item("All Public Folders")
$AddressBook   = $PublicFolders.Folders.Item("Company Address Book")
$Contacts      = $AddressBook.Items
$Contacts | Select FullName

这实际上是拉取联系信息。我仍然在服务器端查看如何执行此操作(Exchange Powershell控制台),但这应该是选择所需字段并根据需要将其推送到数据库的良好基础。

我想如果我能弄清楚如何获取&#34;公共文件夹 - dummy_user@example.com" ;,我应该能够在服务器上做同样的事情。

我还假设有一种更简单的方法(可能是通过拉动路径,而不是一次一个部分),但这确实有效。

现在了解如何获取UserDefinedFields ....

答案 2 :(得分:0)

为什么不使用Get-Contact代替Get-PublicFolderItemStatistics