2012-11-08 14 views
5

Wir laufen Dynamics GP. Wegen der Art, wie Formulare/Berichte gespeichert werden, brauche ich einige Installationsskripte, die eine .SET-Datei in das Programmverzeichnis kopieren. Dies kann manuell erfolgen, aber es ist viel schneller, wenn ein Benutzer ein Installer-Skript ausführt, das die richtigen Dateien für sie installiert.Genehmigung Erhöhung von VBScript

Ich habe ein VBScript-Installationsprogramm erstellt, das die notwendigen Dateien kopiert. Der schwierige Teil ist, dass einige Clients Windows XP ausführen und einige Windows 7 (oder sogar 8) ausführen. Die Benutzerkontensteuerung ist aktiviert, sodass Berechtigungen ins Spiel kommen.

Die Art, wie ich es versucht habe, ist blind versucht, die Dateien zu kopieren, und wenn ein Berechtigungsfehler erkannt wird, startet es das Skript mit Administratorberechtigungen neu. Wo wir auf Probleme stoßen, sind einige (alle?) Windows 7 Maschinen virtualisierte Datei-/Registrierungsschreibvorgänge aktiviert, wenn das Skript also versucht, Dateien nach C: \ Programme \ Microsoft Dynamics \ GP2010 zu kopieren, schlägt es im Hintergrund fehl und kopiert sie in das AppData \ Local \ VirtualStore-Verzeichnis des Benutzers. Dies funktioniert nicht ordnungsgemäß mit GP.

Also, was ich tun muss, ist das Skript die Dateien in C: \ Programme (nicht das Verzeichnis VirtualStore) kopieren, und Berechtigungen nur bei Bedarf erhöhen. Wenn ich es auf der ganzen Platine anheben lasse, verursachen die Windows XP-Maschinen beim Starten des Skripts einfach ein kryptisches Dialogfeld "Ausführen als".

Hier ist, was ich bisher:

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 

Zusammengefasst: Wie habe ich ein VBScript Berechtigungen ohne verursacht XP erhöht Dialogfeld mit einem „Als Run“ zum Stillstand kommen, und ohne verursacht Windows 7, um die Dateien stattdessen in AppData \ Local \ VirtualStore zu kopieren?

Antwort

2

Scheint wie dies der einfachste Weg ist, es zu tun.

  1. OS-Version überprüfen.
  2. Wenn es nicht XP oder 2003 ist (ich erwarte nicht, dass es auf etwas älterem läuft), führe es mit der Höhe erneut aus.

Hier ist der Code-Block I an den Anfang des Skripts hinzugefügt:

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

Sieht aus wie Du selbst beantworten, aber ich werde prüfen, ob der aktuelle angemeldete Benutzer Admin-Rechte hat, statt Win Version und erheben nur dann, wenn braucht. –

4

auf @ db2 Antwort Verbessert:

  • echte Höhenprüfung,
  • ohne Abhängigkeit von übergebenen Argumenten
  • übergibt alle ursprünglichen Argumente an das erhöhte Skript
  • verwendet den gleichen Host des ursprünglichen Skripts: wscript.exe, cscript.exe, was auch immer

Code:

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