Page 2 of 2 <12
Topic Options
#202720 - 2011-07-21 02:04 AM Re: PST locate and log... [Re: NTDOC]
Tsguy Offline
Getting the hang of it

Registered: 2010-01-18
Posts: 67
Loc: Oregon
I'm back \:\)

Darn project managers and their changing wants / needs.

I've got some requests for amendments to this script as it was last posted. I've gotten all the requests sorted out except for one.

It's been decided that we'd like to use this script to centralize PST's on a new share location, and re-attach the moved PST's to the default outlook profile once they are moved.

I have the following code from the original script:

 Code:
 
; re-associate the PST registry key with the new location 
;'; reassociate' 
$_ = AtoU($NewPST)
$_ = WriteValue($aPSTKeys[$], '001f6700-0', $_, 'REG_BINARY')


Seems like it should go through, but it does not. Is it possible that it's not working since I'm still 'deleting' the $aPSTKeys[$] earlier within the script?

This is a lengthy script and the other adjustments are simply messagebox popups which shouldn't be affecting this problem. If I need to post the full meal deal again to help sort this out I will.

Much thanks for your thoughts and advice,

Lan

Top
#202721 - 2011-07-21 02:57 AM Re: PST locate and log... [Re: Tsguy]
ShaneEP Moderator Offline
MM club member
*****

Registered: 2002-11-29
Posts: 2125
Loc: Tulsa, OK
Nothing seems wrong with those two lines, as long as all the variables are indeed populated correctly. What error(s) is it generating?
Top
#202724 - 2011-07-21 05:55 PM Re: PST locate and log... [Re: ShaneEP]
Tsguy Offline
Getting the hang of it

Registered: 2010-01-18
Posts: 67
Loc: Oregon
heh . .good question. I hadn't gone thru a debug on it yet. Will step thru that in a few minutes.

Will also post the full code in a few.

Lan

Top
#202725 - 2011-07-21 07:17 PM Re: PST locate and log... [Re: Tsguy]
Glenn Barnas Administrator Offline
KiX Supporter
*****

Registered: 2003-01-28
Posts: 4396
Loc: New Jersey
How many PSTs are we talking about here? You do know that Microsoft does not recommend or support the use of PST files across a network? I've seen a file server brought to its knees with as few as 40-50 open PST files.

Glenn
_________________________
Actually I am a Rocket Scientist! \:D

Top
#202726 - 2011-07-21 08:26 PM Re: PST locate and log... [Re: Glenn Barnas]
Tsguy Offline
Getting the hang of it

Registered: 2010-01-18
Posts: 67
Loc: Oregon
Current full code:

 Code:
Break On

Dim $, $_ ; temp, throwaway var 
Dim $aPSTPaths[0] ; Array of PST paths 
Dim $aPSTKeys[0] ; Array of PST key paths 
Dim $RootPath ; registry root path 
Dim $WKey ; working key path 
Dim $EKey ; enumerated registry path 
Dim $TVal ; temp value for 
Dim $aIndex, $eIndex ; index pointers for array and enumeration 
Dim $MServer, $DName, $DProfile ; user data vars 
Dim $aMapped ; array of mapped network drives 
Dim $Drv, $NetFlag, $IsNet, $MoveFlag ; Drive letter enumerator, Network Only flag, IsNetwork flag, Move Flag 
Dim $PSTName, $PSTPath ; name & Path of current PST file 
Dim $NewPSTName, $NewPSTPath ; name of renamed PST file or new Path 
Dim $NewPSTRoot ; path of new PST path, when moving instead of renaming 
Dim $LogPath ; UNC path where logs are written 
Dim $Log ; Log file for this session
Dim $OLDPST ; old PST info
Dim $NewPST ; new PST info
Dim $Message ; message box message
Dim $UserDir ; user specific directory

$ = SetOption('Explicit', 'On')
$ = SetOption('WrapAtEOL', 'On')
$ = SetOption('NoVarsInStrings', 'On')
$ = SetOption('NoMacrosInStrings', 'On')

; # # # # # START OF CUSTOM PARAMETERS # # # # # 
$MoveFlag = 1 ; Move files if 1, otherwise disassociate and rename 
$LogPath = 'z:\pst\logs\' ; UNC path where renamed PST file locations are logged 
$NewPSTPath = 'c:\temp\' + @userid + '\'; UNC or mapped drive 
; # # # # # END OF CUSTOM PARAMETERS # # # # # 

