Az Office Outlook VBA makró konvertálása PowerShell formátumba
Szakmámban mindig olyan problémákkal, kérésekkel szembesültem, amelyek egy kis kihívást jelentenek. Az egyik ilyen kihívás a helyi PST archiválás automatizálása volt (nem tévesztendő össze az online archiválással). A postafiók minden mappájában található egy MAPI tulajdonság, amely azonosítja, hogy a mappát helyileg archiválni kell-e vagy sem. Ez a tulajdonság magában a postafiókban található, és nincs automatikus mód ennek a postafiókban történő beállítására felhasználói beavatkozás nélkül. Az Outlook rendelkezik egy gombbal, amely beállítja az összes mappát helyi archiválásra, de az újonnan létrehozott mappák nem öröklik a beállítást.
Az egyetlen dokumentáció, amit találtam, az MSDN-en található itt VBA formátumban. A végső megoldás az volt, hogy létrehoztam egy Outlook-bővítményt, hogy ne kelljen csoportházirendet használni az alkalmazás külső hozzáférésének engedélyezéséhez. Ha ezt a megoldást keresi, innen töltheti le a bővítményt. A folyamat során sikerült átvennem a VBA makrót, és átalakítani VBS-re, C#-ra és PowerShell-re. Íme, a VBA PowerShell formátumba konvertálásakor az előtte és utána, amely bármely talált VBA-makróra alkalmazható.
VBA kód előtt:
Function ChangeAgingProperties(oFolder As Outlook.Folder, _
AgeFolder As Boolean, DeleteItems As Boolean, _
FileName As String, Granularity As Integer, _
Period As Integer, Default As Integer) As Boolean
'6 MAPI properties for aging items in a folder
Const PR_AGING_AGE_FOLDER = _
"http://schemas.microsoft.com/mapi/proptag/0x6857000B"
Const PR_AGING_DELETE_ITEMS = _
"http://schemas.microsoft.com/mapi/proptag/0x6855000B"
Const PR_AGING_FILE_NAME_AFTER9 = _
"http://schemas.microsoft.com/mapi/proptag/0x6859001E"
Const PR_AGING_GRANULARITY = _
"http://schemas.microsoft.com/mapi/proptag/0x36EE0003"
Const PR_AGING_PERIOD = _
"http://schemas.microsoft.com/mapi/proptag/0x36EC0003"
Const PR_AGING_DEFAULT = _
"http://schemas.microsoft.com/mapi/proptag/0x685E0003"
Dim oStorage As StorageItem
Dim oPA As PropertyAccessor
' Valid Period:
' 1-999
'
' Valid Granularity:
' 0=Months, 1=Weeks, 2=Days
'
' Valid Default:
' 0=All settings do not use a default setting
' 1=Only the file location is defaulted
' "Archive this folder using these settings" and
' "Move old items to default archive folder" are checked
' 3=All settings are defaulted
' "Archive items in this folder using default settings" is checked
If (oFolder Is Nothing) Or _
(Granularity < 0 Or Granularity > 2) Or _
(Period < 1 Or Period > 999) Or _
(Default < 0 Or Default = 2 Or Default > 3) _
Then
ChangeAgingProperties = False
End If
On Error GoTo Aging_ErrTrap
'Create or get solution storage in given folder by message class
Set oStorage = oFolder.GetStorage( _
"IPC.MS.Outlook.AgingProperties", olIdentifyByMessageClass)
Set oPA = oStorage.PropertyAccessor
If Not (AgeFolder) Then
oPA.SetProperty PR_AGING_AGE_FOLDER, False
Else
'Set the 6 aging properties in the solution storage
oPA.SetProperty PR_AGING_AGE_FOLDER, True
oPA.SetProperty PR_AGING_GRANULARITY, Granularity
oPA.SetProperty PR_AGING_DELETE_ITEMS, DeleteItems
oPA.SetProperty PR_AGING_PERIOD, Period
If FileName <> "" Then
oPA.SetProperty PR_AGING_FILE_NAME_AFTER9, FileName
End If
oPA.SetProperty (PR_AGING_DEFAULT), Default
End If
'Save changes as hidden messages to the associated portion of the folder
oStorage.Save
ChangeAgingProperties = True
Exit Function
Aging_ErrTrap:
Debug.Print Err.Number, Err.Description
ChangeAgingProperties = False
End Function
PowerShell kód után:
Function ChangeAgingProperties ( [string]$Folder, [boolean]$AgeFolder, [boolean] $DeleteItems, [string]$FileName, [int]$Granularity, [int]$Period, [int]$Default)
{
#6 MAPI properties for aging items in a folder
$PR_AGING_AGE_FOLDER = "http://schemas.microsoft.com/mapi/proptag/0x6857000B"
$PR_AGING_PERIOD = "http://schemas.microsoft.com/mapi/proptag/0x36EC0003"
$PR_AGING_GRANULARITY = "http://schemas.microsoft.com/mapi/proptag/0x36EE0003"
$PR_AGING_DELETE_ITEMS = "http://schemas.microsoft.com/mapi/proptag/0x6855000B"
$PR_AGING_FILE_NAME_AFTER9 = "http://schemas.microsoft.com/mapi/proptag/0x6859001E"
$PR_AGING_DEFAULT = "http://schemas.microsoft.com/mapi/proptag/0x685E0003"
# Valid Period:
# 1 - 999
#
# Valid Granularity:
# 0=Months, 1=Weeks, 2=Days
#
# Valid Default:
# 0 = All settings do not use a default setting
# 1=Only the file location is defaulted
# "Archive this folder using these settings" and
# "Move old items to default archive folder" are checked
# 3 = All settings are defaulted
# "Archive items in this folder using default settings" is checked
if (($objFolder -eq $null) -or ($Granularity -lt 0 -or $Granularity -gt 2) -or ($Period -lt 1 -or $Period -gt 999) -or ($Default -lt 0 -or $Default -eq 2 -or $Default -gt 3))
{
return $False
}
Try
{
$app = New-Object -ComObject Outlook.Application
$namespace = $app.GetNamespace("MAPI")
$objFolder = $namespace.GetFolder($Folder)
$oStorage = $objFolder.GetStorage("IPC.MS.Outlook.AgingProperties", $olIdentifyByMessageClass)
$oPA = $oStorage.PropertyAccessor
If ($AgeFolder -eq $false)
{
oPA.SetProperty PR_AGING_AGE_FOLDER, False
}
Else
{
#Set the 6 aging properties in the solution storage
$oPA.SetProperty($PR_AGING_AGE_FOLDER, $True)
$oPA.SetProperty($PR_AGING_GRANULARITY, $Granularity)
$oPA.SetProperty($PR_AGING_DELETE_ITEMS, $DeleteItems)
$oPA.SetProperty($PR_AGING_PERIOD, $Period)
if ($FileName -ne $null)
{
$oPA.SetProperty($PR_AGING_FILE_NAME_AFTER9, $FileName)
}
$oPA.SetProperty($PR_AGING_DEFAULT, $Default)
}
#Save changes as hidden messages to the associated portion of the folder
$oStorage.Save()
return $True
}
Catch
{
Write-Output $_
return $False
}
}