COM-объекты Powershell - PullRequest
       21

COM-объекты Powershell

4 голосов
/ 29 марта 2011

Я пытаюсь получить элементы календаря из общего календаря через Powershell со следующим кодом:

$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")

, но получаю ошибку несоответствия типов:

Не удается преобразоватьаргумент "0", со значением: "System .__ ComObject", для типа "GetSharedDefaultFolder" введите "Microsoft.Office.I nterop.Outlook.Recipient": "Невозможно преобразовать значение" System .__ ComObject "типа" System .__ ComObject #{00063045-0000-00 00-c000-000000000046} "для ввода" Microsoft.Office.Interop.Outlook.Recipient "."1 строкаЯ пытался напрямую привести $ recient к Microsoft.Office.Interop.Outlook.Recipient, который не работает, и я также попробовал invoke-method() процедуру, хорошо описанную здесь: http://www.mcleod.co.uk/scotty/powershell/COMinterop.htm

Кажется, что последний должен работать,но, похоже, нет положений для нескольких параметров, которые требуются GetSharedDefaultFolder().

Ответы [ 3 ]

3 голосов
/ 01 апреля 2011

Мне удалось заставить это работать, используя метод InvokeMember System .__ ComObject.Чтобы передать в метод несколько параметров, просто заключите их в скобки.

Пример строки кода показан здесь:

PS C:> $ usercontacts = [System .__ ComObject] .InvokeMember («GetSharedDefaultFolder» [System.Reflection.BindingFlags] :: InvokeMethod, $ null, $ mapi, ($ user, 10))

$ user - это объект получателя, ранее настроенный.$ mapi - это объект пространства имен MAPI (также настроенный ранее).

0 голосов
/ 01 апреля 2011

Нашел решение здесь: 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 голосов
/ 30 марта 2011

Попробуйте заменить olFolderCalendar на число 9.
Для COM-объектов нужны фактические значения.Они не могут преобразовывать имена открытого текста в постоянные значения.

...