简体   繁体   中英

vbscript permission denied 800a0046 network

I made a script that copying a file to a certain location. I add the.vbs to taskschd.msc scheduled for make a.pst backup but I get error message

Line: 91 Char: 7 Error: Permission denied Code: 800A0046 Source: Microsoft VBScript runtime error

<pre>



'Set the amount of pst-files you want to copy. Start counting at 0!
ReDim pst(1)

'Define the location of each pst-file to backup. Increase the counter!
pst(0) = "C:\Users\daniel.elmnas.TT\Documents\Outlook Files\de@teknotrans.se.pst"
pst(1) = "C:\Users\daniel.elmnas.TT\Documents\Outlook Files\de.pst"

'Define your backup location
BackupPath = "\\ttad-1\Gemensam\Outlook_Backup\Daniel Elmnäs"

'Keep old backups? TRUE/FALSE
KeepHistory = FALSE

'Maximum time in milliseconds for Outlook to close on its own
delay = 30000 'It is not recommended to set this below 8000

'Start Outlook again afterwards? TRUE/FALSE
start = TRUE

'===================STOP MODIFY====================================

'Close Outlook
Call CloseOutlook(delay)

'Outlook is closed, so we can start the backup
Call BackupPST(pst, BackupPath, KeepHistory)

'Open Outlook again when desired.
If start = TRUE Then
  Call OpenOutlook()
End If