; Identify PST

$RootPath = 'HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles'

; get list of mapped drives 
$aMapped = WMIMappedDrives()

$DProfile = ReadValue($RootPath, 'DefaultProfile')
$WKey = $RootPath + '\' + $DProfile + '\'

$MServer = ReadValue($WKey + '13dbb0c8aa05101a9bb000aa002fc45a', '001e6602')
$DName = UtoA(ReadValue($WKey + '13dbb0c8aa05101a9bb000aa002fc45a', '001f3001'))

; find the PST files associated with this profile - need to enumerate each subkey and find the 001f6700 value 
$eIndex = 0
$aIndex = -1
$EKey = EnumKey($WKey, $eIndex)
While Not @ERROR
$TVal = UtoA(ReadValue($WKey + $EKey, '001f6700'))
If $TVal
$aIndex = $aIndex + 1
ReDim Preserve $aPSTPaths[$aIndex]
ReDim Preserve $aPSTKeys[$aIndex]
$aPSTPaths[$aIndex] = $TVal
$aPSTKeys[$aIndex] = $WKey + $EKey
EndIf
$eIndex = $eIndex + 1
$EKey = EnumKey($WKey, $eIndex)
Loop

; Exit if nothing to do 
If $aIndex < 0
'No PST files are registered for user ' $DName ' - exiting!' ? ?
Exit 0
EndIf

; now have all needed info 
; - terminate Outlook if it is running 
; - delete the PST registry keys 
; - rename the PST files 
; - copy the PST file to the network share

If Not Exist ($NewPSTPath)
	MD $NewPSTPath
EndIf

; terminate Outlook 
$ = Split(WMIProcessList('outlook.exe')[0], ',')[1]
If Not @ERROR
' Closing Outlook...' ?
$ = WMIProcessKill($) ; terminate Outlook 
Sleep 3 ; wait for Outlook to close open files 
EndIf

; Enumerate the PST files that are registered in Outlook 
For $ = 0 to UBound($aPSTPaths)

