2012-11-08 15 views
5

Chúng tôi chạy Dynamics GP. Vì cách lưu trữ biểu mẫu/báo cáo, tôi cần phải có một số tập lệnh cài đặt sao chép tệp .SET vào thư mục chương trình. Điều này có thể được thực hiện thủ công, nhưng nó nhanh hơn nhiều khi chỉ có một người dùng chạy một kịch bản cài đặt mà cài đặt các tập tin thích hợp cho họ.Mức tăng quyền từ VBScript

Tôi đã xây dựng trình cài đặt VBScript sao chép các tệp cần thiết xung quanh. Phần khó khăn là một số khách hàng đang chạy Windows XP, và một số đang chạy Windows 7 (hoặc thậm chí 8). UAC được kích hoạt, vì vậy quyền truy cập vào chơi. Cách tôi đã cố gắng làm điều đó là bằng cách cố gắng sao chép các tập tin một cách mù quáng, và nếu phát hiện lỗi quyền hạn, nó sẽ khởi chạy lại tập lệnh với quyền quản trị viên. Trong trường hợp chúng tôi gặp phải vấn đề thì một số máy tính Windows 7 đã kích hoạt tập tin/đăng ký ảo được kích hoạt, vì vậy khi tập lệnh cố sao chép các tệp vào C: \ Program Files \ Microsoft Dynamics \ GP2010, nó sẽ không thành công và sao chép chúng vào thư mục AppData \ Local \ VirtualStore của người dùng. Điều này không hoạt động đúng với GP.

Vì vậy, những gì tôi cần làm là có kịch bản sao chép các tệp vào C: \ Program Files (không phải thư mục VirtualStore) và chỉ nâng cấp quyền nếu cần. Nếu tôi có nó nâng lên trên bảng, điều này làm cho các máy Windows XP chỉ đơn giản là bật lên một hộp thoại "Run As" khó hiểu khi khởi chạy kịch bản.

Dưới đây là những gì tôi có cho đến nay:

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 

Tóm lại: Làm thế nào để có một VBScript nâng cao quyền mà không gây XP để chết máy ở một "Run As" hộp thoại, và mà không gây Windows 7 để sao chép các tập tin vào AppData \ Local \ VirtualStore thay thế?

Trả lời

2

Có vẻ như đây là cách đơn giản nhất để thực hiện.

  1. Kiểm tra phiên bản hệ điều hành.
  2. Nếu nó không phải là XP hoặc 2003 (tôi không lường trước điều này đang chạy trên bất cứ điều gì cũ hơn), tái thực hiện với độ cao.

Đây là khối mã tôi thêm vào đầu của kịch bản:

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

Hình như bạn trả lời cho mình, nhưng tôi sẽ kiểm tra xem người dùng đăng nhập hiện tại có quyền admin, thay vì phiên bản Win, và nâng cao nếu chỉ nhu cầu. –

4

Cải thiện trên @ db2 câu trả lời:

  • thử nghiệm độ cao sản, không phụ thuộc vào đối số được truyền
  • chuyển tất cả các đối số ban đầu cho tập lệnh được nâng lên
  • sử dụng cùng một máy chủ của tập lệnh ban đầu: wscript.exe, cscript.exe, bất cứ điều gì

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