Sub CloseOutlook(delay)
  strComputer = "."
  Set objWMIService = GetObject("winmgmts:" _
  & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

  'If Outlook is running, let it quit on its own.
  For Each Process in objWMIService.InstancesOf("Win32_Process")
    If StrComp(Process.Name,"OUTLOOK.EXE",vbTextCompare) = 0 Then
      Set objOutlook = CreateObject("Outlook.Application")
      objOutlook.Quit
      WScript.Sleep delay
      Exit For
    End If
  Next

  'Make sure Outlook is closed and otherwise force it.
  Set colProcessList = objWMIService.ExecQuery _
  ("Select * from Win32_Process Where Name = 'Outlook.exe'")
  For Each objProcess in colProcessList
    objProcess.Terminate()
  Next
  Set objWMIService = Nothing
  Set objOutlook = Nothing
  set colProcessList = Nothing
End Sub


Sub BackupPST(pst, BackupPath, KeepHistory)
  Set fso = CreateObject("Scripting.FileSystemObject")

  If KeepHistory = True Then
    ArchiveFolder = Year(Now) & "-" & Month(Now) & "-" & Day(Now)
    BackupPath = BackupPath & ArchiveFolder & "\"
  End If

  If fso.FolderExists(BackupPath) = False Then
    fso.CreateFolder BackupPath
  End If

  For Each pstPath in pst
    If fso.FileExists(pstPath) Then
      fso.CopyFile pstPath, BackupPath, True
    End If
  Next
  Set fso = Nothing
End Sub


Sub OpenOutlook()
  Set objShell = CreateObject("WScript.Shell")
  objShell.Run "Outlook.exe"
End Sub


</pre>

Could someone help me to solve this?

Thank you in advance

EDITED: Change the permissions of the folder.

  1. In windows explorer, navigate to the folder where the PST file is located.
  2. In the left pane of windows explorer, right click on the folder where the PST file is located, select "Properties".
  3. Select the "Security" tab
  4. Click the button "Edit" to change permissions.
  5. Click "Add"
  6. In the object names to select box, enter "everyone" (no quotes).
  7. Click "Check Names", everyone should become capitalized and underlined.
  8. Click "Ok"
  9. Select "Everyone" from the list of Groups or user names.
  10. In the "Permissions for Everyone" list, make sure "Read & Execute, List folder contents and Read, in the allow column are checked, click "Apply"
  11. Click Ok.

NOTE: By doing this, anyone who has access to this computer can access the folder. You might consider only adding your login to the computer to the list of Groups or usernames instead of Everyone. You may have to repeat the above steps on the PST file(s) in question.

Original Post:

I ran the script here, testing for various issues and it ran without problems. At this point I believe the issue is rights and permissions to either the source or destination folder (or the files you are backing up). By default, the user's themselves don't have access to Outlooks data files. You would need to add "read" permissions to the files in question (PST,OST, and so on) or the full folder. In reality, just backing up the PST files isn't enough to restore an Outlook configuration; you would need all of the files. You can Try this:

'===================================================================
'Description: VBS script to backup your pst-files.
'
'Comment: Before executing the vbs-file, set the location of outlook
'         folder you want to backup and
'         the backup location (this can also be a network path).
'         See the URL below for more configuration instructions and
'         how to create a Scheduled Task for it.
'
' Original author : Robert Sparnaaij
' Modified:  Fred Kerber
' version: 1.1
' website: http://www.howto-outlook.com/downloads/backupscript.htm
' Changes:
'   Changed var types; changed to backup full folder and not just pst files.
'===================================================================
'===================BEGIN MODIFY====================================



'Define the folder location of Outlook's data files.
sOutlookDataPath = "C:\Users\FKerber.CORP\AppData\Local\Microsoft\Outlook\"

'Define your backup location
sBackupPath = "E:\Outlook Backup\"

'Keep old backups? TRUE/FALSE
bKeepHistory = TRUE

'Maximum time in milliseconds for Outlook to close on its own
iDelay = 30000 'It is not recommended to set this below 8000

'Start Outlook again afterwards? TRUE/FALSE
bStart = True

'===================STOP MODIFY====================================
'Close Outlook
Call CloseOutlook(iDelay)

'Outlook is closed, so we can start the backup
Call BackupOutlook(sOutlookDataPath, sBackupPath, bKeepHistory)

'Open Outlook again when desired.
If bStart = TRUE Then
  Call OpenOutlook()
End If

Sub CloseOutlook(iDelay)
  Set objWMIService = GetObject("winmgmts:" &_
   {impersonationLevel= impersonate}!\\.\root\cimv2")

  'If Outlook is running, let it quit on its own.
   For Each oProcess in objWMIService.InstancesOf("Win32_Process")
     If StrComp(oProcess.Name,"OUTLOOK.EXE",vbTextCompare) = 0 Then
       Set objOutlook = CreateObject("Outlook.Application")
       objOutlook.Quit
       WScript.Sleep delay
       Exit For
     End If
   Next

  'Make sure Outlook is closed and otherwise force it.
  Set colProcessList = objWMIService.ExecQuery _
  ("Select * from Win32_Process Where Name = 'Outlook.exe'")
  For Each objProcess in colProcessList
    objProcess.Terminate()
  Next
  Set objWMIService = Nothing
  Set objOutlook = Nothing
  Set colProcessList = Nothing
End Sub

Sub BackupOutlook(sOutlook, sBackupPath, bKeepHistory)
  Set ofso = CreateObject("Scripting.FileSystemObject")

  If bKeepHistory = True Then
    sArchiveFolder = Year(Now) & "-" & Month(Now) & "-" & Day(Now)
    sBackupPath = sBackupPath & sArchiveFolder & "\"
  Else
    For Each oFile In ofso.GetFolder(sBackupPath).Files
      ofso.DeleteFile oFile.Path, True
    Next
  End If

  If ofso.FolderExists(sBackupPath) = False Then
    ofso.CreateFolder sBackupPath
  End If

  For Each oFile In ofso.GetFolder(sOutlook).Files
    If ofso.FileExists(oFile.Path) Then
      ofso.CopyFile oFile.Path, sBackupPath, True
    End If
  Next
  Set ofso = Nothing
End Sub

Sub OpenOutlook()
  Set objShell = CreateObject("WScript.Shell")
  objShell.Run "Outlook.exe"
End Sub

Seems like you schedule the script. You need to start the task with a user that executes the script which has rights on the PST file, as well as on the path where you store the backup. Running it with the system account won't be enough.

There are better ways to backup PST files also, I use a Ruby script to synchronise a local copy with a backup copy, is runs on PST's more than 10GB big without problem, might be a problem if you would do it with a copy like this.

You need to backup the copy on a backup medium also because when the PST has errors (and all big PST have) you copy the errors to the backup and could lose both.

Also, you do the following

BackupPath = "\\ttad-1\Gemensam\Outlook_Backup\Daniel Elmnäs"
...
BackupPath = BackupPath & ArchiveFolder & "\"

Where is the \\ between the two first variables ?

I had a similar problem trying to delete files with VBS. I assume that as with my case: The source of the problem is that the script is trying to perform some operation on a file or folder that has a Read-only Attribute . To solve this manually you could left click -> properties -> unclick the Read-Only Attribute then the file/folder should be copied by the script. To solve the problem with VBS: I make the assumption that file/folder is set to Read-Only because there is a programme currently using them.

One : we can just skip files/folders set to read-only this time and hope to get them next time the script runs. For this we first check if file/folder is read-only (I got this from here: https://social.tec.net.microsoft.com/Forums/ie/en-US/7382d452-1ef9-404a-8874-48d38fcfe911/vbscript-verify-if-a-file-is-readonly?forum=ITCG ), if not then we perform the copy operation.

  Sub BackupPST(pst, BackupPath, KeepHistory)
    '........
     For Each pstPath in pst
       If fso.FileExists(pstPath) Then
         If not (fso.GetFile(pstPath).Attributes AND 1) Then 'if item is not read-only
           fso.CopyFile pstPath, BackupPath, True
         End If
       End If
     Next
     Set fso = Nothing
   End SubSub

Two : At the very least this should prevent you from getting the error. But if the script never moves the files even after running a number of times then chances are that the files (you are trying to move) are always in read only and you should change Attribute of the file (you are trying to move) in your script before calling the copy function, see how to do that here: https://devblogs.microsoft.com/scripting/how-can-i-change-a-read-only-file-to-a-read-write-file/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM