【问题标题】:Programmatically configure Outlook's options for address lists以编程方式配置 Outlook 的地址列表选项
【发布时间】:2022-04-28 00:04:53
【问题描述】:

我需要以编程方式(最好是通过 PowerShell)配置 Outlook 设置选项:

  1. “发送电子邮件时,按以下顺序检查地址列表:”到“从联系人文件夹开始”。
  2. “打开通讯录时,先显示此通讯录:”到“Outlook通讯录”。

事实证明,这个问题特别难以捉摸,我已经研究了好几个小时,所以我的综合结果可能看起来有点混乱。

 

选项#1

如果我没记错的话,以下 PowerShell 命令成功配置了选项:

New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\<Outlook version>\Outlook\Profiles\<mail profile name>\0a0d020000000000c000000000000046\" -Name "000b3d1c" -PropertyType "Binary" -Value 0x00,0x00 -Force;
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\<Outlook version>\Outlook\Profiles\<mail profile name>\0a0d020000000000c000000000000046\" -Name "00033d1b" -PropertyType "Binary" -Value 0x02,0x00,0x00,0x00 -Force;

 

选项 #2

将注册表项 HKCU\Software\Microsoft\Office\&lt;Outlook version&gt;\Outlook\Profiles\&lt;mail profile name&gt; 导出到 REG 文件、重新创建邮件配置文件、导入 REG 文件并打开 Outlook 显示选项已根据需要设置。所以,它可以通过注册表来完成。

进程监视器,配置为使用过滤器 Process Name is OUTLOOK.EXE IncludeOperation is RegSetValue Include 监视注册表操作,总是输出略有不同的结果,但一致的结果是:

15:48:56.9983649 OUTLOOK.EXE 531284 RegSetValue HKCU\Software\Microsoft\Office\15.0\Outlook\Profiles\Student\9207f3e0a3b11019908b08002b2a56c2\01023d06 成功类型:REG_BINARY,长度:4000000000000000000000 0A 18 C7 1A 10 E8 85 0B 65

15:48:56.9991115 OUTLOOK.EXE 531284 RegSetValue HKCU\Software\Microsoft\Office\15.0\Outlook\Profiles\Student\0a0d020000000000c000000000000046\000b3d1c 成功类型:REG_BINARY,长度:2,数据:00>

15:48:56.9996963 OUTLOOK.EXE 531284 RegSetValue HKCU\Software\Microsoft\Office\15.0\Outlook\Profiles\Student\0a0d020000000000c000000000000046\00033d1b 成功类型:REG_BINARY,长度:4,数据:02 >

15:48:57.0052360 OUTLOOK.EXE 531284 RegSetValue HKCU\Software\Microsoft\Office\15.0\Outlook\Profiles\Student\4ae4e14443f96d4982c25a0b9340e560\000b048b 成功类型:REG_BINARY,长度:2,数据:01 0

15:49:03.0985853 OUTLOOK.EXE 531284 RegSetValue HKCU\Software\Microsoft\Office\15.0\Outlook\Profiles\Student\0a0d020000000000c000000000000046\1102039b 成功类型:REG_BINARY,长度:010008,数据:0D 00 00 00 00 00 14 00 00 00

15:49:03.0990695 OUTLOOK.EXE 531284 RegSetValue HKCU\Software\Microsoft\Office\15.0\Outlook\Profiles\Student\0a0d020000000000c000000000000046\000b0415 成功类型:REG_BINARY,长度:2,数据:00>

但是,以下 PowerShell 命令未成功配置选项:

