2nd.level.noobie
Goto Top

Übergabe einer Zeile die vor der per findstr gefundenen Zeile liegt

Aaaalso erstmal ein freundliches Hallo und wie gehts.
Ich nutze euer Forum seit ein paar Tagen für Recherchen bezüglich Batch und Shell und bin jetzt leider an einem Problem angelangt, dass ich allein nicht lösen kann. Ich bin auch ein relativ blutiger Anfänger im cmd Coding aber versuche mein bestes, mich hineinzulesen.

Da ich aktuell bis zur Freischaltung meines Account im Ticketsystem unserer Firma noch ein wenig Freizeit habe, habe ich eine kleine Batch zur Sicherung eines Userprofils, die wir per Remote lokal auf dem User-PC ausführen können geschrieben, sprich Nutzerdaten kopieren, C:\Users\Userx löschen, restore.bat im Backupverzeichnis erstellen, mit der nach den notwendigen Änderungen die Daten wiederhergestellt werden können und Selbstlöschung zum Abschluss. Soweit funktioniert das auch alles hervorragend.

Jetzt möchte ich allerdings auch, dass gleichzeitig der Registrierungsschlüssel des Nutzers mit gelöscht wird, damit beim Neustart des Rechners die per Richtlinien gesetzten User Policys (die häufiger mal eine Fehlerquelle sind) neu gezogen werden.

Dieser Schlüssel liegt unter "HKLM\software\microsoft\windows nt\currentversion\profilelist\xyz"
XYZ hat hierbei keinerlei Bezug zum Username / Tag. Unter XYZ wiederum finde ich aber einen Schlüssel "profileimagepath" in dem der Wert das Usertags enthalten ist.

Da ich zu Beginn der Batchdatei diesen Tag eingebe um das Löschen anderer Profile auf dem Rechner zu vermeiden, suche ich mithile dieses Wertes den zugehörigen Schlüssel.
Ich möchte jetzt aber den wiederum übergeordneten Schlüssel XYZ finden und löschen. Und genau da liegt mein Problem, denn per findstr finde ich nur die Zeile, die den Wert "usertag" enthält, nicht aber die darüber liegende, die den Pfad zum übergeordneten Schlüssel angibt.

Faktum Code:
set /p "User="Please enter UserTag:""  
reg query "HKLM\software\microsoft\windows nt\currentversion\profilelist" /s /v "profileimagepath" >>c:\temp\temp\temp.txt  
findstr /I /C:%user% c:\temp\temp\temp.txt >>c:\temp\temp\temp2.txt

(Hier liegt mein Problem)

SET /p Key=<c:\temp\temp2.txt
REG DELETE "%Key%" /v "profileimagepath" /f  

Bsp für den Inhalt der temp.txt:


HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\profilelist\S-1-5-18
ProfileImagePath REG_EXPAND_SZ %systemroot%\system32\config\systemprofile

HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\profilelist\S-1-5-19
ProfileImagePath REG_EXPAND_SZ C:\Windows\ServiceProfiles\LocalService

HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\profilelist\S-1-5-20
ProfileImagePath REG_EXPAND_SZ C:\Windows\ServiceProfiles\NetworkService

HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\profilelist\S-1-5-21-2010745621-3381963674-1579942189-1806914
ProfileImagePath REG_EXPAND_SZ C:\Users\stuebnpa

HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\profilelist\S-1-5-21-2010745621-3381963674-1579942189-2145428
ProfileImagePath REG_EXPAND_SZ C:\Users\bielagT

Ich möchte nun mithilfe des Tags "stuebnpa" die Zeile
"HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\profilelist\S-1-5-21-2010745621-3381963674-1579942189-1806914"
an temp2.txt ausgeben um sie von dort auf die Variable %Key% zu schicken.

Bin leider echt am Ende meines Lateins angelangt und würde mich über Hilfe sehr freuen. Mir ist auch bewusst, dass mein Coding sicherlich sehr umständlich ist, aber wie gesagt, ich bin noch blutiger Anfänger.

lg
Franco

edit: Aufgrund der Firmenrichtlinien sind leider weder externe Tools, noch Powershell möglich. Einzig und allein in cmd ausführbare Bordmittel. Benutzt wird Win7 / Win8.

Content-Key: 295747

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

Ausgedruckt am: 29.03.2024 um 11:03 Uhr

Mitglied: emeriks
emeriks 10.02.2016 aktualisiert um 11:04:51 Uhr
Goto Top
Hi,
es ist zwar nich Deine Frage, aber ...

