free2k
Goto Top

VBS Skript für Logon

Ersteinmal wollte ich halle in diesem Board sagen face-wink

Jetzt zu meinem Problem. Ich versuche zur Zeit unsere Logon Skript von *.bat dateien zu einem VBS Skript zu migrieren. Und bin leider dabei auf ein Problem bestoßen.

Die Abfrage mit der ismember klappt leider nicht so.

Und zwar ist das Problem das in der Sicherheitsgruppe "GP_CEPT005" sind keine User sind sondern dort ist wiederum eine Sicherheitsgruppe. Und in der Sind dann die User der Abteilung.

Das kann ich auch leider nicht mehr trennen oder anderes gestalten.

Wenn ich in die Gruppe GP_CEPT005 einen Benutzer reinschreiben klappt das Skript. Gibt es dort einen Trick wie ich das auch noch hinbekomme? Da die ifmember.exe die ich bei der batch datei benutzt hab damit keine Probleme hatte.

Für Hinweise wäre ich dankbar face-wink Wer das ganze besser oder schlauer lösen kann soll mir bitte Tips geben.

Anbei der Abschnitt des VBS Skripts.

Grüße
Marcel


_____
Function IsMember(strGroup)
Dim objMember, objGroup
On Error Resume Next
Set objGroup = GetObject("WinNT:" & strDomain & "/" & strGroup & ",group")
If Err.Number = 0 Then
IsMember = objGroup.IsMember("WinNT:
" & strDomain & "/" & strUserName)
End If
On Error Goto 0
End Function


If IsMember("GP_CEPT005") Then
WSHNetwork.AddWindowsPrinterConnection "\\clprint01\cept005"
WSHNetwork.SetDefaultPrinter "\\" & strPrintSRV & "\cept005"
end if
____

Content-Key: 102440

Url: https://administrator.de/contentid/102440

Printed on: April 25, 2024 at 22:04 o'clock

Member: bastla
bastla Nov 23, 2008 at 10:27:39 (UTC)
Goto Top
Hallo free2k!

Basierend auf diesem "Scripting Guy"-Artikel könnte das so gehen:
Function IsMember(strGroup)
On Error Resume Next
InGroup = False
Set objUser=GetObject("LDAP://" & CreateObject("ADSystemInfo").UserName)  
Set colGroups = objUser.Groups
For Each objGroup in colGroups
    If objGroup.CN = strGroup Then
        InGroup = True
        Exit For
    Else
        GetNested objGroup, strGroup, InGroup
    End If
Next
IsMember = InGroup
End Function

Sub GetNested(objGroup, strGroup, InGroup)
On Error Resume Next
colMembers = objGroup.GetEx("memberOf")  
If Err.Number = 0 Then
    For Each strMember in colMembers
        strPath = "LDAP://" & strMember  
        Set objNestedGroup = GetObject(strPath)
        If objNestedGroup.CN = strGroup Then
            InGroup = True
            Exit For		    
        Else
            GetNested objNestedGroup, strGroup, InGroup
        End If
    Next
End If
End Sub
Noch als Anmerkung: Das Objekt für den (aktuellen) Benutzer ("objUser") wird innerhalb der Funktion erzeugt - besser wäre es, dieses beim Aufruf als Argument zu übergeben.

Grüße
bastla
Member: free2k
free2k Nov 23, 2008 at 15:07:40 (UTC)
Goto Top
hm face-smile

Was meinst du damit dieses beim Aufruf als Argument zu übergeben ?

Bin leider des VBS nicht so mächtig... bin schonmal froh das ich soweit gekommen bin face-wink
Imo hackts aber irgendwie noch muss jetzt mal weitersuchen was bei mir nicht richtig stimmt.

Aber erstmal danke dafür.

Grüße
Marcel
Member: bastla
bastla Nov 23, 2008 at 17:46:59 (UTC)
Goto Top
Hallo free2k!

Was meinst du damit dieses beim Aufruf als Argument zu übergeben ?
Die Funktion sollte die Gruppenzugehörigkeit eines beliebigen Users prüfen können - daher sollte der User nicht in der Funktion selbst festgelegt, sondern gemeinsam mit der Gruppe an die Funktion "übergeben" werden, etwa:
If IsMember(strUser, "GP_CEPT005") Then  
Das ist zwar für die Wiederverwendbarkeit der "Function" vorteilhaft, für die konkrete Anwendung hier aber nicht entscheidend ...
Wenn es Probleme gibt, solltest Du mit eingestreuten "WScript.Echo"-Zeilen und einem Test von der Kommandozeile mit
cscript //nologo Scriptdatei.vbs
die ermittelten Werte anzeigen lassen.

Du könntest etwa zwischen Zeile 6 und 7 einfügen:
WScript.Echo "Direkt: ", objGroup.CN  
und als Zeile 23b (= nach "Set objNestedGroup = GetObject(strPath)"):
WScript.Echo "Indirekt: ", objNestedGroup.CN  
So werden die gefundenen Gruppen mit dem Namen, wie sie dann auch verglichen werden, angezeigt.

Zu beachten wäre noch, dass in der derzeitigen Fassung die Groß-/Kleinschreibung berücksichtigt werden muss, also etwa "gp_CEPT005" nicht gefunden würde.

Grüße
bastla
Member: free2k
free2k Nov 24, 2008 at 21:39:03 (UTC)
Goto Top
okay... fehler gefunden.... den mit dem ich getestet war natürlich in den falschen gruppen face-smile

Wie auch immer... jetzt haben sich neue Probleme gefunden face-smile

Wie kann ich den Internet Explorer starten und da eine Startzeit übergeben. Würde diese gerne aber so starten das sie minimale Leistung benötigt...evtl gibt es da ja einen Command.

Und ich hätte gerne noch gewusste ich wie Verzeichnisse übergeben kann weil hab hier ein Dos Skript

copy "\\Zeiterfassung - Aushilfen\%username%_zeiterfassung.xls.lnk" . /Y
cd %userprofile%\Desktop
%username%_zeiterfassung.xls.lnk

Also ich müsste wissen wie die Varibale für Desktop des Users und wie man einen Shortcut dafür dann macht.... face-smile

Aber solangsam steige ich in vbs durch... dafür das ich bis vor 2 Tagen noch nie mit sowas zu tun habe gehts dann solangsam ;)


