quercus
Goto Top

Outlook Kontakte Visitenkarte bei bestehenden Kontakten aktualisieren

Hi Zusammen,

ich brächte mal hilfe, einen Tipp.

Wie könnte ich bestehende Outlook Kontakte im öffentlichen Ordner Exchange aktuallisieren so das eine vorher angelegte Visitenkarte als Master verwendet wird.

vorher es werden alle Details wie z.b. Private Nummer, Anschrift beim Versenden einer Visitenkarte angezeigt.

Ziel nachher sollte sein das alle bestehenden Outlook Kontakte beim versenden als Visitenkarte keine Privaten Daten mit übermitteln. z.b. Privat Anschrift

Besten dan vorab schon einmal an die Outlook / Exchange Profi's

Mfg Quercus

Content-ID: 2356158063

Url: https://administrator.de/contentid/2356158063

Ausgedruckt am: 25.11.2024 um 02:11 Uhr

Nebellicht
Nebellicht 31.03.2022 aktualisiert um 15:53:25 Uhr
Goto Top
Hier habe ich mal ein Schnipsel ausm Internet festgehalten.
Soweit wie ich es nachvollziehen kann, wird die Visitenkarte auf die der Fokus ist das Vorbild und alle anderen im Ordner dann darauf angepaßt. Gruß Nebellicht

'# Code Sample 3: Change the business card layout to match the selected contact  
'# To use, first edit a business card so it is exactly as you want then run the macro.  
'# To use this code, select the contact whose card you edited then run the macro to apply it to all contacts in the folder. As  
'# with Sample 2, you can use If... Then statements to apply it to specific contacts.  
'# hier wird die Hintergrundfarbe der Visitenkarte beibehalten.  
'#  
'# (Irgendwo ausm Internet und angepasst.) Gruß Nebellicht.  

Public Sub CustomizeBusinessCards()

Dim obj As Object
Dim oFolder As Outlook.MAPIFolder
Dim oContact As Outlook.ContactItem
Dim oModel As Outlook.ContactItem
Dim colItems As Outlook.Items
Dim i As Long
Dim lCount As Long
Dim sXML As String
Dim colorstring As String

Set oFolder = Application.Session.GetDefaultFolder(olFolderContacts)
Set oFolder = Outlook.GetNamespace("Mapi").Folders("Postfach").Folders("Unter-Ordner")  
Set colItems = oFolder.Items

Set oModel = Application.ActiveExplorer.Selection.Item(1)

sXML = oModel.BusinessCardLayoutXml
colorstring_find = getBGCOLOR(sXML)

'sXML = Replace(sXML, "bgcolor=""80ffff""", "bgcolor = ""aaffff""") 'es klappt.  
'txt_WriteAll "d:\xml.txt", sXML  

lCount = colItems.Count

For i = 1 To lCount
Set obj = colItems.Item(i)

If (obj.Class = olContact) Then
Set oContact = obj

contactXML = obj.BusinessCardLayoutXml

colorstring = getBGCOLOR(contactXML)
Debug.Print colorstring_find & " > " & colorstring  

