2016-08-05 5 views
0

Ich bin damit beschäftigt, ein HTA-Applet zu erstellen, das die Sitzungen meiner Benutzer authentifiziert, wenn sie sich an ihrer Arbeitsstation anmelden. Im Idealfall möchte ich in der Lage sein, eine aktive Netzwerksitzung zu beenden, anstatt nur die Netzwerklaufwerke zu entfernen, die ausgeführt werden, wenn Benutzer authentifiziert werden.Bestimmte Netzwerksitzungen trennen

Ich habe erst vor drei Tagen von HTA erfahren, was vielleicht der Grund dafür ist, dass ich ein bisschen kämpfe, und mein VBS-Wissen ist auch nicht so gut, also arbeite ich an Code-Beispielen, indem ich sie zusammenhefte zusammen. Die HTA-Methode scheint die einfachste und geeignetste Methode zu sein, um das zu erreichen, was ich tun wollte, da ich Laufwerke ohne erkennbare Schwierigkeiten zuordnen kann.

Kann jemand einen Blick auf mein Skript nehmen und mir sagen, wie ich kann es optimieren zu erreichen, was ich versuche zu tun? Ich lerne jeden Schritt des Weges, also leite mich bitte zur passenden Lösung (ich möchte es zuerst selbst ausprobieren).


Ziel:

Lage sein, eine gerade aktive Netzwerk-Sitzung von nur einem bestimmten Server zu entfernen, wenn die HTA durch den Benutzer gestartet wird.

Probleme und Vorkommen:

Unter der Annahme richtige Anmeldeinformationen: Die Anmeldeinformationen werden den Sub genannt „ExecMapping“ gezogen, und wird durch das Skript validiert eine gültige Länge zu sein (keine Leerzeichen).

  1. Das Skript wird vollständig über den ExecMapping-Sub ausgeführt, der überprüft, ob beim Versuch, ein neues Mapping zu erstellen, Fehler aufgetreten sind. Wenn mehrere Mappings vorhanden sind, wird das Fehlerdialogfeld für diese bestimmte Zuordnung ausgelöst.

  2. Meistens erhalte ich wie erwartet einen Fehler "Mehrere Verbindungen". Dies sollte gelöst werden.

Multiple Connection Error

Die Scripting:

<HEAD> 
<!-- Full Credits to the Authors of the ReadIni Function 

    Dependencies: 
    -> Logo (./Logo_alpha.png) 
    -> Ini File (./config.ini) 
    -> Icon (./Kreede$arch$.ico) 
--> 
<TITLE>Kreede Authenticator</TITLE> 

<HTA:APPLICATION 
    APPLICATIONNAME="Kreede Authenticator" 
    VERSION="1.2" 
    BORDER="none" 
    INNERBORDER="no" 
    CAPTION="no" 
    SYSMENU="no" 
    MAXIMIZEBUTTON="no" 
    MINIMIZEBUTTON="no" 
    ICON="Kreede32.ico" 
    SCROLL="no" 
    SINGLEINSTANCE="yes" 
    SHOWINTASKBAR="no" 
    CONTEXTMENU="no" 
    SELECTION="no"/> 
</HEAD> 

<SCRIPT language="vbscript"> 