Und ich habe eine test.help datei die immer in Alluser/Desktop abgelegt werden soll..... gibt es einen Befehlt was überprüft ob die Datei in der Quelle neuer ist als die auf dem Desktop? wenn ja soll diese ersetzt werden.

Weil ich will das Skript soweit Optimieren wie es nur geht damit keine unnötige Wartezeit damit entsteht... womit wir imo unserer Probleme haben wegen der 10000x ifmember.exe abfrage unter dos face-sad


Grüße
Marcel
Member: bastla
bastla Nov 24, 2008 at 23:17:11 (UTC)
Goto Top
Hallo free2k!

Auch wenn's noch unter den (sehr allgemein gehaltenen) Threadtitel passen würde, wäre das "Starten des Internet Explorers mit einer zu übergebenden Startzeit" ein Fall für einen neuen Beitrag - dort könntest Du dann auch etwas ausführlicher erklären, was eigentlich damit gemeint ist ...
Also ich müsste wissen wie die Varibale für Desktop des Users und wie man einen Shortcut dafür dann macht.... face-smile
Den Pfad zum Desktop erhältst Du so (Zeile 1 brauchst Du nur, wenn das "Shell"-Objekt nicht schon an anderer Stelle erzeugt wurde):
Set WshShell = WScript.CreateObject("WScript.Shell")  
strDesktop = WshShell.SpecialFolders("Desktop")  
Das Erstellen eines Shortcuts (in Deinem Batch wird ein solcher kopiert und nicht erstellt) wurde hier im Forum schon öfter abgehandelt.
gibt es einen Befehlt was überprüft ob die Datei in der Quelle neuer ist als die auf dem Desktop?
Für den Pfad zum "AllUsersDesktop" gibt es ebenfalls einen gleichnamigen "SpecialFolder" (siehe oben).

Um das Änderungsdatum einer Datei auszulesen, benötigst Du zunächst ein "FileSystemObject" (auch hier gilt: wenn ein solches bereits vorher erzeugt wurde, einfach dieses verwenden), dann ein "File"-Objekt und schließlich dessen "DateLastModified"-Eigenschaft - diese kannst Du dann mit dem auf dem selben Weg ermittelten "DateLastModified" der zu kopierenden Datei vergleichen.
Set WshShell = WScript.CreateObject("WScript.Shell")  
strAllUsersDesktop = WshShell.SpecialFolders("AllUsersDesktop")  
Set fso = CreateObject("Scripting.FileSystemObject")  
Set f = fso.GetFile(strAllUsersDesktop & "\test.help")  
dtHelpFile = f.DateLastModified
WScript.Echo "Änderungsdatum der vorhandenen ""test.help"": " & dtHelpFile  
(Die letzte Zeile dient natürlich nur als Demo / zum Testen.)

Dass Du für das Schreiben unter "All Users" Admin- oder Systemrechte benötigst, setze ich als bekannt voraus (insofern wäre dieser Teil des Scripts eher als "StartUp"-Script und nicht als "Logon"-Script zu verwenden).

Grüße
bastla