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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 2356158063
Url: https://administrator.de/contentid/2356158063
Ausgedruckt am: 25.11.2024 um 02:11 Uhr
19 Kommentare
Neuester Kommentar
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
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
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.
Grüße Uwe
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)
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.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?
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
Hallo Quercus,
ich habe mal die erste Zeile
Code Sample 3: Change the business card layout to match the selected contact
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.
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) 😉
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) 😉
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.
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.
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.komisch ist nur das das makro vom Link oben sauber durchläuft in den Persönlichen Kontakten...
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 helfenwenn ich hier den schnipsel auf Öffentlichen Ordner setzen kann mit Kontakt-neu
Kannst du auch nutzen indem du einfach den Ordner auf den PublicFolderRoot beziehstSet oFolder = Application.Session.GetDefaultFolder(olFolderContacts)
Set colItems = oFolder.Items
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.
Hier mal schnell das ganze noch als Outlookk-VBA Makro (Ordner-Struktur in Zeile 8 natürlich entsprechend deiner öffentlichen Ordner Struktur anpassen)
So jetzt hast du eigentlich alles an der Hand . Mehr kann ich für dich nicht tun.
Viel Erfolg
Grüße Uwe
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 . Mehr kann ich für dich nicht tun.
Viel Erfolg
Grüße Uwe