habe ich eine kleine Batch zur Sicherung eines Userprofils, die wir per Remote lokal auf dem User-PC ausführen können geschrieben, sprich Nutzerdaten kopieren, C:\Users\Userx löschen, restore.bat im Backupverzeichnis erstellen, mit der nach den notwendigen Änderungen die Daten wiederhergestellt werden können und Selbstlöschung zum Abschluss.
Klassische Roaming Pofiles sind nichst für Euch?

Jetzt möchte ich allerdings auch, dass gleichzeitig der Registrierungsschlüssel des Nutzers mit gelöscht wird, damit beim Neustart des Rechners die per Richtlinien gesetzten User Policys (die häufiger mal eine Fehlerquelle sind) neu gezogen werden.
User Policies werden niemals beim Neustart eines Computers "gezogen". Du meinst sich "bei nächster Anmeldung"?
Aber auch hier:
  1. Im Zusammenhang mit Roaming Profiles und der GPo zum Löschen der lokalen Kopie des Profiles bei Abmeldung könntest Du das Löschen der Registry-Einträge auch erschlagen.
  2. Das erneute Anwenden von GPO - auch wenn diese sich nicht geändert haben - kann man ganz einfach mit "gpupdate /force" erzwingen.

E.
Mitglied: 2nd.level.noobie
2nd.level.noobie 10.02.2016 aktualisiert um 11:18:11 Uhr
Goto Top
Erstmal danke für deine Antwort. face-smile
Ja, ich meine natürlich bei Neuanmeldung am Rechner und ja, wir nutzen bereits Roaming Profiles die per Smartcard mitgenommen werden
Darin sind allerdings nur die absoluten Basics festgelegt wie bestellte Software, Policies usw.

Viele User nutzen zum sichern ihrer Daten leider auch nicht das bereitgestellte Netzlaufwerk sondern "Eigene Dokumente" u.ä.

Nun treten in letzter Zeit allerdings oft Fehler mit neu bestellter Software auf, die auf fehlende/falsch gesetzte lokale Rechte zurückzuführen sind.
Da ich im 2nd Level Support tätig bin und wir gerade einen globalen Rollout anschieben, habe ich keine Zeit, mich jedes Mal auf individuelle Fehlersuche zu begeben. Aktuell lassen sich 99,9% dieser Fehler durch einen Profilreset beheben, daher auch die Batch zum Backup. Ich möchte mir einfach das manuelle Suchen per regedit ersparen und in die Batch implementieren.

Ich weiß, das ist nicht sonderlich elegant, aber momentan ziemlich effizient.
Mitglied: emeriks
emeriks 10.02.2016 aktualisiert um 11:39:02 Uhr
Goto Top
wir nutzen bereits Roaming Profiles die per Smartcard mitgenommen werden
Darin sind allerdings nur die absoluten Basics festgelegt wie bestellte Software, Policies usw.
Error! Hier verwechselst Du garantiert etwas. Oder meinst Du etwa "verbindliche Profile"?

Viele User nutzen zum sichern ihrer Daten leider auch nicht das bereitgestellte Netzlaufwerk sondern "Eigene Dokumente" u.ä.
Dafür gibt es dann ja die Ordnerumleitung per GPO.

Nun treten in letzter Zeit allerdings oft Fehler mit neu bestellter Software auf, die auf fehlende/falsch gesetzte lokale Rechte zurückzuführen sind.
Da ich im 2nd Level Support tätig bin und wir gerade einen globalen Rollout anschieben, habe ich keine Zeit, mich jedes Mal auf individuelle Fehlersuche zu begeben. Aktuell lassen sich 99,9% dieser Fehler durch einen Profilreset beheben, daher auch die Batch zum Backup. Ich möchte mir einfach das manuelle Suchen per regedit ersparen und in die Batch implementieren.

Ich weiß, das ist nicht sonderlich elegant, aber momentan ziemlich effizient.
Roaming Profiles + Löschen der lokalen Kopien bei Abmeldung + VSS auf dem Servervolume, wo die Roaming Profiles gespeichert sind
Wenn ein Profil Ärger macht:
  1. Benutzer abmelden
  2. VSS auf dem Server anstossen oder darauf verzichten, wenn die letzte zeitgesteuerte VSS-Kopie ausreichend ist
  3. Profil auf dem Server löschen
  4. Benutzer anmelden --> hat jetzt wieder ein frischen Profil
  5. bei Benutzerabmeldung wird das Roaming Profile wieder auf dem Server kopiert
  6. sollte das alte Profil nochmal benötigt werden, dann ist es eine Weile noch im VSS --> könnte man per Script auf dem Server sichern
