2012-11-08 15 views
5

से अनुमति ऊंचाई हम डायनेमिक्स जीपी चलाते हैं। फ़ॉर्म/रिपोर्ट्स को संग्रहीत करने के तरीके के कारण, मुझे कुछ इंस्टॉल स्क्रिप्ट्स की आवश्यकता होती है जो प्रोग्राम निर्देशिका में एक .SET फ़ाइल की प्रतिलिपि बनाते हैं। यह मैन्युअल रूप से किया जा सकता है, लेकिन उपयोगकर्ता को केवल इंस्टॉलर स्क्रिप्ट चलाने के लिए बहुत तेज़ है जो उनके लिए उचित फाइलें इंस्टॉल करता है।वीबीस्क्रिप्ट

मैं एक वीबीस्क्रिप्ट इंस्टॉलर बना रहा हूं जो आवश्यक फाइलों को प्रतिलिपि बनाता है। मुश्किल हिस्सा यह है कि कुछ क्लाइंट विंडोज एक्सपी चला रहे हैं, और कुछ विंडोज 7 (या यहां तक ​​कि 8) चल रहे हैं। यूएसी सक्षम है, इसलिए अनुमतियां खेल में आती हैं।

जिस तरह से मैंने इसे करने की कोशिश की है, वह फाइलों की प्रतिलिपि बनाने का प्रयास कर रहा है, और अगर अनुमति त्रुटि का पता चला है, तो यह स्क्रिप्ट को व्यवस्थापक अनुमतियों से पुनः लॉन्च करता है। जहां हमने समस्याओं में भाग लिया है कुछ है (सभी?) विंडोज 7 मशीनों में वर्चुअलाइज्ड फ़ाइल/रजिस्ट्री लिखने सक्षम हैं, इसलिए जब स्क्रिप्ट सी: \ प्रोग्राम फ़ाइलें \ माइक्रोसॉफ्ट डायनेमिक्स \ जीपी -2010 में फ़ाइलों की प्रतिलिपि बनाने की कोशिश करती है, तो यह चुपचाप विफल हो जाती है और उन्हें कॉपी करती है उपयोगकर्ता की AppData \ Local \ VirtualStore निर्देशिका में। यह जीपी के साथ ठीक से काम नहीं करता है।

तो मुझे क्या करना है, स्क्रिप्ट को फ़ाइलों को सी: \ प्रोग्राम फ़ाइलें (वर्चुअलस्टोर निर्देशिका नहीं) में कॉपी करें, और केवल आवश्यक होने पर अनुमतियां बढ़ाएं। यदि मैंने इसे बोर्ड में बढ़ाया है, तो यह स्क्रिप्ट लॉन्च करते समय Windows XP मशीनों को बस एक गुप्त "रन एज़" संवाद बॉक्स पॉप अप करने का कारण बनता है।

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 

सारांश में::

यहाँ मैं अब तक राशि है कैसे मैं एक VBScript तरक्की अनुमतियाँ बिना XP एक "रन के रूप में" संवाद बॉक्स पर रोकने के कारण है, और बिना के कारण विंडोज़ 7 को ऐपडाटा \ स्थानीय \ वर्चुअलस्टोर में फ़ाइलों की प्रतिलिपि बनाने के लिए?

उत्तर

2

ऐसा लगता है कि ऐसा करने का यह सबसे आसान तरीका है।

  1. ओएस संस्करण की जांच करें।
  2. यदि यह XP या 2003 नहीं है (मुझे यह किसी भी पुराने पर चलने की उम्मीद नहीं है), उन्नयन के साथ फिर से निष्पादित करें।

यहाँ कोड ब्लॉक मैं स्क्रिप्ट की शुरुआत करने के लिए जोड़ा है:

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

ऐसा लगता है कि अपने आप को जवाब है, लेकिन अगर वर्तमान में लॉग इन उपयोगकर्ता, व्यवस्थापक अधिकार है विन संस्करण के बजाय मैं परीक्षण करेंगे, और तरक्की करता है, तो केवल की जरूरत है। –

4

@ डीबी 2 जवाब पर सुधार:

  • वास्तविक ऊंचाई परीक्षण, पारित कर दिया तर्क के आधार पर बिना
  • एलिवेटेड स्क्रिप्ट
  • प्रारंभिक स्क्रिप्ट के समान होस्ट का उपयोग करता है: wscript.exe, cscript.exe, जो कुछ भी

कोड:

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