New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\<Outlook version>\Outlook\Profiles\<mail profile name>\0a0d020000000000c000000000000046\" -Name "000b046b" -PropertyType "Binary" -Value 0x01,0x00 -Force;
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\<Outlook version>\Outlook\Profiles\<mail profile name>\9207f3e0a3b11019908b08002b2a56c2\" -Name "01023d06" -PropertyType "Binary" -Value 0x00,0x00,0x00,0x00,0xFE,0x42,0xAA,0x0A,0x18,0xC7,0x1A,0x10,0xE8,0x85,0x0B,0x65 -Force;
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\<Outlook version>\Outlook\Profiles\<mail profile name>\0a0d020000000000c000000000000046\" -Name "000b3d1c" -PropertyType "Binary" -Value 0x00,0x00 -Force;
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\<Outlook version>\Outlook\Profiles\<mail profile name>\0a0d020000000000c000000000000046\" -Name "00033d1b" -PropertyType "Binary" -Value 0x02,0x00,0x00,0x00 -Force;
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\<Outlook version>\Outlook\Profiles\<mail profile name>\0a0d020000000000c000000000000046\" -Name "000b0340" -PropertyType "Binary" -Value 0x01,0x00 -Force;
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\<Outlook version>\Outlook\Profiles\<mail profile name>\9207f3e0a3b11019908b08002b2a56c2\" -Name "11023d05" -PropertyType "Binary" -Value 0x02,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00 -Force;
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\<Outlook version>\Outlook\Profiles\<mail profile name>\b9e1c8a47102f24688ede3f23cbc5224\" -Name "0102663b" -PropertyType "Binary" -Value 0x0F,0x00,0x01,0x00,0x8C,0x01,0x21,0x00 -Force;
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\<Outlook version>\Outlook\Profiles\<mail profile name>\0a0d020000000000c000000000000046\" -Name "1102039b" -PropertyType "Binary" -Value 0x01,0x00,0x00,0x00,0x1D,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00 -Force;
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\<Outlook version>\Outlook\Profiles\<mail profile name>\0a0d020000000000c000000000000046\" -Name "000b0415" -PropertyType "Binary" -Value 0x00,0x00 -Force;

Set Outlook's 'show this address list first' option 建议这可以通过使用 ComObjects 来完成,但测试表明 Outlook 检测到该活动为恶意活动并提示需要手动干预的安全警告,这显然是有问题的,因为它不是 100%程序化。

https://social.technet.microsoft.com/Forums/exchange/en-US/85a392d4-fc85-43c5-9c02-c07ec86e2ade/default-address-list?forum=exchangesvrclientslegacyhttps://social.technet.microsoft.com/Forums/office/en-US/6bb9b40f-b794-41ce-93b4-711e77c53607/gal-default-adress-book-gpo 表示注册表键 *\&lt;mail profile name&gt;\9207f3e0a3b11019908b08002b2a56c2 -> 值 01023d06 是由 Process Monitor 检测到的,但如上所述,它在我的测试中不起作用。