Function ReadIni(myFilePath, mySection, myKey) 
    ' This function returns a value read from an INI file 
    ' 
    ' Arguments: 
    ' myFilePath [string] the (path and) file name of the INI file 
    ' mySection [string] the section in the INI file to be searched 
    ' myKey  [string] the key whose value is to be returned 
    ' 
    ' Returns: 
    ' the [string] value for the specified key in the specified section 
    ' 
    ' CAVEAT:  Will return a space if key exists but value is blank 
    ' 
    ' Written by Keith Lacelle 
    ' Modified by Denis St-Pierre and Rob van der Woude 

    Const ForReading = 1 
    Const ForWriting = 2 
    Const ForAppending = 8 

    Dim intEqualPos 
    Dim objFSO, objIniFile 
    Dim strFilePath, strKey, strLeftString, strLine, strSection 

    Set objFSO = CreateObject("Scripting.FileSystemObject") 

    ReadIni  = "" 
    strFilePath = Trim(myFilePath) 
    strSection = Trim(mySection) 
    strKey  = Trim(myKey) 

    If objFSO.FileExists(strFilePath) Then 
     Set objIniFile = objFSO.OpenTextFile(strFilePath, ForReading, False) 
     Do While objIniFile.AtEndOfStream = False 
      strLine = Trim(objIniFile.ReadLine) 

      ' Check if section is found in the current line 
      If LCase(strLine) = "[" & LCase(strSection) & "]" Then 
       strLine = Trim(objIniFile.ReadLine) 

       ' Parse lines until the next section is reached 
       Do While Left(strLine, 1) <> "[" 
        ' Find position of equal sign in the line 
        intEqualPos = InStr(1, strLine, "=", 1) 
        If intEqualPos > 0 Then 
         strLeftString = Trim(Left(strLine, intEqualPos - 1)) 
         ' Check if item is found in the current line 
         If LCase(strLeftString) = LCase(strKey) Then 
          ReadIni = Trim(Mid(strLine, intEqualPos + 1)) 
          ' In case the item exists but value is blank 
          If ReadIni = "" Then 
           ReadIni = " " 
          End If 
          ' Abort loop when item is found 
          Exit Do 
         End If 
        End If 

        ' Abort if the end of the INI file is reached 
        If objIniFile.AtEndOfStream Then Exit Do 

        ' Continue with next line 
        strLine = Trim(objIniFile.ReadLine) 
       Loop 
      Exit Do 
      End If 
     Loop 
     objIniFile.Close 
    Else 
     WScript.Echo strFilePath & " doesn't exists. Exiting..." 
     Wscript.Quit 1 
    End If 
End Function 

Sub Window_onLoad 
    Dim objNetwork 
    Dim objFSO 
    Set objNetwork = CreateObject("WScript.Network") 

    '### First Impressions! ### 
    window.resizeTo 480,270 
    window.moveTo screen.width/3, screen.height/4 

    '### Remove Previous Session's Access to Shared Drives ### 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    If objFSO.DriveExists("O") Then 
     objNetwork.RemoveNetworkDrive("O:") 
    End If 
    If objFSO.DriveExists("S") Then 
     objNetwork.RemoveNetworkDrive("S:") 
    End If 
    Set objNetwork = Nothing 

End Sub 

Sub CancelAction 

    '### Remove Previous Session's Access to Shared Drives ### 
    Set objNetwork = CreateObject("WScript.Network") 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    If objFSO.DriveExists("O") Then 
     objNetwork.RemoveNetworkDrive("O:") 
    End If 
    If objFSO.DriveExists("S") Then 
     objNetwork.RemoveNetworkDrive("S:") 
    End If 

    MsgBox "You have not logged in, and will not be able to access drives O: and S: To regain access, please run Kreede from your Desktop again.", vbOKOnly + vbCritical, "Important" 
    Set oShell = Nothing 
    Set objNetwork = Nothing 
    Self.Close() 

End Sub 

