SID des angemeldeten Benutzers auslesen und in Variable (in Batch) setzen.
SID per Batch auslesen
Hallo,
ich versuche SID des angemeldeten Benutzers in Batch auszulesen und in einer Variable zu setzen, damit ich mit dieser den Pfad zum Papierkorb
ergänzen kann und generell für andere Zwecke in der Zukunft. Ich habe zwar ein VB-Skript, welches mit alle SID anzeigt bzw. anhand der angegebenen SID den Benutzernamen, allerdings sollte die Ausgabe in Batch sein.
Wäre es möglich die SID direkt mit Batch auszulesen oder nur über Umwege mit VBS? Das Letzere wäre natürlich auch eine vollständige und akzeptable Lösung.
Vielen Dank euch.
Gruß
evinben
Hallo,
ich versuche SID des angemeldeten Benutzers in Batch auszulesen und in einer Variable zu setzen, damit ich mit dieser den Pfad zum Papierkorb
Laufwerk:\$Recycle.Bin\S-1-5-21-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxx
Wäre es möglich die SID direkt mit Batch auszulesen oder nur über Umwege mit VBS? Das Letzere wäre natürlich auch eine vollständige und akzeptable Lösung.
Vielen Dank euch.
Gruß
evinben
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 187921
Url: https://administrator.de/forum/sid-des-angemeldeten-benutzers-auslesen-und-in-variable-in-batch-setzen-187921.html
Ausgedruckt am: 09.04.2025 um 07:04 Uhr
29 Kommentare
Neuester Kommentar
Moin.
Ich kenne in Batch nur das Kommandozeilentool user2sid hierfür.
http://evgenii.rudnyi.ru/soft/sid/sid.txt
Kompilierte Versionen gibt es merkwürdigerweise vom Autor nicht mehr, aber Google findet einige.
Ich kenne in Batch nur das Kommandozeilentool user2sid hierfür.
http://evgenii.rudnyi.ru/soft/sid/sid.txt
Kompilierte Versionen gibt es merkwürdigerweise vom Autor nicht mehr, aber Google findet einige.
Moin,
wenn du ein VBS hast das dir die SID ausließt, lass das VBS doch in Batch entstehen und von Batch ausführen, so kannst du dann die allgemeinen Variablen in batch und in VBS nutzen und die ausgabe der SIDs dann in eine TXT datei o.ä. schreiben lassen.
Gruß Zero
P.S.: Poste dein VBS doch mal hier, dann kann ich mein gelerntes Wissen (durch bastla haha) auch mal nutzen ;)
Ich nutze diese Variante ja selbst in einigen Batches wie du in meinen schon gestellten Fragen sicherlich siehst.
wenn du ein VBS hast das dir die SID ausließt, lass das VBS doch in Batch entstehen und von Batch ausführen, so kannst du dann die allgemeinen Variablen in batch und in VBS nutzen und die ausgabe der SIDs dann in eine TXT datei o.ä. schreiben lassen.
Gruß Zero
P.S.: Poste dein VBS doch mal hier, dann kann ich mein gelerntes Wissen (durch bastla haha) auch mal nutzen ;)
Ich nutze diese Variante ja selbst in einigen Batches wie du in meinen schon gestellten Fragen sicherlich siehst.
@ColdZero89
... wobei es ja kein Problem ist, auch ein VBScript aus dem Batch aufzurufen und die (mit "
Grüße
bastla
... wobei es ja kein Problem ist, auch ein VBScript aus dem Batch aufzurufen und die (mit "
WScript.Echo
" erzeugte) Ausgabe zu übernehmen - schematisch etwa:for /f "delims=" %%i in ('cscript //nologo "C:\Utils\GetSID.vbs"') do set "SID=%%i"
bastla
... wobei es ja kein Problem ist, auch ein VBScript aus dem Batch aufzurufen und die (mit "
Ausgabe zu übernehmen - schematisch etwa:
WScript.Echo
" erzeugte)Ausgabe zu übernehmen - schematisch etwa:
DAS wusste ich nun bisher nicht, dennoch finde ich die Variante "All in One" am ende schöner, somit kann man das script theoretisch hin und her schieben. (sofern Pfadangaben dann nicht absolut sind sondern relativ)
Aber so frisch ich mein wissen halt weiter auf ;P
Gruß Zero
P.S. was heißt eigentlich immer Delims? und ja die schöne Funktion For /? habe ich genutzt - kapier nur den kleinen satz wenig xD
"Gibt einen Satz von Trennzeichen an. Diese ersetzen die Standardtrennzeichen TAB und Leerzeichen."
HEIßT? was solls bewirken? ^^
Moin,
in die Batch baust du das sos ein
(ich hab ne böse vermutung da is mir irgendwo nen fehler unterlaufen und bastla rügt mich gleich
)
Du musst nun nur noch die Ausgabe gegen Gesetzte Variable tauschen und diese dann, wie du es gesagt hast mit echo in eine Datei schreiben.
Die Variablen rufst du in VBS mit "%VARIABLE%" auf.
Ich hoffe soweit ist alles richtig mir im Kopf geblieben ^_^ ansonsten bastla? Berichtige mich wenn ich was falsches erzählt/geschrieben habe.
Gruß Zero
P.S.: Ja bastla is nen Genie! (Egal ob Mann oder Frau - Hut ab ^-^)
in die Batch baust du das sos ein
set "%S%=%temp%\SID_auslesen.vbs"
> "%S%" echo 'This set it to the local Machine
>> "%S%" echo ' strComputer = "."
>> "%S%" echo 'Use a Network Computer Name here or it IP Address to run on a Network Computer
>> "%S%" echo ' strComputer = "COMPUTER_NAME OR IP_ADDRESS_HERE"
>> "%S%" echo Option Explicit
>> "%S%" echo Dim ColItems, ObjItem, Sid, strComputer, Wmi
>> "%S%" echo strComputer = "."
>> "%S%" echo Set Wmi = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
>> "%S%" echo Set ColItems = Wmi.ExecQuery("SELECT * FROM Win32_UserAccount",,48)
>> "%S%" echo For Each ObjItem in ColItems
>> "%S%" echo Sid = Sid & _
>> "%S%" echo "SID " & vbTab & objItem.SID & vbCrLf &_
>> "%S%" echo "Name" & vbTab & objItem.Name & vbCrLf & vbCrLf
>> "%S%" echo Next
>> "%S%" echo MsgBox Sid, 0 + 32, "Sid Values"
cscript //nologo "%S%"
Du musst nun nur noch die Ausgabe gegen Gesetzte Variable tauschen und diese dann, wie du es gesagt hast mit echo in eine Datei schreiben.
Die Variablen rufst du in VBS mit "%VARIABLE%" auf.
Ich hoffe soweit ist alles richtig mir im Kopf geblieben ^_^ ansonsten bastla? Berichtige mich wenn ich was falsches erzählt/geschrieben habe.
Gruß Zero
P.S.: Ja bastla is nen Genie! (Egal ob Mann oder Frau - Hut ab ^-^)
Hallo ColdZero89!
Rügen werde ich Dich sicher nicht, aber wenn die Ausgabe in den Batch (und / oder in eine Datei) soll, besser wie oben angesprochen "
... dann funktioniert nämlich zB auch
Für die Weiterverarbeitung würde es sich aber anbieten, SID und Name ohne zusätzliche Angaben in einer Zeile auszugeben, etwa:
wobei das Trennzeichen natürlich kein TAB sein muss ...
Übrigens zu "
Grüße
bastla
P.S.: Bin keine "bastlarine", nehme die Blumen aber trotzdem gerne an ...
Rügen werde ich Dich sicher nicht, aber wenn die Ausgabe in den Batch (und / oder in eine Datei) soll, besser wie oben angesprochen "
WScript.Echo
" anstelle von "MsgBox
" ...... dann funktioniert nämlich zB auch
cscript //nologo "%S%">SID.txt
WScript.Echo objItem.SID & vbTab & objItem.Name
Übrigens zu "
for
" und "delims
": Es gibt hier doch ein so schönes Tutorial zur FOR-Schleife ...Grüße
bastla
P.S.: Bin keine "bastlarine", nehme die Blumen aber trotzdem gerne an ...
Hallo Zusammen!
@evinben
Falls dir WMIC zur Verfügung steht, wäre auch dies möglich:
Grüße
rubberman
@evinben
Falls dir WMIC zur Verfügung steht, wäre auch dies möglich:
@echo off &setlocal
for /f %%i in ('WMIC USERACCOUNT Where "Name='%username%'" Get SID /value') do (
for /f %%j in ("%%i") do set "%%j"
)
echo %SID%
pause
Grüße
rubberman
Hallo evinben.
Die zweite FOR /F Schleife wäre für die meisten Verarbeitungen einer Befehlsausgabe so unnütz wie ein Kropf. Die Ausgabe von WMIC ist jedoch (abhängig von der Version) in Unicode. Daran verschluckt sich die CMD einmal kräftig und spuckt einen verunglückten Zeilenumbruch (<CR><CR><LF>) aus. Eine erneute Verwurstung dieser Ausgabe in der 2. Schleife beseitigt diesen Fehler.
Und ja, der Inhalt von %%j wird expandiert bevor der SET Befehl ausgeführt wird. Somit kommt das '=' im Wert zum Tragen.
Grüße
rubberman
Die zweite FOR /F Schleife wäre für die meisten Verarbeitungen einer Befehlsausgabe so unnütz wie ein Kropf. Die Ausgabe von WMIC ist jedoch (abhängig von der Version) in Unicode. Daran verschluckt sich die CMD einmal kräftig und spuckt einen verunglückten Zeilenumbruch (<CR><CR><LF>) aus. Eine erneute Verwurstung dieser Ausgabe in der 2. Schleife beseitigt diesen Fehler.
Und ja, der Inhalt von %%j wird expandiert bevor der SET Befehl ausgeführt wird. Somit kommt das '=' im Wert zum Tragen.
Grüße
rubberman
Hallo evinben,
so ganz verstehe ich das nicht.
1. brauchst du dieses WMI Query nicht als Admin laufen zu lassen. UAC Prompt kommt auch nicht.
2. selbst wenn ich das Ding als Admin rennen lasse (mit meinem Account unter erhöhten Rechten), kommt immer noch die richtige Ausgabe.
Wenn du natürlich mit dem Adminaccount angemeldet bist (oder per RunAs) gibt es die SID des Admin Accounts. Was auch sonst?
Klar kannst du alle Accounts und die zugehörige SID als Liste bekommen, aber woher soll ein "dummes" Batchscript wissen, wer nun üblicherweise an dieser Kiste angemeldet ist? Wir haben in unserer Firma Rechner, an denen sitzen immer mal wieder andere Praktikanten. Unsere IT verpasst jedem von denen ihren eigenen Account. Mittlerweile sind da bestimmt 20 oder 30 Profile drauf... Wer ist denn da nun der User, den du benötigst? Kannst du irgend eine Regel definieren?
Grüße
rubberman
so ganz verstehe ich das nicht.
1. brauchst du dieses WMI Query nicht als Admin laufen zu lassen. UAC Prompt kommt auch nicht.
2. selbst wenn ich das Ding als Admin rennen lasse (mit meinem Account unter erhöhten Rechten), kommt immer noch die richtige Ausgabe.
Wenn du natürlich mit dem Adminaccount angemeldet bist (oder per RunAs) gibt es die SID des Admin Accounts. Was auch sonst?
Klar kannst du alle Accounts und die zugehörige SID als Liste bekommen, aber woher soll ein "dummes" Batchscript wissen, wer nun üblicherweise an dieser Kiste angemeldet ist? Wir haben in unserer Firma Rechner, an denen sitzen immer mal wieder andere Praktikanten. Unsere IT verpasst jedem von denen ihren eigenen Account. Mittlerweile sind da bestimmt 20 oder 30 Profile drauf... Wer ist denn da nun der User, den du benötigst? Kannst du irgend eine Regel definieren?
Grüße
rubberman
Hallo evinben.
Das ist ja in dem Fall der Administratoraccount, denn ausgeführt wird die Datei erst nach UAC Prompt mit Passworteingabe.
Dann sollte der Admin soviel Vertrauen haben, und dem Benutzer gleich die nötigen Rechte einräumen. Das macht deutlich mehr Sinn, als sein Passwort weiter zu geben.
Grüße
rubberman
Das ist ja in dem Fall der Administratoraccount, denn ausgeführt wird die Datei erst nach UAC Prompt mit Passworteingabe.
Dann sollte der Admin soviel Vertrauen haben, und dem Benutzer gleich die nötigen Rechte einräumen. Das macht deutlich mehr Sinn, als sein Passwort weiter zu geben.
Grüße
rubberman
Hallo evinben.
Irgend eine Möglichkeit findet sich immer
Einmal von hinten durch die Brust ins Knie:
Ganz ohne temporäres VBScript geht's diesmal nicht. Starte per Doppelklick. Der UAC Prompt kommt später.
Dort wo momentan das
Auch ein schönes WE!
rubberman
Irgend eine Möglichkeit findet sich immer
Einmal von hinten durch die Brust ins Knie:
@echo off &setlocal
if "%~1" == "" (
for /f %%i in ('WMIC USERACCOUNT Where "Name='%username%'" Get SID /value') do (
for /f %%j in ("%%i") do set "%%j"
)
set "me=%~f0"
set "vbs=%temp%\uac.vbs"
setlocal EnableDelayedExpansion
>"!vbs!" echo CreateObject^("Shell.Application"^).ShellExecute """!comspec!""", " /c ""!me!"" !SID!", "" , "runas", 1
call "!vbs!"
del "!vbs!"
endlocal
goto :eof
)
echo SID: %1
pause
Dort wo momentan das
echo SID: %1
steht kommt der Code den du als Admin ausführen willst.Auch ein schönes WE!
rubberman
Hallo evinben.
zum ersten:
In VBScript stehen Strings in Anführungszeichen eingeschlossen. Anführungszeichen innerhalb eines Strings müssen verdoppelt werden.
Willst du die umschließenden Anführungszeichen im Batch wieder entfernen, dann mit Tilde arbeiten (%~1 %~2).
zum zweiten:
So wie du denkst, liegen die Daten nicht im Papierkorb vor. Das Ding ist sicher ein Shellfolder und irgendwie virtualisiert. Ich müsste aber jetzt auch erst die Suchmaschine anwerfen ...
Grüße
rubberman
zum ersten:
CreateObject("Shell.Application").ShellExecute "D:\Projekte All User\Joint all files on current direction.bat","""E:\Projekte 2012\Daten 07.2012.txt"" ""D:\Projekte All User\Daten 07.2012.txt""",,"runas",1
Willst du die umschließenden Anführungszeichen im Batch wieder entfernen, dann mit Tilde arbeiten (%~1 %~2).
zum zweiten:
So wie du denkst, liegen die Daten nicht im Papierkorb vor. Das Ding ist sicher ein Shellfolder und irgendwie virtualisiert. Ich müsste aber jetzt auch erst die Suchmaschine anwerfen ...
Grüße
rubberman
Hallo evinben.
Habe mal etwas gespielt. Also, ja, der Papierkorb ist ein Shellfolder. Mit den normalen Methoden des Filesystems kommst du nicht weit. Hier musst du dich auf VBS stützen, um mit Bordmitteln arbeiten zu können. Aber der Reihe nach ...
Auf meiner Kiste hier habe ich 2 Partitionen, C: und D:. Auf jeder Partition habe ich eine leere Textdatei erstellt und in den Papierkorb geschoben ("Neues Textdokument.TXT" auf C: und "Neues Textdokument_2.TXT" auf D: ).
Zunächst hab ich mir mal angesehen, was sich im Papierkorb befindet, und zwar mittels Batch seitens Filesystem:
*.bat
Ausgabe:
Weit und Breit nichts von den Originaldateinamen zu sehen. Dafür scheint es so dass je eine Datei beginnend mit $R existiert die die Originaldatei repräsentiert, sowie eine Datei beginnend mit $I die eine Binärdatei ist in der u. A. der ursprüngliche Pfad und Dateiname zu finden ist.
Somit sollte klar sein dass ein Verschieben einer Datei in den Papierkorb mittels Batch nicht funktionieren wird. Die Datei befindet sich dann zwar in diesem Verzeichnis, die Funktionen des Papierkorbs (angefangen bei der Anzeige im Explorerfenster, bis hin zu der Wiederherstellung der Datei) sind aber dafür nicht verfügbar.
Ergo - Shellfolder in VBScript austesten. Namespace 0x0A repräsentiert den Papierkorb des Benutzers:
*.vbs
Ausgabe:
Aha! Das sieht schon besser aus. Fehlt zwar die Beziehung zur $I Datei, aber egal.
Wir bekommen ja auch noch den gesamten Papierkorb (gesammelte Werke aus C: und D: ), also Probe auf's Exempel:
*.vbs
Der Witz ist, dass ich trotzdem den Inhalt des gesamten Papierkorbs bekomme und nicht nur von C:. Warum? Ich hab keine Ahnung!
However. Du versuchst ja per Script eine Datei in den Papierkorb zu verschieben. Mit:
*.vbs
... hatte ich Erfolg. Siehe Folder.MoveHere method
Grüße
rubberman
Habe mal etwas gespielt. Also, ja, der Papierkorb ist ein Shellfolder. Mit den normalen Methoden des Filesystems kommst du nicht weit. Hier musst du dich auf VBS stützen, um mit Bordmitteln arbeiten zu können. Aber der Reihe nach ...
Auf meiner Kiste hier habe ich 2 Partitionen, C: und D:. Auf jeder Partition habe ich eine leere Textdatei erstellt und in den Papierkorb geschoben ("Neues Textdokument.TXT" auf C: und "Neues Textdokument_2.TXT" auf D: ).
Zunächst hab ich mir mal angesehen, was sich im Papierkorb befindet, und zwar mittels Batch seitens Filesystem:
*.bat
dir /a /s C:\$recycle.bin\S-1-5-21-4XXXXXXXXX-XXXXXXXXXX-XXXXXXXXX2-1000
echo(&echo ------------------------------------------------------------------&echo(
dir /a /s D:\$recycle.bin\S-1-5-21-4XXXXXXXXX-XXXXXXXXXX-XXXXXXXXX2-1000
Datenträger in Laufwerk C: ist Acer
Volumeseriennummer: 0XXX-XXXC
Verzeichnis von C:\$recycle.bin\S-1-5-21-4XXXXXXXXX-XXXXXXXXXX-XXXXXXXXX2-1000
16.07.2012 15:36 <DIR> .
16.07.2012 15:36 <DIR> ..
16.07.2012 15:36 544 $I9FHN32.TXT
16.07.2012 15:35 0 $R9FHN32.TXT
13.04.2012 20:34 129 desktop.ini
3 Datei(en), 673 Bytes
Anzahl der angezeigten Dateien:
3 Datei(en), 673 Bytes
2 Verzeichnis(se), 215.856.205.824 Bytes frei
------------------------------------------------------------------
Datenträger in Laufwerk D: ist Volume
Volumeseriennummer: CXXX-XXX6
Verzeichnis von D:\$recycle.bin\S-1-5-21-4XXXXXXXXX-XXXXXXXXXX-XXXXXXXXX2-1000
16.07.2012 15:36 <DIR> .
16.07.2012 15:36 <DIR> ..
16.07.2012 15:36 544 $I36FXMR.TXT
16.07.2012 15:35 0 $R36FXMR.TXT
13.04.2012 23:27 129 desktop.ini
3 Datei(en), 673 Bytes
Anzahl der angezeigten Dateien:
3 Datei(en), 673 Bytes
2 Verzeichnis(se), 38.474.506.240 Bytes frei
Somit sollte klar sein dass ein Verschieben einer Datei in den Papierkorb mittels Batch nicht funktionieren wird. Die Datei befindet sich dann zwar in diesem Verzeichnis, die Funktionen des Papierkorbs (angefangen bei der Anzeige im Explorerfenster, bis hin zu der Wiederherstellung der Datei) sind aber dafür nicht verfügbar.
Ergo - Shellfolder in VBScript austesten. Namespace 0x0A repräsentiert den Papierkorb des Benutzers:
*.vbs
Set oShApp = CreateObject("Shell.Application")
Set oRecycler = oShApp.Namespace(&h0A)
Set colItems = oRecycler.Items()
For Each oItem in colItems
txt = txt & oItem.Name & vbNewLine & oItem.Path & vbNewLine & vbNewLine
Next
WScript.Echo txt
Neues Textdokument_2.TXT
D:\$RECYCLE.BIN\S-1-5-21-4XXXXXXXXX-XXXXXXXXXX-XXXXXXXXX2-1000\$R36FXMR.TXT
Neues Textdokument.TXT
C:\$Recycle.Bin\S-1-5-21-4XXXXXXXXX-XXXXXXXXXX-XXXXXXXXX2-1000\$R9FHN32.TXT
Wir bekommen ja auch noch den gesamten Papierkorb (gesammelte Werke aus C: und D: ), also Probe auf's Exempel:
*.vbs
Set oShApp = CreateObject("Shell.Application")
Set oRecycler = oShApp.Namespace("C:\$Recycle.Bin\S-1-5-21-4XXXXXXXXX-XXXXXXXXXX-XXXXXXXXX2-1000")
Set colItems = oRecycler.Items()
For Each oItem in colItems
txt = txt & oItem.Name & vbNewLine & oItem.Path & vbNewLine & vbNewLine
Next
WScript.Echo txt
However. Du versuchst ja per Script eine Datei in den Papierkorb zu verschieben. Mit:
*.vbs
oRecycler.moveHere "C:\Pfad\Datei.ext"
Grüße
rubberman
Zitat von @evinben:
Es würde mich brennend interessieren, wie du überhaupt auf die Idee gekommen bist Namespace 0x0A zu benutzen!
Es würde mich brennend interessieren, wie du überhaupt auf die Idee gekommen bist Namespace 0x0A zu benutzen!
Hallo evinben.
Steht alles geschrieben, man muss nur wissen wo
ShellSpecialFolderConstants enumeration
Grüße
rubberman
Hallo evinben.
Dein Script funktioniert bei mir im Test ohne Probleme. Es liegt also die Vermutung nahe dass irgendwas mit dem Inhalt der Textdatei nicht stimmt. Ich gehe davon aus, dass dir deine Zeile 20 was ausspuckt? Falls nicht, hättest du es erwähnt, hoffe ich
Nun weiß ich nicht wie die Datei aussieht oder erzeugt wird. Darum kann ich dir erst mal nur Tipps geben, wie du die Ursache heraus bekommst.
1. Du könntest deine Zeile 20 mal wie folgt ändern:
Damit wird ersichtlich, ob du Leerzeichen am Zeilenende hast o.Ä.
2. Öffne die Datei in einem HEX Editor und schau dir an in welchem Zeichensatz der Inhalt vorliegt. Vielleicht liegt es daran dass die Datei im UTF-8 oder Unicode Format gespeichert ist.
3. Schreib mal eine Datei per Hand mit dem guten alten Notepad Editor. Achte beim Speichern auf das oben Genannte. (Keine Leerzeichen am Ende, Codierung ANSI)
Grüße
rubberman
Dein Script funktioniert bei mir im Test ohne Probleme. Es liegt also die Vermutung nahe dass irgendwas mit dem Inhalt der Textdatei nicht stimmt. Ich gehe davon aus, dass dir deine Zeile 20 was ausspuckt? Falls nicht, hättest du es erwähnt, hoffe ich
Nun weiß ich nicht wie die Datei aussieht oder erzeugt wird. Darum kann ich dir erst mal nur Tipps geben, wie du die Ursache heraus bekommst.
1. Du könntest deine Zeile 20 mal wie folgt ändern:
msgbox """" & Zeile & """"
2. Öffne die Datei in einem HEX Editor und schau dir an in welchem Zeichensatz der Inhalt vorliegt. Vielleicht liegt es daran dass die Datei im UTF-8 oder Unicode Format gespeichert ist.
3. Schreib mal eine Datei per Hand mit dem guten alten Notepad Editor. Achte beim Speichern auf das oben Genannte. (Keine Leerzeichen am Ende, Codierung ANSI)
Grüße
rubberman
Hallo evinben,
ich hatte keine umschließenden Anführungszeichen in meiner Testdatei. Hat tadellos funktioniert.
Die Anführungszeichen sind die Kennzeichnung für einen String im Quellcode, um einen String von eigentlichen Code (Variablen etc.) zu separieren. Sie sind letztlich nicht Bestandteil des Strings bei der Verabeitung der Zeichenfolge.
Grüße
rubberman