sXML_help = Replace(sXML, "bgcolor=""" & colorstring_find & """", "bgcolor=""" & colorstring & """")  
txt_WriteAll "d:\xml.txt", sXML_help  

oContact.BusinessCardLayoutXml = sXML_help

'oContact.AddBusinessCardLogoPicture ("")  
'("C:\image\logo.gif")  
'oContact.Save  
End If
Next

'MsgBox ("fertig")  
End Sub


Function getBGCOLOR(XML) As String
Dim l As String

l = InStr(1, XML, "bgcolor=")  

If l > 0 Then
    h = Mid(XML, l + Len("bgcolor=") + 1, Len("ffffff"))  
    Else
    h = ""  
End If

getBGCOLOR = h
End Function
Quercus
Quercus 31.03.2022 um 15:55:35 Uhr
Goto Top
Hi Nebel face-wink
Hättest hier den original Link dazu?

Werd's Mal testen denn das geht nur mit persönlichen Kontakte Ordnern denk ich als VBS Script.
Nicht auf öffentlichen Ordnern
Gruß Quercus
colinardo
colinardo 31.03.2022, aktualisiert am 05.04.2022 um 12:06:13 Uhr
Goto Top
Servus @Quercus,

bitteschön, hier das gewünschte als Powershell-Skript:
Bitte vor dem Starten Outlook öffnen und den Kontakt dessen Visitenkarte als Template dienen soll im Kontakte-Ordner nur markieren (nicht öffnen), und in Zeile 8 des Skripts den vollständigen Pfad zum öffentlichen Ordner definieren.
<#
    Outlook: Assign business card template to all contacts in a public folder
    Note: Before starting the script, please select the contact to serve as a template in the active outlook explorer instance
   @colinardo / administrator.de
#>

# define public folder path
$publicfolderPath = 'Business\Lieferanten'  

# ================================
$ErrorActionPreference = 'Stop'  
# load outlook object
[void][reflection.assembly]::LoadWithPartialName("microsoft.visualbasic")  
$objOL = [microsoft.visualbasic.interaction]::GetObject($null,"Outlook.Application")  
if (!$objOL){$objOL = New-Object -Com Outlook.Application}

try{
    # get public folder path
    $publicfolder = $objOL.Session.GetDefaultFolder(18)
    $publicfolderPath.TrimStart('\').split('\') | %{$publicfolder = $publicfolder.Folders[$_]}  
}catch{
    write-host "Public folder path is invalid, or no access to public folders! `nERROR: $($_.Exception.Message)" -F Red  
    return
}

# check selection
if ($objOL.ActiveExplorer().Selection.Count -eq 0){
    write-host "Please select the template contact in current outlook explorer instance!" -F Red  
    return
}
# get layout xml
$layouttemplate = $objOL.ActiveExplorer().Selection[1].BusinessCardLayoutXml

# assign layout template to every "contact" item in folder  
foreach($contact in ($publicfolder.Items | ?{$_.Class -eq 40})){
    write-host "Changing business card layout of contact '$($contact.FileAs)' ... " -NoNewline -F Green  
    try{
        $contact.BusinessCardLayoutXml = $layouttemplate
        $contact.Save()
        write-host "OK" -F Green  
    }catch{
        write-host $_.Exception.Message -F Red
    }
}
# cleanup
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($objOL)
Grüße Uwe
Quercus
Quercus 01.04.2022 aktualisiert um 11:13:07 Uhr
Goto Top
Hi colinardo,

ich werde das hoffentlich bis Mitte Nächster Woche Testen können im testsystem.

Eine Frage noch zu Zeile 8 des Skripts ,den vollständigen Pfad kann ich wo am besten auslesen?
du schreibst hier $publicfolderPath = 'Business\Lieferanten'
--> würde bei mir soaussehen \\Öffentliche Ordner - name@domain.yxz\Ordner\ Ordner ist das richtig?
Du führst das script am Exchange Server auf oder am Windows User PC aus?

aber danke schon mal für die Hilfe face-smile
Gruß Quercus
colinardo
colinardo 01.04.2022 aktualisiert um 11:27:54 Uhr
Goto Top
Zitat von @Quercus:
Eine Frage noch zu Zeile 8 des Skripts ,den vollständigen Pfad kann ich wo am besten auslesen?
du schreibst hier $publicfolderPath = 'Business\Lieferanten'
--> würde bei mir soaussehen \\Öffentliche Ordner - name@domain.yxz\Ordner\ Ordner ist das richtig?
Das Root darfst du nicht angeben, bei dir würde dann Ordner\Ordner reichen, also alles was unterhalb des Public-Root liegt angeben.

Du führst das script am Exchange Server auf oder am Windows User PC aus?
An einem Client-Rechner der Schreib-Zugriff auf den öffentlichen Ordner und Outlook installiert hat.
Ein EWS Skript das auf dem Exchange läuft könnte ich dir zwar auch schreiben, würde für dich aber mehr Initialen Aufwand für das definieren des Templates bedeuten, wäre aber natürlich deutlich schneller in der Abarbeitung als das Client-Skript. War also eine Abwägung was für dich wohl sinnvoller erscheint.

Grüße Uwe
Quercus
Quercus 01.04.2022 um 11:36:21 Uhr
Goto Top
Besten Dank colinardo ich teste das und meld mich dazu dann

Gruß Quercus
Nebellicht
Nebellicht 01.04.2022 aktualisiert um 13:33:26 Uhr
Goto Top
Zitat von @Quercus:

Hi Nebel face-wink
Hättest hier den original Link dazu?


Hallo Quercus,
ich habe mal die erste Zeile
Code Sample 3: Change the business card layout to match the selected contact
in die Google Suchmaschine eingetragen. Google ist super und hat direkt eine Antwort parat gehabt. (siehe link)

www.slipstick.com/developer/code-samples/change-the-business-card-layout-using-businesscardlayoutxml/


Werd's Mal testen denn das geht nur mit persönlichen Kontakte Ordnern denk ich als VBS Script.
Nicht auf öffentlichen Ordnern

k.A. habe ich noch nicht probiert. Aber ein Hin- und Zurückkopieren der Visitenkarten sollte auch die Einschränkung umgehen.

Gruß Quercus
Gruß Nebellicht.
Quercus
Quercus 01.04.2022 um 13:42:37 Uhr
Goto Top
Hi Nebellicht

bei deiner Zeile
Set oFolder = Outlook.GetNamespace("Mapi").Folders("Postfach").Folders("Unter-Ordner")
Kommt ne debuggermeldung wenn ich einen ordner Kontakte-test einen Kontakt markiere.

ich hab hier 3 Kontakte Ordner z.b Kontakte, Kontakte-Piv, Kontakte-test

danke noch für den Link den teste ich nächste Woche noch zusätzlich.

Gruß Quercus
colinardo
colinardo 01.04.2022 aktualisiert um 16:39:13 Uhr
Goto Top
Das VBS geht so nicht, da sind einige Fehler drin. Unter anderem fehlt auch der korrekte Verweis für den Zugriff auf die öffentlichen Ordner.
Könnte dir das jetzt zwar auch noch anpassen, aber das Powershell-Skript nutzt quasi die selbe COM-Schnittstelle funktioniert aber dafür direkt (getestet) und macht dir den Verweis auf den öffentlichen Ordner mit Angabe als Pfad komfortabel ohne das du dich mit den Interna über die Sub-Ordnerdefinition auseinander setzen musst (das habe ich mittels Schleife für dich übernommen) 😉
Quercus
Quercus 01.04.2022 um 18:11:02 Uhr
Goto Top
Besten Dank

Ich teste es face-smile

Das VBS war auf lokalem Ordner in Outlook.
Gruß Quercus
Quercus
Quercus 05.04.2022 um 11:25:02 Uhr
Goto Top
hi Colinardo

leider kommt bei deinem skrpit in Powershell folgende meldung.
Ich hab besitzerberechtigung auf den Öffentlichen Ordner, hättest du mir hier Hilfe, einen tipp woran das liegt Outlook 2016 ich kann im Öffentlichen Ördner auch neue Order erstellen hier sind alle Berechtigungen gesetzt.

PS C:\skript> .\skript.ps1
Ausnahme beim Aufrufen von "GetObject" mit 2 Argument(en):  "Die ActiveX-Komponente kann nicht erstellt werden."  
In C:\skript\skript.ps1:13 Zeichen:1
+ $objOL = [microsoft.visualbasic.interaction]::GetObject($null,"Outloo ...  
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) , MethodInvocationException
    + FullyQualifiedErrorId : Exception

New-Object : Die COM-Klassenfactory für die Komponente mit CLSID {0006F03A-0000-0000-C000-000000000046} konnte
aufgrund des folgenden Fehlers nicht abgerufen werden: 80080005 Starten des Servers fehlgeschlagen (Ausnahme von
HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
In C:\skript\skript.ps1:14 Zeichen:23
+ if (!$objOL){$objOL = New-Object -Com Outlook.Application}
+                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (:) [New-Object], COMException
    + FullyQualifiedErrorId : NoCOMClassIdentified,Microsoft.PowerShell.Commands.NewObjectCommand

Public folder path is invalid, or no access to public folders!
ERROR: Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
colinardo
colinardo 05.04.2022 aktualisiert um 12:12:51 Uhr
Goto Top
Sieht so aus als wurde Outlook wohl unvollständig ohne die nötigen VBA COM-Komponenten installiert! Das sind die typischen Fehler die auftreten wenn das der Fall ist.

screenshot
Quercus
Quercus 05.04.2022 um 12:14:30 Uhr
Goto Top
hi colinardo,

nachdem ich Outlook repariert habe und entwicklertools aktiviert habe und ein Mkro mal laufen lassen habe ist die VBS COM aktiv aber dein spript hat immer noch gleichen fehler

das code 3 sample als makro läuft auch durch bei den persönlichen kontakten. Code 3 sample
screenshot 2022-04-05 120621
Quercus
Quercus 05.04.2022 um 12:16:54 Uhr
Goto Top
Hi colinardo,

ist beides installiert laut deinem Bild ebenso neustart vom PC face-sad
colinardo
colinardo 05.04.2022 aktualisiert um 12:40:33 Uhr
Goto Top
Kann ich hier absolut nicht nachvollziehen, das Makro läuft hier im Test auf Excel Versionen von 2010-2021 unter Windows 10 und 11 ohne Probleme.
Da wird bei euch vermutlich eine GPO oder eine DCOM-Permission angepasst worden sein oder sonst eine Restriktion diesbezüglich eingeführt worden sein.
Siehe
https://stackoverflow.com/questions/22062284/server-execution-failed-exc ...

Lässt du das auf einem Server oder einem Client OS laufen? Server haben hier strengere Regeln bezüglich DCOM.
Quercus
Quercus 05.04.2022 um 12:45:51 Uhr
Goto Top
Hi

Läuft auf Windows 10 mit exchange 2013 und outlook 2016


komisch ist nur das das makro vom Link oben sauber durchläuft in den Persönlichen Kontakten...

wenn das noch funzen würde auf Öffentliche Ordner wärs auch schön...

wenn ich hier den schnipsel auf Öffentlichen Ordner setzen kann mit Kontakt-neu

Set oFolder = Application.Session.GetDefaultFolder(olFolderContacts)
Set colItems = oFolder.Items
colinardo
colinardo 05.04.2022 aktualisiert um 13:16:47 Uhr
Goto Top
Zitat von @Quercus:
komisch ist nur das das makro vom Link oben sauber durchläuft in den Persönlichen Kontakten...
Nein ist nicht komisch, denn das läuft innerhalb der Outlook Instanz, nicht von extern initiiert wie das Powershell-Skript.

Ist das ein 32 bit oder 64 Bit Office? Wenn 32bit dann musst du das Skript in einer 32bit Powershell-Konsole starten!

wenn das noch funzen würde auf Öffentliche Ordner wärs auch schön...
DCOM Berechtigung anpassen und mal den den User explizit mit Startberechtigungen hinzufügen, sollte immer in dem Fall helfen

screenshot

wenn ich hier den schnipsel auf Öffentlichen Ordner setzen kann mit Kontakt-neu

Set oFolder = Application.Session.GetDefaultFolder(olFolderContacts)
Set colItems = oFolder.Items
Kannst du auch nutzen indem du einfach den Ordner auf den PublicFolderRoot beziehst
Set oFolder = Application.Session.GetDefaultFolder(18).Folders("Business").Folders("Lieferanten")  

Das das VBA-Skript aber noch mehr im Template anpasst sollte dir klar sein ... Kann dir mein Skript auch als VBA Makro umschreiben wenn du willst.
colinardo
colinardo 05.04.2022 aktualisiert um 13:17:43 Uhr
Goto Top
Hier mal schnell das ganze noch als Outlookk-VBA Makro (Ordner-Struktur in Zeile 8 natürlich entsprechend deiner öffentlichen Ordner Struktur anpassen)
Sub ApplyTemplateToContacts()
    Dim contact As ContactItem, templateuser As ContactItem, folderContacts As Folder
    If ActiveExplorer.Selection.Count = 0 Then
        MsgBox "Kein Template User ausgewählt! Bitte wählen sie vor dem Starten des Skripts einen User aus der als Vorlage für alle anderen User gelten soll", vbExclamation  
        Exit Sub
    End If
    Set templateuser = ActiveExplorer.Selection(1)
    Set folderContacts = Application.Session.GetDefaultFolder(olPublicFoldersAllPublicFolders).Folders("Business").Folders("Lieferanten")  
    For Each contact In folderContacts.Items
        contact.BusinessCardLayoutXml = templateuser.BusinessCardLayoutXml
        contact.Save
    Next
End Sub

So jetzt hast du eigentlich alles an der Hand face-smile. Mehr kann ich für dich nicht tun.

Viel Erfolg
Grüße Uwe
Quercus
Quercus 05.04.2022 um 14:09:00 Uhr
Goto Top
Besten Dank und verneig ich teste beides nachher im testsystem jetzt aber erst mal Hunger vor lauter arbeit und nebenher noch testungen durchführen.

Gruß Markus