Followers 0

Find Outlook Archive Location All Users

4 posts in this topic

Doing some PC replacements for multi-user computers, one of the problems I run into is Outlook Archives.  Each user may have some hidden away in the default AppData location, others are a bit smarter and put them on a network location.

I think its time to come up with a script I can run as an admin on the computer that will compile the PST locations of all users to a file for me so I can make sure to not miss those in a PC swap.

I would most likely enumerate the registry, but it appears there is a COM object that I can perhaps use as well (though not sure if that would be current user only, or can be implemented for an "all user" situation) before I go on the hunt any ideas or already created scripts for this function?

Share on other sites

Hi,

This sounds pretty simple unless there is something I am missing. You can use DriveGetDrive to list the drives connected the the user's computer. Then use _FileListToArrayRec to list only .PST files. You can save the person's login name (and computer name to help identify in case they log into multiple computers) and the list of returned items. Save it to a network location. I have done such a thing when I needed to get the serial numbers, model numbers, etc off everyone's computers. By the way, I have noticed that FileListToArrayRec is much faster than Windows' built in search function.

Hopefully, this info can get you started. If you run into any trouble, let us know.

The truth has been suppressed since the dawn of time.

Share on other sites

#3 ·  Posted (edited)

Yeah I could search like that  (probably would have used powershell with get-childitem) but I am afraid of the speed of searching an entire drive when the data I need should be already on the computer.  Also if on a network storage location searching the C: would not help.

When I just looked at my computer that was not the case but a similar path did.

HKCU\Software\Microsoft\Office\14.0\Outlook\Search\Catalog

Obviously the 14/15 etc would change based on office version.  So I need to go look at some more computers to verify the information is there, if it is this is the script I have so far.

#Include <SecurityEx.au3>
#Include <Reg.au3>
#Include <Array.au3>
#Include <FileConstants.au3>
#Include <File.au3>

$aUsers = _FileListToArray("C:\Users", "*",$FLTA_FOLDERS)
For $i = 1 to$aUsers[0]