【问题讨论】:

    标签: powershell outlook registry programmatically-created


    【解决方案1】:

    该选项是在扩展 MAPI(仅限 C++ 或 Delphi)中使用 IAddrBook.SetDefaultDirIAddrBook.SetSearchPath 设置的。 Outlook 对象模型不公开该功能。如果使用 Redemption 是一个选项(我是它的作者 - 任何语言),它会暴露 RDOAddressBook.DefaultAddressListSearchPath 属性。

    【讨论】:

    • 抱歉,我应该(现在)已经澄清我更喜欢使用 PowerShell,因为这是较大脚本的一小部分。有没有机会,您知道它们会做出哪些系统级更改吗?
    • 这些设置不是系统范围的,它们存储在每个配置文件的基础上。
    • 是的,这很好,因为脚本在登录时运行。
    • 您能告诉我们这些所做的注册表更改吗?谢谢。
    • 对于不同的配置文件,注册表项的名称会有所不同,因为配置文件部分的 guid 是随机生成的。您确实需要使用记录在案的 API 来设置这些选项。
    【解决方案2】:

    我写了这个PS脚本来改变“打开通讯录时,先显示这个地址列表:”

    ## Script for setting default address book view in Outlook for CU
    #
    # Input (const):
    #   <$cAddrList> GUID for needed address list
    #   Dump REG_BINARY value of '01023d06' from key
    #   HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Profiles\Outlook\9207f3e0a3b11019908b08002b2a56c2\
    #
    # Version 1.2
    # (c)kMit 2017
    #
    
    #AddressList string - 'BigBoxList'
    $cAddrList = 'fe000000000000000000000000000000000000ff01000000000100002f677569643d393536324239433038413232374234454236313831443644364236323635353100'
    
    #Outlook profiles registry path
    $cMSOProf = '\Software\Microsoft\Office\15.0\Outlook\Profiles\'
    $cMSOPFil = '*Outlook'
    $cMSORK01 = '\9207f3e0a3b11019908b08002b2a56c2'
    $cMSORSrc = '11023d05'
    $cMSORTrg = '01023d06'
    $cMSORK02 = '\0a0d020000000000c000000000000046'
    $cMSORBFM = '000b3d1c'
    #\''
    
    #Get list of Outlook profiles
    $pList = (Get-ChildItem -Path HKCU:$cMSOProf -ErrorAction SilentlyContinue)
    
    #Select profile - profile name doesn't matter if it's single, or the first one that matches $cMSOPFil
    if($pList) {
        if($pList.GetType().BaseType.Name -eq 'Array') {
            $pTarg = ($pList | ? {$_.Name -like $cMSOPFil})[0]
        } else {
            $pTarg = $pList
        }
    }
    
    #Change profile
    if($pTarg -and (Get-ChildItem HKCU:$pTarg -ErrorAction SilentlyContinue)) {
        $rKey = 'HKCU:'+$pTarg.Name.Substring(17)
    
        try {
            $is = (Get-ItemProperty -Path ($rKey+$cMSORK01)).$cMSORSrc
    
            #Make value and copy header
            $it = @(($cAddrList -split '([a-f0-9]{2})') | ForEach-Object {if($_) {[System.Convert]::toByte($_,16)}})
            for($i=0;$i -lt 20;$i++) {$it[$i] = $is[$i+20]}
    
            #Write result
            Set-ItemProperty -Path ($rKey+$cMSORK01) -Name $cMSORTrg -Type Binary -Value ([byte[]]($it))
            #Disable auto-select ('Choose automatically')
            Set-ItemProperty -Path ($rKey+$cMSORK02) -Name $cMSORBFM -Type Binary -Value ([byte[]](0,0))
        }
        catch {
            break
        }
    }
    

    【讨论】:

      【解决方案3】:

      这里的部分答案,解决如何更改 OP 请求的第一个设置。

      设置发送邮件时,按此顺序检查地址列表可以通过如下修改注册表来改变:

      密钥: HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\[OutlookVersion]\Outlook\Profiles\[OutlookProfileName]\0a0d020000000000c000000000000046

      • [OutlookVersion] 是 Outlook 的版本(例如 15.0
      • [OutlookProfileName] 是用户的 Outlook 配置文件名称(例如 Outlook)。

      值名称: 00033d1b(类型:REG_BINARY)

      数据:

      • 01 00 00 00 启用 从全局地址列表开始
      • 02 00 00 00 启用从联系人文件夹开始

      PowerShell 更改设置

      假设 Outlook 15.0 和“Outlook”的配置文件名称:

      启用从全局地址列表开始

      Set-ItemProperty -Path "HKCU:\Software\Microsoft\Office\15.0\Outlook\Profiles\Outlook\0a0d020000000000c000000000000046\" -Name 00033d1b -Value ([byte[]](0x01,0x00,0x00,0x00))
      

      启用从联系人文件夹开始

      Set-ItemProperty -Path "HKCU:\Software\Microsoft\Office\15.0\Outlook\Profiles\Outlook\0a0d020000000000c000000000000046\" -Name 00033d1b -Value ([byte[]](0x02,0x00,0x00,0x00))
      

      注意事项:

      • 这可以在 Outlook 打开时更改;更改立即生效。
      • 使用Set-ItemProperty 假定值00033d1b 已存在于注册表中。
      • 感谢SO answer 解释如何使用[byte[]] 语法。
      • 感谢SO question 提供了寻找此答案的起点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-28
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多