Mitglied: 2nd.level.noobie
2nd.level.noobie 10.02.2016 um 11:46:07 Uhr
Goto Top
Hmmm die Lösung per Schattenkopie ist intelligent, scheitert aber an meinen fehlenden Zugriffsrechten aufs Servervolume. Und unsere IT-Sec Abteilung ist nicht erfreut, wenn sie ständig Tickets von uns erhält, dass wir temporär Rechte benötigen. face-sad

Ich sag mal so - meine Optionen beschränken sich auf größtenteils auf Remotehilfe beim User. Welche Optionen hab ich da noch?
Mitglied: emeriks
emeriks 10.02.2016 um 11:58:08 Uhr
Goto Top
Wieso? Du hast doch als 2nd Level sicher auch Zugriff auf das Roaming Profile, denn sonst könntest Du doch dem Benutzer kein neues Profil verschaffen?
Falls ja, dann kannst Du das Profil auch klassisch vom Server kopieren. Oder einfach nur den Pfad umbennen. Bei nächster Anmeldung des Benutzers wird dieser sofort wieder erstellt.
Und wie gesagt: Ordnerumleitungen sind Dein Freund, wenn Du das Benutzerprofil schlank halten und verhindern willst, dass Benutzerdaten durch Löschen des Profiles verloren gehen könnten.

(Wohlgemerkt: Alles immer im Rahmen der Idee mit dem Roaming Profiles und dem löschen der lokalen Kopien bei Abmeldung.)
Mitglied: 2nd.level.noobie
2nd.level.noobie 10.02.2016 um 12:18:40 Uhr
Goto Top
Ich glaube, wir reden aneinander vorbeioder ich bin zu doof face-smile
Also: Die User nutzen ihre Smartcard um sich per wave an jedem Rechner der Firma anzumelden. Beim anmelden wird automatisiert ihr Roaming Profile vom Server gezogen. Dieses enthält ihre globalen Rechte, den Link zu ihrem Netzlaufwerk, ihre Office Registrierung/Outlook Einstellungen und ihre bestellte Software, die sie dann lokal übers Softwarecenter installieren könn(t)en.

Da jeder User aber einen eigenen Arbeitsplatz hat, ist das entsprechende lokale Profil natürlich viel größer. Sprich Browereinstellungen, Desktopverknüpfungen/-dateien, eigene Dokumente usw usw. Nach Firmenrichtlinie ist jeder User für seine Daten selbst verantwortlich, sprich, es ist mir untersagt, dem User eine Ordnerumleitung anzulegen. Sein "gewachsenes" Profil wird bei Abmeldung nicht gelöscht sondern bleibt lokal hinterlegt.

Wenn ich jetzt ohne Backup einfach nur das lokale Profil lösche, erhält er bei Wiederanmeldung das blanke Roaming Profile vom Server. Das ist zwar fachlich richtig aber der User ist sauer weil sein lokales Setting weg ist.
Ja, eigentlich sollte der User alles im Netzlaufwerk ablegen, tut er aber nicht. Und da ich nett bin, will ich ihm trotzdem helfen.
Mitglied: 114757
Lösung 114757 10.02.2016 aktualisiert um 13:37:37 Uhr
Goto Top
Powershell:
$user = Read-Host 'User eingeben'  
gci "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\ProfileList" | ?{$_.GetValue('ProfileImagePath') -eq "C:\Users\$user"} | select -Expand Name  
Batch
@echo off & setlocal
set /p user=Usertag eingeben:
set REGPATH=
for /f "skip=1 delims=" %%a in ('reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList" /d /s /f "C:\Users\%user%"') do (  
    echo %%a| findstr /ic:"HKEY_LOCAL_MACHINE" >nul && (if not defined REGPATH set "REGPATH=%%a")  
)
echo %REGPATH%
Gruß jodel32
Mitglied: 2nd.level.noobie
2nd.level.noobie 10.02.2016 um 13:37:32 Uhr
Goto Top
Was soll ich sagen. Perfekt. Danke.
Mitglied: 114757
114757 10.02.2016 aktualisiert um 13:55:34 Uhr
Goto Top
Zitat von @2nd.level.noobie:

Was soll ich sagen. Perfekt. Danke.
de rien mon ami face-smile