If NOT StringInStr($aUsers[$i], "Administrator") AND NOT StringInStr($aUsers[$i], "Default") AND NOT StringInStr($aUsers[$i], "All Users") AND NOT StringInStr($aUsers[$i], "Public") Then
_RegLoadHive("C:\Users\" & $aUsers[$i] & "\ntuser.dat", "HKU\" & $aUsers[$i])
For $i2 = 1 to 200$sSubKey = RegEnumVal("HKU\" & $aUsers[$i] & "\Software\Microsoft\Office\14.0\Outlook\Search\Catalog", $i2) If @Error Then ExitLoop _FileWriteLog(@DesktopDir & "\Outlook Archives.txt",$aUsers[$i] & " - " &$sSubKey)
Next
_RegUnloadHive("HKU\" & $aUsers[$i])
EndIf

Next

Edited by ViciousXUSMC

Share on other sites

Well after looking at a few computers looks like that registry path works well, so I modified to let me pick the Outlook version in use and also go ahead and copy those .pst files to a single location so that I do not need to go manually hunt them down.  Just tried it and seems to be working perfectly.

#Include <SecurityEx.au3>
#Include <Reg.au3>
#Include <Array.au3>
#Include <FileConstants.au3>
#Include <File.au3>

$vOutlookVer = InputBox("Enter Outlook Version", "Outlook 2013 = 15" & @CRLF & "Outlook 2010 = 14" & @CRLF & "Outlook 2007 = 12")$aUsers = _FileListToArray("C:\Users", "*", $FLTA_FOLDERS) For$i = 1 to $aUsers[0] If NOT StringInStr($aUsers[$i], "Administrator") AND NOT StringInStr($aUsers[$i], "Default") AND NOT StringInStr($aUsers[$i], "All Users") AND NOT StringInStr($aUsers[$i], "Public") Then _RegLoadHive("C:\Users\" &$aUsers[$i] & "\ntuser.dat", "HKU\" &$aUsers[$i]) For$i2 = 1 to 200
$sSubKey = RegEnumVal("HKU\" &$aUsers[$i] & "\Software\Microsoft\Office\" &$vOutlookVer & ".0\Outlook\Search\Catalog", $i2) If @Error Then ExitLoop If StringRegExp($sSubKey, ".*\.pst$") Then DirCreate(@DesktopDir & "\Outlook Archives\" &$aUsers[$i]) _FileWriteLog(@DesktopDir & "\Outlook Archives\Outlook Archives.txt",$aUsers[$i] & " - " &$sSubKey)
FileCopy($sSubKey, @DesktopDir & "\Outlook Archives\" &$aUsers[$i] & "\" &$aUsers[$i] & "-" &$i2 & ".pst")
EndIf

Next
_RegUnloadHive("HKU\" & $aUsers[$i])
EndIf

Next

MsgBox(0, "BoCC Automation", "Copy of Outlook Archives Completed")

Create an account

Register a new account

Followers 0

• Similar Content

• By Smigacznr1
I'm writing Outlook pst cleaner and now I'm stuck. Compiled script is crashing with OS crash message. When I tryied to run script from editor it's exiting itself (mabye it's some type of crash?) always when it's processing on 4-rd pst file. Here is my code:
#include <OutlookEX.au3> #include <Date.au3> #include <File.au3> #include <Array.au3> _cleanOutlook("Administrator") _cleanOutlook("Admin") Exit Func _cleanOutlook($user)$foldery = "Wiadomości-śmieci#?SPAM#?Junk E-mail#?Elementy usunięte#?Deleted Items" $tab_folderow = StringSplit($foldery, "#?", 1) $tab_pst = _FileListToArrayRec("c:\users\" &$user, "*.pst", 1+4+8, 1, 0, 2) ;~ _ArrayDisplay($tab_pst) For$d = 1 To UBound($tab_pst) -1 Step +1$outlook = _OL_Open(True) _OL_Close($outlook, True)$outlook = _OL_Open() Local $aStores = _OL_StoreGet($outlook) ;~ _ArrayDisplay($aStores) For$i = 1 to $aStores[0][0] If$aStores[$i][4] = True Then ;~ ConsoleWrite(@CRLF & "zamykam pst 2") _OL_PSTClose($outlook,$aStores[$i][0]) EndIf Next ;~ _OL_PSTAccess($outlook, "C:\Users\Administrator\Desktop\cos.pst") _OL_PSTAccess($outlook, $tab_pst[$d]) ConsoleWrite(@CRLF & $tab_pst[$d]) ;~ $tab_struktury = _OL_FolderTree($outlook, "*", 10) ;~ If @error Then ;~ ContinueLoop ;~ EndIf ;~ _ArrayDisplay($tab_struktury)$tab_ktory_pst = _OL_PSTGet($outlook) ;~ _ArrayDisplay($tab_ktory_pst) For $a = 0 To UBound($tab_ktory_pst) -1 Step +1 If $tab_ktory_pst[$a][2] = $tab_pst[$d] Then ;~ MsgBox(0, "", $tab_ktory_pst[$a][0]) $nazwa_bazy_pst =$tab_ktory_pst[$a][0] EndIf Next ;~ MsgBox(0, "", UBound($tab_folderow)) ;~ _ArrayDisplay($tab_folderow,$tab_pst[$d]) ConsoleWrite(@CRLF & "przed while")$a = 0 While $a < 2 ConsoleWrite(@CRLF & "while 1") For$b = 1 To UBound($tab_folderow) -1 Step +1 ConsoleWrite(@CRLF & "for 1")$tab_struktury = _OL_FolderTree($outlook,$nazwa_bazy_pst) ;~ _ArrayDisplay($tab_struktury,$nazwa_bazy_pst) ;~ $folder = _OL_FolderAccess($outlook, StringTrimLeft($tab_struktury[0], 2) & "\" &$tab_folderow[$b])$folder = _OL_FolderAccess($outlook,$nazwa_bazy_pst & "\" & $tab_folderow[$b]) ;~ ConsoleWrite(@CRLF & "eeee") If @error Then ;~ MsgBox(0, "", "\\" & $nazwa_bazy_pst & "\" &$tab_folderow[$b] & @CRLF & @error) ConsoleWrite(@CRLF & "przechodze do kolejnego " &$b+1) ContinueLoop EndIf ;~ _ArrayDisplay($folder,$nazwa_bazy_pst) ConsoleWrite(@CRLF & $tab_folderow[$b]) If $tab_folderow[$b] = "Deleted Items" Or $tab_folderow[$b] = "Elementy usunięte" Then ConsoleWrite(@CRLF & "usuwam kosze") _OL_FolderDelete($outlook,$folder[1], 1) _OL_FolderDelete($outlook,$folder[1], 2) _OL_FolderDelete($outlook,$folder[1], 3) _OL_FolderDelete($outlook,$folder[1], 4) ;~ _OL_FolderDelete($outlook,$folder[1], 5) EndIf If $a = 0 Then$tab_maile = "" $data_dzis = @YEAR & "/" & @MON & "/" & @MDAY & " 00:00" ;~$data_dzis = "2017/01/31 00:00" $data_szukana = _DateAdd("D", "-3",$data_dzis) $tab_maile = _OL_ItemFind($outlook, $folder[1],$olMail, "[Received]<'" & StringReplace($data_szukana, "/", "-") & "'", "", "", "EntryID", "", 1) If @error Then ContinueLoop EndIf ;~ If UBound($tab_maile) > 1 Then ;~ _ArrayDisplay($tab_maile) ;~ EndIf If UBound($tab_maile) > 1 Then For $c = 1 To UBound($tab_maile) -1 Step +1 ;~ ConsoleWrite(@CRLF & "usuwam stare maile") _OL_ItemDelete($outlook,$tab_maile[$c][0], "", False) Next EndIf EndIf Next$a = $a + 1 WEnd ;~ ConsoleWrite(@CRLF & "pokazuje") ;~$folder[1].Display $olFolderInbox.Display ;~ _OL_PSTClose($outlook, $olFolderInbox) ;~ If @error Then ;~ MsgBox(0, "", @error) ;~ EndIf Local$aStores = _OL_StoreGet($outlook) ;~ _ArrayDisplay($aStores) For $i = 1 to$aStores[0][0] If $aStores[$i][4] = True Then ;~ ConsoleWrite(@CRLF & "zamykam pst 1") _OL_PSTClose($outlook,$aStores[$i][0]) EndIf Next ;_OL_PSTClose($outlook, $folder[1]) _OL_Close($outlook, True) If @error Then MsgBox(0, "", @error) EndIf ConsoleWrite(@CRLF & "zamykam") ProcessWaitClose("outlook.exe", 30) ProcessClose("outlook.exe") Next EndFunc
Outlook and OS is updated. I'm usinn OutlooEX in ver. 1.3.1.0
Any ideas?

• By Gowrisankar
Dear members of the forum,
I'm new to AutoIt and I'm having a good time exploring and enjoying the features of AutoIt.
For one of my tasks, I've to open few particular mails from outlook based on subject of the mails and then print the mails. Can someone please guide me how to do it?
My question could be very silly for experts. But I'm just a beginner. Kindly advice.
Thanks and regards,
Gowrisankar R.
• By water
Anyony interested in a function to retrieve the Outlook mailbox quotas for Exchange mailboxes?
If yes, then this function could be added to the OutlookEX UDF.
Result could look like (will later be returned in an array):

• By ur
I wrote a macro for outlook to send an email.
Till yesterday it worked, don't know why it is not working today
I am getting below error when I ran the macro.

• By ur
Through below script I am able to send mail with the Outlook installed in my machine.

But I am getting below prompt whenever I ran this script,by Outlook.
Can anyone suggest how to suppress this.
#include <MsgBoxConstants.au3> ; Counting the number of open shell windows Local $oShell = ObjCreate("Outlook.Application") ; Get the Windows Shell Object If IsObj($oShell) Then $Mail =$oShell.CreateItem(0) $Mail.To = "dponnada@erwin.com"$Mail.Subject = "Action" $Mail.Body ="Pay rise please"$Mail.Send() EndIf