Sub ExecMapping 
    On Error Resume Next 

    Dim objNetwork, oShell, WshShell 

    Set objNetwork = CreateObject("WScript.Network") 
    Set oShell = CreateObject("Shell.Application") 
    Set WshShell = CreateObject("WScript.Shell") 

    '### Initialise all variables needed ### 
    strDriveLetter1 = "O:" 
    strDriveLetter2 = "S:" 
    '### Our Fail-Safe Locations, just in case... ### 
    strRemotePath1 = "\\172.16.18.3\corporate" 
    strRemotePath2 = "\\172.16.18.3\scratch" 
    strDriveAlias1 = "Corporate (HO)" 
    strDriveAlias2 = "Scratch (HO)" 
    intTimeout = 1 'Seconds 
    strMessage = "Login Succeeded!" 
    strTitle = "Success!" 

    '### We'll find out who you are in bit, but we first need to know where you are? ### 
    strBranch = UCase(ReadIni(".\config.ini", "Config-Data", "branch")) 

    Select Case strBranch 
     Case "HO" 
      strRemotePath1 = "\\172.16.18.3\corporate" 
      strRemotePath2 = "\\172.16.18.3\scratch" 
      strDriveAlias1 = "Corporate (HO)" 
      strDriveAlias2 = "Scratch (HO)" 
     Case "REM" 
      strRemotePath1 = "\\172.16.20.3\corporate" 
      strRemotePath2 = "\\172.16.20.3\scratch" 
      strDriveAlias1 = "Office (Remote)" 
      strDriveAlias2 = "Scratch (Remote)" 
    End Select 

    '### Are we working with humans? Set minimum length for validation ### 
    validUsr = 2 
    validPass = 3 

    '### Check if the Computer lied... ### 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    If objFSO.DriveExists("O") Then 
     objNetwork.RemoveNetworkDrive("O:") 
    End If 
    If objFSO.DriveExists("S") Then 
     objNetwork.RemoveNetworkDrive("S:") 
    End If 

    '### Map drives using the entered credentials ### 

    'STEP 1: Collect Credentials 
    strUser = TextBox1.Value 
    strPwd = TextBox2.Value 

    'STEP 2: Validate and Map! 
    If Len(strUser) >= validUser Then 
     strUsr = Ucase(strUser) 

     If Len(strPwd) >= validPass Then 
      Err.Clear 

      objNetwork.MapNetworkDrive strDriveLetter1, strRemotePath1, False, strUser, strPwd 
      If Err.Number <> 0 Then 
       MsgBox "MAP-O :: Error Occurred [" & Err.Number & "]: " & Err.Description    
      End If 

      objNetwork.MapNetworkDrive strDriveLetter2, strRemotePath2, False, strUser, strPwd 
      If Err.Number <> 0 Then 
       MsgBox "MAP-S :: Error Occurred [" & Err.Number & "]: " & Err.Description  
       Call CancelAction  
      End If 

      If Err.Number = 0 Then 
       oShell.NameSpace(strDriveLetter1).Self.Name = strDriveAlias1 
       oShell.NameSpace(strDriveLetter2).Self.Name = strDriveAlias2 
       intResult = WshShell.Popup(strMessage, intTimeout, strTitle) 
      End If 

     Else 
      Msgbox "Password is invalid!" 
      Exit Sub   
     End If 

    ELSE 
     Msgbox chr(34) & strUser & """ is not a valid username!" 
     Exit Sub 
    End If 

    Set oShell = Nothing 
    Set objNetwork = Nothing 
    Self.Close() 

End Sub 


</SCRIPT> 


<BODY STYLE=" 
    TEXT-ALIGN: center; 
    background-color: #dddddd; 
    FONT:10 pt verdana; 
    COLOR:black; 
    filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr='#FFCC66', EndColorStr='#FFFFFF') 
    "> 

<img src="./Logo_alpha.png" alt="Logo"></a><br> 
Please enter your corporate user credentials to access the Corporate Servers.<br><br> 
<CENTER> 
<HR color="#FF0000"> 
<table border="0" cellpadding="0" cellspacing="0"><font size="2" color="black" face="Arial"> 
    <tr> 
     <td height="30"> 
      <p align="right">Username</p> 
     </td> 
     <td height="30">&nbsp;&nbsp; <input type="text" name="TextBox1" size="30"> 
     </td> 
    </tr> 
    <tr> 
     <td height="30"> 
      <p align="right">Password</p> 
     </td> 
     <td height="30">&nbsp;&nbsp; <input type="password" name="TextBox2" size="30"> 
     </td> 
    </tr> 
</table> 

<HR color="#FF0000"> 
<Input id=runbutton class="button" type="button" value=" Login " name="run_button" onClick="ExecMapping"> 

&nbsp;&nbsp;&nbsp; 

<Input id=runbutton class="button" type="button" value="Cancel" name="cancel_button" onClick="CancelAction"><br> 
<span style="font-size: 8pt; color: red"><strong>If you cancel, you will not be able to access the O: and S: drives in this session.</strong></span> 
</CENTER> 
</BODY> 

Antwort

0

Ich denke, man entweder die unter Befehlszeile verwenden, können alle Verbindungen, oder erste Iteration durch die aktuellen Verbindungen zu entfernen, und trennen, was Anpassung Ihre Kriterien.

net use * /delete /yes 

Oder tun ein objNetwork.EnumNetworkDrives dann objNetwork.RemoveNetworkDrive für jede davon.

** Hinweis: Für die Verbindung, die mit einem lokalen Laufwerkbuchstaben zugeordnet ist, müssen Sie so etwas wie objNetwork.RemoveNetworkDrive („\ 172.16.18.3 \ corporate“)

Viel Glück tun.