Office Outlook VBA Makrosunu PowerShell'e Dönüştürme
Mesleğimde bana her zaman biraz zorluk yaratan sorunlar veya isteklerle karşılaştım. Bu tür zorluklardan biri, yerel PST arşivlemesinin otomatikleştirilmesiydi (çevrimiçi arşivlemeyle karıştırılmamalıdır). Posta kutusundaki her klasörde, klasörün yerel olarak arşivlenip arşivlenmeyeceğini belirleyecek bir MAPI özelliği vardır. Bu özellik, posta kutusunun kendisinde bulunur ve kullanıcı müdahalesi olmadan bunu posta kutusu genelinde ayarlamanın otomatik bir yolu yoktur. Outlook, tüm klasörleri yerel olarak arşivleyecek şekilde ayarlayan bir düğme sağlar ancak oluşturulan yeni klasörler bu ayarı devralmaz.
Bulabildiğim tek belge MSDN'de VBA formatında bulunuyordu. Son çözümüm, uygulamaya dışarıdan erişime izin vermek için Grup İlkesi kullanmak zorunda kalmamak için bir Outlook eklentisi oluşturmaktı. Bu çözümü arıyorsanız eklentiyi buradan indirebilirsiniz. Süreç boyunca VBA makrosunu alıp onu VBS, C# ve PowerShell'e dönüştürebildim. VBA'yı bulabileceğiniz herhangi bir VBA makrosuna uygulanabilecek PowerShell'e dönüştürmenin öncesi ve sonrası.
VBA Kodu Öncesi:
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
Sonra PowerShell Kodu:
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
}
}