2012-11-08 3 views
5

Eseguiamo Dynamics GP. A causa del modo in cui memorizza i moduli/i report, è necessario disporre di alcuni script di installazione che copiano un file .SET nella directory del programma. Questo può essere fatto manualmente, ma è molto più veloce avere semplicemente un utente che esegue uno script di installazione che installa i file appropriati per loro.Elevazione permesso da VBScript

Sto costruendo un programma di installazione VBScript che copia i file necessari in giro. La parte difficile è che alcuni client eseguono Windows XP e alcuni utilizzano Windows 7 (o addirittura 8). UAC è abilitato, quindi le autorizzazioni entrano in gioco.

Il modo in cui ho provato a farlo è tentare ciecamente di copiare i file, e se viene rilevato un errore di autorizzazione, rilancia lo script con i permessi di amministratore. Dove abbiamo incontrato problemi alcuni (tutti?) Le macchine di Windows 7 hanno scritture di file/registro virtualizzate abilitate, quindi quando lo script tenta di copiare i file in C: \ Programmi \ Microsoft Dynamics \ GP2010, fallisce silenziosamente e li copia alla directory AppData \ Local \ VirtualStore dell'utente. Questo non funziona correttamente con GP.

Quindi è necessario che lo script copi i file in C: \ Programmi (non nella directory di VirtualStore) ed elevi le autorizzazioni solo se necessario. Se lo eleva su tutta la linea, questo fa sì che le macchine Windows XP semplicemente aprano una finestra di dialogo "Esegui come" criptica all'avvio dello script.

Ecco quello che ho finora:

Dim WSHShell, FSO, Desktop, DesktopPath 
Set FSO = CreateObject("Scripting.FileSystemObject") 
Set WSHShell = CreateObject("WScript.Shell") 
Desktop = WSHShell.SpecialFolders("Desktop") 
DesktopPath = FSO.GetAbsolutePathName(Desktop) 

'Set working directory to directory the script is in. 
'This ends up being C:\Windows\System32 if the script is 
'started from ShellExecute, or a link in an email, thus breaking 
'relative paths. 
WSHShell.CurrentDirectory = FSO.GetFile(WScript.ScriptFullName).ParentFolder 

On Error Resume Next 

If FSO.FolderExists("C:\Program Files (x86)") Then 
    WScript.Echo "Installing 64-bit." 
    FSO.CopyFile "64-bit\*.set", "C:\Program Files (x86)\Microsoft Dynamics\GP2010\", True 
    FSO.CopyFile "64-bit\*.lnk", DesktopPath, True 
ElseIf FSO.FolderExists("C:\Program Files\Microsoft Dynamics\GP2010\Mekorma MICR") Then 
    WScript.Echo "Installing 32-bit (with MICR)." 
    FSO.CopyFile "32-bit MICR\*.set", "C:\Program Files\Microsoft Dynamics\GP2010\", True 
    FSO.CopyFile "32-bit MICR\*.lnk", DesktopPath, True 
Else 
    WScript.Echo "Installing 32-bit." 
    FSO.CopyFile "32-bit\*.SET", "C:\Program Files\Microsoft Dynamics\GP2010\", True 
    FSO.CopyFile "32-bit\*.lnk", DesktopPath, True 
End If 

If Err.Number = 70 Then 
    CreateObject("Shell.Application").ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """" , "", "runas", 1 
    WScript.Quit 
ElseIf Err.Number <> 0 Then 
    MsgBox "Error " & Err.Number & vbCrLf & Err.Source & vbCrLf & Err.Description 
Else 
    MsgBox "Installed successfully." 
End If 

In sintesi: come fare Ho un VBScript elevare le autorizzazioni senza causare XP stallo in un "Esegui come" finestra di dialogo, e senza causare Windows 7 per copiare i file su AppData \ Local \ VirtualStore?

risposta

2

Sembra che questo sia il modo più semplice per farlo.

  1. Controllare la versione del sistema operativo.
  2. Se non è XP o 2003 (non prevedo di farlo funzionare su qualcosa di più vecchio), ri-eseguire con elevazione.

Ecco il codice di blocco ho aggiunto all'inizio dello script:

Dim OSList, OS, UAC 
UAC = False 
If WScript.Arguments.Count >= 1 Then 
    If WScript.Arguments.Item(0) = "elevated" Then UAC = True 
End If 

If Not(UAC) Then 
    Set OSList = GetObject("winmgmts:").InstancesOf("Win32_OperatingSystem") 
    For Each OS In OSList 
     If InStr(1, OS.Caption, "XP") = 0 And InStr(1, OS.Caption, "Server 2003") = 0 Then 
      CreateObject("Shell.Application").ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """ elevated" , "", "runas", 1 
      WScript.Quit 
     End If 
    Next 
End If 
+0

Sembra che si risponde da soli, ma io ti verificare se l'utente loggato corrente dispone dei diritti di amministratore, invece della versione Win, ed elevare se solo esigenze. –

4

migliorata su @ DB2 risposta: test elevazione reale

  • , senza dipendere da argomenti passati
  • passa tutti gli argomenti originali allo script elevato
  • utilizza lo stesso host dello script iniziale: wscript.exe, cscript.exe, qualunque sia

Codice:

Set OSList = GetObject("winmgmts:").InstancesOf("Win32_OperatingSystem") 
For Each OS In OSList 
    If InStr(1, OS.Caption, "XP") = 0 And InStr(1, OS.Caption, "Server 2003") = 0 Then 
     With CreateObject("WScript.Shell") 
      IsElevated = .Run("cmd.exe /c ""whoami /groups|findstr S-1-16-12288""", 0, true) = 0 
      If Not IsElevated Then 
       Dim AllArgs 
       For Each Arg In WScript.Arguments 
        If InStr(Arg, " ") Then Arg = """" & Arg & """" 
        AllArgs = AllArgs & " " & Arg 
       Next 
       Command = """" & WScript.ScriptFullName & """" & AllArgs 
       With CreateObject("Shell.Application") 
        .ShellExecute WScript.FullName, " //nologo " & Command, "", "runas", 1 
        WScript.Echo WScript.FullName & " //nologo " & Command 
       End With 
       WScript.Quit 
      End If 
     End With 
    End If 
Next 

' Place code to run elevated here