2011-03-29 100 views
4

我试图通过PowerShell来获得与下面的代码共享日历的日历项目:PowerShell的COM对象

$outlook = new-object -ComObject Outlook.application 
$session = $outlook.Session 
$session.Logon("Outlook") 
$namespace = $outlook.GetNamespace("MAPI") 
$recipient = $namespace.CreateRecipient("John Smith") 
$theirCalendar = $namespace.GetSharedDefaultFolder($recipient, "olFolderCalendar") 

,但我得到一个类型不匹配错误:

Cannot convert argument "0", with value: "System.__ComObject", for "GetSharedDefaultFolder" to type "Microsoft.Office.I nterop.Outlook.Recipient": "Cannot convert the "System.__ComObject" value of type "System.__ComObject#{00063045-0000-00 00-c000-000000000046}" to type "Microsoft.Office.Interop.Outlook.Recipient"." At line:1 char:34 + $namespace.GetSharedDefaultFolder <<<< ($recipient, "olFolderCalendar") + CategoryInfo : NotSpecified: (:) [], MethodException + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

我已经试图直接将$收件人转换为Microsoft.Office.Interop.Outlook.Recipient,这不起作用,并且我也尝试了invoke-method()程序,这里详细记录了这里:http://www.mcleod.co.uk/scotty/powershell/COMinterop.htm

看来后者应该可以工作,但它似乎没有关于GetSharedDefaultFolder()要求的多个参数的规定。

回答

0

找到了解决办法在这里:http://cjoprey.blog.com/2010/03/09/getting-another-users-outlook-folder/

Add-Type -AssemblyName Microsoft.Office.Interop.Outlook 

$class = @” 
using Microsoft.Office.Interop.Outlook;public class MyOL 
{ 
    public MAPIFolder GetCalendar(string userName) 
    { 
     Application oOutlook = new Application(); 
     NameSpace oNs = oOutlook.GetNamespace("MAPI"); 
     Recipient oRep = oNs.CreateRecipient(userName); 
     MAPIFolder calendar = oNs.GetSharedDefaultFolder(oRep, OlDefaultFolders.olFolderCalendar); 
     return calendar; 
    } 
} 
“@ 

Add-Type $class -ReferencedAssemblies Microsoft.Office.Interop.Outlook 
+0

与多个smtp和Exchange帐户一起使用时Outlook有什么用处? – Kiquenet 2017-04-12 13:23:32

0

尝试用9代替olFolderCalendar
COM对象需要实际值。他们不能将明文名称转换为常量值。

+0

错误处理收件人对象,而不是文件夹对象。 – JakeRobinson 2011-03-30 13:41:31

+1

[Microsoft.Office.Interop.Outlook.OlDefaultFolders] :: olFolderCalendar也应该可以工作 – 2012-08-13 15:15:24

3

我设法得到这个工作使用System .__ ComObject的InvokeMember方法。为了将多个参数传递给方法,只需将它们括在圆括号中。

的代码行的一个例子如下所示:

PS C:> $ usercontacts = [系统.__ ComObject] .InvokeMember( “GetSharedDefaultFolder”[System.Reflection.BindingFlags] ::的InvokeMethod,$空,$ mapi,($ user,10))

$ user是先前设置的收件人对象。 $ mapi是MAPI命名空间对象(以前也设置过)。