$Drv = Left($aPSTPaths[$], 2) ; drive letter where PST is stored 
$_ = InStrRev($aPSTPaths[$], '\')
$PSTName = SubStr($aPSTPaths[$], $_ + 1) ; get name part 
$PSTPath = Left($aPSTPaths[$], $_) ; get path part 

; Disassociate by deleting the registry key 

$_ = DelTree($aPSTKeys[$])

; Rename and move the files

$NewPSTName = @USERID + '_' + Join(Split(Join(Split($PSTName, ' '), '_'), '.pst'), '.pst')

Move $PSTPath + $PSTName $PSTPath + $NewPSTName
Move $PSTPath + $NewPSTName $NewPSTPath + $NewPSTName

$OldPST = $PSTPath + $PSTName
$NewPST = $NewPSTPath + $NewPSTName

$Log = $LogPath + '\' + @WKSTA + @userid +'.txt'

Open (1,$Log,5)
Writeline (1,$OldPST + @CRLF)
Writeline (1,$NewPST + @CRLF)
Writeline (1,@CRLF)
Close (1)

; re-associate the PST registry key with the new location 
;'; reassociate' 
$_ = AtoU($NewPST)
$_ = WriteValue($aPSTKeys[$], '001f6700-0', $_, 'REG_BINARY')


Next

$Message = '             PST Move completed, you may now open outlook again.              '
MessageBox ($Message,"                ***PST Consolidation completed***                   ",0,10)


Exit 0



; convert Unicode strings to ASCII 
Function UtoA($_String)

; return if string is empty 
If Not $_String Exit 0 EndIf

Dim $_S, $_I ; temp string, index pointer 

; get each character pair as hex and convert to ASCII character 
For $_I = 1 to Len($_String) Step 4
$_S = $_S + Chr(Val('&' + SubStr($_String, $_I, 2)))
Next

$UtoA = $_S
Exit 0

EndFunction

Function AtoU($_String)

Dim $_S, $_I ; temp string, index pointer 

; get each ASCII character and convert to hex words 
For $_I = 1 to Len($_String)
$_S = $_S + Right('00' + DecToHex(Asc(SubStr($_String, $_I, 1))), 2) + '00'
Next

$AtoU = LCase($_S) + '0000'
Exit 0 

EndFunction



;; 
;;====================================================================== 
;; 
;;FUNCTION TimeDiff() 
;; 
;;AUTHOR Glenn Barnas 
;; 
;;VERSION 2.2 / 2007/10/14 
;; Modified to increase accuracy, permit fracional second calculations 
;; 2.1 / 2007/03/17 
;; added "now" and "today" options for both start and end times 
;; 2.0 / 2006/11/20 
;; Changes for code efficiency; added defaults for midnight 
;; 
;;ACTION Calculates the time difference between two given date/time strings 
;; 
;;SYNTAX TimeDiff(Start [, End] [, Format] [, MSec]) 
;; 
;;PARAMETERS Start - REQUIRED, String value representing the start timestamp 
;; Format yyyy/mm/dd hh:mm:ss 
;; 
;; End - OPTIONAL, Defaults to "now" 
;; String value representing the ending time 
;; Format yyyy/mm/dd hh:mm:ss 
;; Can be the special value "now" for the current date/time, or "today" 
;; for midnight of the current day. 
;; 
;; When the time value is not specified, it defaults to 00:00:00.000 (midnight) 
;; 
;; Format - OPTIONAL, one of: 
;; "m" - return minutes 
;; "h" - return hours 
;; "d" - return days 
;; "y" - return years 
;; When a format value is specified, it returns the fractional part (ie 0.5 days for 12 hours). 
;; 
;; MSec - OPTIONAL, True if the fractional seconds should be returned. Default 
;; is false, returning whole seconds, to maintain compatibility with earlier versions. 
;; MSec only affects the return of fractional seconds, not fractional parts of other time formats. 
;; 
;;REMARKS Returns a value representing the difference in time between two date/time 
;; strings. Assumes that "Start" is in the past, but will properly return a 
;; negative value if it is in the future. 
;; 
;;RETURNS Double - difference between Start and End timestamps in seconds 
;; 
;;DEPENDENCIES None 
;; 
;;TESTED WITH Kix 4.2+, NT4, W2K, WXP, W2K3 
;; 
;;EXAMPLES If TimeDiff(GetFileTime('SomeFile.txt'), 'now', 'h') > 48 
;; "File is more than 2 days old!" ? 
;; EndIf 
; 
Function TimeDiff($_Start, OPTIONAL $_End, OPTIONAL $_Fmt, OPTIONAL $_MSec)

Dim $_, $_SDate, $a_Start, $_EDate, $a_End, $_Duration

; Check for special START parameters 
Select
Case $_Start = 'now'
$_Start = @DATE + ' ' + @TIME + '.' + @MSECS
Case $_START = 'today'
$_Start = @DATE + ' 00:00:00.000'
EndSelect

; Check for special END parameters 
Select
Case $_End = 'now' Or $_End = '' 
$_End = @DATE + ' ' + @TIME + '.' + @MSECS
Case $_End = 'today'
$_End = @DATE + ' 00:00:00.000'
EndSelect

; Validate parameters 
; Parameters passed are "yyyy/mm/dd hh:mm:ss[.sss]" - make sure the default time is added 
$a_Start = Split(Join(Split(Join(Split($_Start + ' 00:00:00.000', '/'), ' '), ':'), ' '), ' ', 6)
If UBound($a_Start) <> 5 Exit 87 EndIf ; bad start time parameter 
For $_ = 0 to 5
$a_Start[$_] = CDbl($a_Start[$_]) ; convert to numeric values 
Next

$a_End = Split(Join(Split(Join(Split($_End + ' 00:00:00.000', '/'), ' '), ':'), ' '), ' ', 6)
If UBound($a_End) <> 5 Exit 87 EndIf ; bad start time parameter 
For $_ = 0 to 5
$a_End[$_] = CDbl($a_End[$_]) ; convert to numeric values 
Next

; Convert dates to Days, then convert to seconds and add the time value 
If $a_Start[1] < 3
$a_Start[1] = $a_Start[1] + 12
$a_Start[0] = $a_Start[0] - 1
EndIf
$_SDate = $a_Start[2] + ( 153 * $a_Start[1] - 457 ) / 5 + 365 * $a_Start[0] + $a_Start[0] / 4 - $a_Start[0] / 100 + $a_Start[0] / 400 - 306
$_SDate = CDbl($_SDate) * 86400.0
$_SDate = $_SDate + $a_Start[3] * 3600 + $a_Start[4] * 60 + $a_Start[5]

If $a_End[1] < 3
$a_End[1] = $a_End[1] + 12
$a_End[0] = $a_End[0] - 1
EndIf
$_EDate = $a_End[2] + ( 153 * $a_End[1] - 457 ) / 5 + 365 * $a_End[0] + $a_End[0] / 4 - $a_End[0] / 100 + $a_End[0] / 400 - 306
$_EDate = CDbl($_EDate) * 86400.0
$_EDate = $_EDate + $a_End[3] * 3600 + $a_End[4] * 60 + $a_End[5]

; Get the duration between the timestamps 
$_Duration = CDbl($_EDate - $_SDate)

; Trim fractional seconds if the MSec flag wasn't set 
; Value returned is whole seconds 
If Not $_MSec
$_Duration = CInt($_Duration)
EndIf

; Return data as a Double - seconds (default), hours, minutes, days, or years 
Select
Case $_Fmt = 'm' ; minutes 
$TimeDiff = $_Duration / 60.0
Case $_Fmt = 'h' ; hours 
$TimeDiff = $_Duration / 3600.0
Case $_Fmt = 'd' ; days 
$TimeDiff = $_Duration / 86400.0
Case $_Fmt = 'y' ; years 
$TimeDiff = $_Duration / 31536000.0
Case 1
$TimeDiff = $_Duration
EndSelect

Exit 0

EndFunction




;; 
;;====================================================================== 
;; 
;;FUNCTION WMIMappedDrives() 
;; 
;;ACTION Return a list of mapped drives from a computer 
;; 
;;AUTHOR Glenn Barnas 
;; 
;;VERSION 1.0 / 2008/03/24 
;; 
;;SYNTAX WMIMappedDrives([, AuthPtr]) 
;; 
;;PARAMETERS AuthPtr - OPTIONAL - pre-authenticated WMI object pointer 
;; Use WMIAuthentication() udf to create the AuthPtr value 
;; AuthPtr is not needed if user has admin rights 
;; 
;;REMARKS By default, returns a detailed list of all processes from the local computer. An 
;; alternate computer can be specified, as can a specific process. When specifying 
;; processes, you can use a name (cmd.exe) or process ID. If you specify a name, all 
;; processeses matching that name will be returned, while specifying a PID will return 
;; exactly one element that matches that process (if it was found) 
;; If no match is found, the function exits with status 2 (file not found) 
;; 
;;RETURNS Array of drive letter / UNC Path arrays 
;; 
;;DEPENDENCIES WMI, 
;; 
;;TESTED WITH W2K, WXP, W2K3, Vista, x64 
;; 
;;EXAMPLES 
; 
Function WMIMappedDrives(OPTIONAL $_pAuth)

Dim $_objWMIService, $_colItems, $_objItem ; WMI object vars 
Dim $_Line ; line string 
Dim $_aTmp[0], $_I ; return array, index 
Dim $_ ; temp var 

$_I = -1

; If a pre-authenticated WMI object pointer was provided, use it, otherwise create a new object pointer 
If $_pAuth
$_objWMIService = $_pAuth
Else
$_objWMIService = GetObject('winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2')
If @ERROR Exit Val('&' + Right(DecToHex(@ERROR), 4)) EndIf
EndIf

; get the collection of process objects 
$_colItems = $_objWMIService.ExecQuery("Select * from Win32_MappedLogicalDisk",,48)
If @ERROR $_colItems = 0 Exit Val('&' + Right(DecToHex(@ERROR), 4)) EndIf

; Enumerate the collection of process data 
For Each $_objItem in $_colItems
$_I = $_I + 1
ReDim Preserve $_aTmp[$_I]
$_aTmp[$_I] = $_objItem.Name, $_objItem.ProviderName
Next

; return the array, close the collection, and gripe if no items were found 
$WMIMappedDrives = $_aTmp
$_colItems = 0
Exit 0

EndFunction



;; 
;;====================================================================== 
;; 
;;FUNCTION WMIProcessKill() 
;; 
;;ACTION Terminates a specific process by numeric PID 
;; 
;;AUTHOR Glenn Barnas 
;; 
;;VERSION 1.0 / 2007/10/20 
;; 
;;SYNTAX WMIProcessKill(Process [, Computer] [, AuthPtr]) 
;; 
;;PARAMETERS Process - PID of process to terminate 
;; 
;; Computer - OPTIONAL, Name of computer to target 
;; 
;; AuthPtr - OPTIONAL - pre-authenticated WMI object pointer 
;; Use WMIAuthentication() udf to create the AuthPtr value 
;; AuthPtr is not needed if user has admin rights 
;; 
;;REMARKS Terminates the process after verifying it exists 
;; 
;;RETURNS 1 (success) or 0 (failure) 
;; 
;;DEPENDENCIES WMI 
;; 
;;TESTED WITH W2K, WXP, W2K3, Vista, x64 
;; 
;;EXAMPLES 
; 
Function WMIProcessKill($_Process, Optional $_Computer, OPTIONAL $_pAuth)

Dim $_objWMIService, $_colItems, $_objItem ; WMI object vars 
Dim $_ ; temp var 
Dim $_Err ; error code 

; Must be a single numeric value to terminate 
If Val($_Process) <> $_Process
$WMIProcessKill = 0
Exit 87
EndIf

; insure a properly formatted computer name, default to local computer is not specified 
$_Computer = IIf(Not $_Computer, '.', Join(Split($_Computer,'\'),''))

; If a pre-authenticated WMI object pointer was provided, use it, otherwise create a new object pointer 
If $_pAuth
$_objWMIService = $_pAuth
Else
$_objWMIService = GetObject('winmgmts:{impersonationLevel=impersonate}!\\' + $_Computer + '\root\cimv2')
If @ERROR Exit Val('&' + Right(DecToHex(@ERROR), 4)) EndIf
EndIf

; get the collection of process objects 
$_colItems = $_objWMIService.ExecQuery("Select * from Win32_Process Where ProcessID=" + '"' + $_Process + '"',,48)
If @ERROR $_colItems = 0 Exit Val('&' + Right(DecToHex(@ERROR), 4)) EndIf

$_Err = 2 ; prepare for not found 

; Enumerate the collection of process data 
For Each $_objItem in $_colItems
$_ = $_objItem.Terminate
$_Err = @ERROR
Next
$_colItems = 0

; return appropriate values 
$WMIProcessKill = Not $_Err
Exit $_Err

EndFunction



;; 
;;====================================================================== 
;; 
;;FUNCTION WMIProcessList() 
;; 
;;ACTION Return a list of process info from a computer 
;; 
;;AUTHOR Glenn Barnas 
;; 
;;VERSION 1.0 / 2007/10/12 
;; Written as a replacement for PSList(), which uses SysInternals PSList.exe 
;; 
;;SYNTAX WMIProcessList([Process] [, Computer] [, AuthPtr]) 
;; 
;;PARAMETERS Process - return information about a specific process (group) by name 
;; or individual process ID (PID) 
;; 
;; Computer - OPTIONAL, Name of computer to query 
;; 
;; AuthPtr - OPTIONAL - pre-authenticated WMI object pointer 
;; Use WMIAuthentication() udf to create the AuthPtr value 
;; AuthPtr is not needed if user has admin rights 
;; 
;;REMARKS By default, returns a detailed list of all processes from the local computer. An 
;; alternate computer can be specified, as can a specific process. When specifying 
;; processes, you can use a name (cmd.exe) or process ID. If you specify a name, all 
;; processeses matching that name will be returned, while specifying a PID will return 
;; exactly one element that matches that process (if it was found) 
;; If no match is found, the function exits with status 2 (file not found) 
;; 
;;RETURNS Array of comma-delimited values, one element per process: 
;; Process Name 
;; Process ID (PID) 
;; Thread Count 
;; Handle Count 
;; Memory Usage (Bytes) 
;; User Time D:HH:MM:SS.sss format 
;; Kernel Time D:HH:MM:SS.sss format 
;; Elapsed Time D:HH:MM:SS.sss format 
;; 
;;DEPENDENCIES WMI, TimeDiff() external UDF 
;; 
;;TESTED WITH W2K, WXP, W2K3, Vista, x64 
;; 
;;EXAMPLES 
; 
Function WMIProcessList(OPTIONAL $_Process, Optional $_Computer, OPTIONAL $_pAuth)

Dim $_objWMIService, $_colItems, $_objItem ; WMI object vars 
Dim $_Line ; line string 
Dim $_aTmp[0], $_I ; return array, index 
Dim $_ ; temp var 
Dim $_BTime, $_CTime ; boot and current times from target system 

$_I = -1

; insure a properly formatted computer name, default to local computer is not specified 
$_Computer = IIf(Not $_Computer, '.', Join(Split($_Computer,'\'),''))

; If a pre-authenticated WMI object pointer was provided, use it, otherwise create a new object pointer 
If $_pAuth
$_objWMIService = $_pAuth
Else
$_objWMIService = GetObject('winmgmts:{impersonationLevel=impersonate}!\\' + $_Computer + '\root\cimv2')
If @ERROR Exit Val('&' + Right(DecToHex(@ERROR), 4)) EndIf
EndIf

; Get the current and boot times from the client system 
$_colItems = $_objWMIService.ExecQuery("Select * from Win32_OperatingSystem",,48)
For Each $_objItem in $_colItems
$_BTime = $_objItem.LastBootUpTime ; host-local boot time 
$_CTime = $_objItem.LocalDateTime ; host-local current time 
Next

$_colItems = 0
; convert to a normalized time string 
$_CTime = SubStr($_CTime, 1,4) + '/' + SubStr($_CTime, 5,2) + '/' +SubStr($_CTime, 7,2) + ' '
+ SubStr($_CTime, 9,2) + ':' + SubStr($_CTime, 11,2) + ':' + SubStr($_CTime, 13,6)

; get the collection of process objects 
$_colItems = $_objWMIService.ExecQuery("Select * from Win32_Process",,48)
If @ERROR $_colItems = 0 Exit Val('&' + Right(DecToHex(@ERROR), 4)) EndIf

; Enumerate the collection of process data 
For Each $_objItem in $_colItems
; add the data to the array if no process is specified, or if a specific process name or ID is specified 
If Not $_Process Or $_Process = $_objItem.Name Or $_Process = $_objItem.ProcessID 
$_Line = $_objItem.Name
$_Line = $_Line + ',' + $_objItem.ProcessID
$_Line = $_Line + ',' + $_objItem.Priority
$_Line = $_Line + ',' + $_objItem.ThreadCount
$_Line = $_Line + ',' + $_objItem.HandleCount
$_Line = $_Line + ',' + $_objItem.WorkingSetSize
; convert the following to d:hh:mm:ss.sss format 
$_Line = $_Line + ',' + _WMIPLTC(CDbl($_objItem.UserModeTime) * 0.0000001)
$_Line = $_Line + ',' + _WMIPLTC(CDbl($_objItem.KernelModeTime) * 0.0000001)
; Use the system boot time if creation date is not set 
$_ = IIf($_objItem.CreationDate , $_objItem.CreationDate, $_BTime)
; calculate elapsed time and convert to d:hh:mm:ss.sss format 
$_Line = $_Line + ',' + _WMIPLTC(_WMIPLET($_, $_CTime))
; Update the array 
$_I = $_I + 1
ReDim Preserve $_aTmp[$_I]
$_aTmp[$_I] = $_Line
EndIf
Next

; return the array, close the collection, and gripe if no items were found 
$WMIProcessList = $_aTmp
$_colItems = 0
If $_Process And $_I < 0 Exit 1911 EndIf
Exit 0

EndFunction


; support function to calculate elapsed time as Seconds 
; Dependent on TimeDiff UDF! 
Function _WMIPLET($_Time, $_CTime)

Dim $_CurrentTime

; Break into Date and Time parts, including 3 decimal points 
$_Time = SubStr($_Time, 1,4) + '/' + SubStr($_Time, 5,2) + '/' +SubStr($_Time, 7,2) + ' '
+ SubStr($_Time, 9,2) + ':' + SubStr($_Time, 11,2) + ':' + SubStr($_Time, 13,6)

; return the value with 3 decimal places 
$_WMIPLET = TimeDiff($_Time, $_CTime, '', 1); FormatNumber(, 3, -1, 0, 0) 
Exit 0

EndFunction


; support function to conver the time value (100ns units) to D:H:M:S.s format 
Function _WMIPLTC($_Units)

Dim $_D, $_H, $_M, $_S ; day, hour, minute, & second values 

; Find d/h/m and subtract result from units 
$_D = Int($_Units / 86400) $_Units = $_Units - $_D * 86400
$_H = Int($_Units/3600) $_Units = $_Units - $_H * 3600
$_M = Int($_Units/60)
$_S = FormatNumber($_Units - $_M * 60, 3, -1, 0, 0)

; return a time string 
$_WMIPLTC = '' + $_D + ':' + $_H + ':' + $_M + ':' + $_S
Exit 0

EndFunction 



Glenn, I understand the concern, but at this point we already have users with PST's on network shares that Evault can't suck their PST's in from.
The intent of running this script and moving the PST's is to put them at a location where we can 'vault' them from.

As you can see from the code, I'm actually moving to the C: drive on the test system, in my testing I'm pulling the PST's off a mapped drive. Everything below is working -

-pst indentification
-forced closing of outlook
-pst disconnection from outlook
-pst rename and move
-pst old and new location logging
-messagebox popup indicating completion.

A user with 4 pst's will have them all moved and renamed.

What's not working at this point is the re-attaching of the PST's to the profile. Stepping through the code in debug I don't see any errors returned.

Lan

Top
#202727 - 2011-07-21 09:42 PM Re: PST locate and log... [Re: Tsguy]
Glenn Barnas Administrator Offline
KiX Supporter
*****

Registered: 2003-01-28
Posts: 4396
Loc: New Jersey
I gotcha..

When I wrote this original process, we were moving PSTs from local machines to a file share after disconnecting them from the user's Outlook config. We renamed them from .PST to .TSP so users would not find and attach them from the share. In our process to add messages to the vault, we processed just a few departments per day - about 50 users per day. This was about as much as the back-end process to import them into the archive system could handle. For 2500 users, it took about 60-70 days to complete the project to move everything to the vault and eliminate PSTs.

Using this method, most users were without their PST messages for at most a day, so there was no need to re-attach them to their PSTs on the file server.

Glenn
_________________________
Actually I am a Rocket Scientist! \:D

Top
#202728 - 2011-07-21 10:26 PM Re: PST locate and log... [Re: Glenn Barnas]
Tsguy Offline
Getting the hang of it

Registered: 2010-01-18
Posts: 67
Loc: Oregon
Glenn,

When I first started working on this script, my intent was also to move the PST's and prevent user access to them until they could be vaulted.

Unfortunately things change.

We are also looking to do department moves into evault, and our timeline is looking to be quite a few days as well.

It is most likely at this point that we'll be able to run this script on workstations in advance of the user's being enabled for evault.

It's not a huge factor that the PST's are re-attaching via the script as my helpdesk monkeys can probably handle that manually ;), but it would't hurt to have it work. \:\)

I was thinking that perhaps the variable for $NewPST isn't being converted properly.

I'm going to run thru debug again here in a few minutes and see if anything is actually written to the registry.

Lan

Top
#202729 - 2011-07-22 01:14 AM Re: PST locate and log... [Re: Tsguy]
Tsguy Offline
Getting the hang of it

Registered: 2010-01-18
Posts: 67
Loc: Oregon
Hmm . .alright results from further testing with registry exports along the way.

The only thing that jumps out is that the original value for the PST location key = 001f6700

And the writevalue from the copied code = 001f6700-0

Changing the writtenvalue to - 001f6700 does not resolve the problem.

Just in case tried a log off / log on for the user and there was no change.

I'm going to try instead to remove the "delete" of the PST keys, and just leave the write in.

Lan

Top
Page 2 of 2 <12


Moderator:  Jochen, Allen, Radimus, Glenn Barnas, ShaneEP, Ruud van Velsen, Arend_, Mart 
Hop to:
Shout Box

Who's Online
0 registered and 84 anonymous users online.
Newest Members
gespanntleuchten, DaveatAdvanced, Paulo_Alves, UsTaaa, xxJJxx
17864 Registered Users

Generated in 0.062 seconds in which 0.024 seconds were spent on a total of 14 queries. Zlib compression enabled.

Search the board with:
superb Board Search
or try with google:
Google
Web kixtart.org