0

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 | Format-List,它列出了所有的联系人,所以我知道我在正确的范围内。

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

4

3 回答 3

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) 根据需要进行修改。

PS:我试图添加这个“评论”,但我没有足够的积分。

于 2016-10-09T07:11:13.820 回答
1

在经历了许多痛苦和折磨之后……偶然发现了[这篇文章]。这是在 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 控制台)执行此操作,但这应该是选择所需字段并根据需要将它们推送到数据库中的良好基础。

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

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

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

于 2012-11-13T15:23:25.330 回答
0

你为什么不使用Get-Contact而不是Get-PublicFolderItemStatistics

于 2012-11-12T21:09:50.570 回答