Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Frage Entwicklung Batch & Shell

Skriptbasierter DomainJoin und Migration des lokalen Profils

Mitglied: LuckyPuncher

LuckyPuncher (Level 1) - Jetzt verbinden

09.10.2009 um 01:58 Uhr, 3872 Aufrufe, 8 Kommentare

Hallo Community, bisher war ich nur begeisterter Leser der Tips und Tricks. Nun brauche ich selbst das Wissen und die Erfahrung die sich hier im Forum wiederfindet

ich stehe gerade vor der Herausforderung, etwa 40zig NT 4 (!) Workstations in die Domäne aufzunehmen und dabei sicherzustellen, dass bereits installierte Software danach noch weiter tut.
einige Sachen habe ich schon als CMD-Skripte gebaut (Domainjoin, DNS Eintrag ändern mit reg.exe, DNS-Suffixsuchliste ändern).

Es befinden sich mehrere Benutzerprofile auf den Clients. Die Profile sollen nach dem Domänenbeitritt weiterhin lokal bleiben.
Da ich nicht jeden einzelnen Benutzer anmelden will, sollen alle Schritte, die bei einer ersten Anmeldung eines Benutzers mit seinem Domänenkonto am Rechner ausgeführt werden, per Skript ausgelöst werden.
Das blosse kopieren des BenutzerProfils von C:\Winnt\profiles\username nach C:\winnt\profiles\username.000 reicht dabei ja nicht aus um ordentlich zu funktionieren.
Zusätzlich muss ich die ntuser.dat sowie die userclass.dat laden und hierin die SIDs (localuser - domainuser) tauschen.

ich habe mir folgendes Vorgehen vorgestellt:

1. Profile auf C:\winnt\profiles auslesen und nur diejenigen in eine Datei (proflist.txt) schreiben die relevant sind. z.B. System gibt es in der AD nicht.

@echo off
set domain=000
cd /d C:\winnt\profiles
dir /B /A:D | findstr /r /v ^.*00.$>profile.txt

for /f "tokens=* delims=" %%i in (proflist.txt) do call :process %%i
goto :eof

:process
set profname=%1
if /I %profname%==system goto :cancel
if /I %profname%==other goto :cancel
xcopy %profroot%\%profname%\*.* %profroot%\%profname%.%domain%\*.* /S /C /H /E /R /K
goto :eof

:Cancel
@echo %profname%>>notmigrated.txt
goto :eof
2. die Datei profile.txt nochmals verwenden um neue einträge für jeden Domänenbenutzer unter HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\<USER> anzulegen. Dabei jeweils mittels psgetsid prüfen ob es für den Benutzeraccount bereits eine Entsprechung in der Domäne gibt.

@echo off
setlocal enableextensions

set adjoinUN=administrator
set adjoinPW=password
set dcname=DCNAME
set domainnb=ADSDOMAIN

set regspath="HKlm\software\microsoft\windows nt\currentversion\profilelist"
for /f "tokens=* delims=" %%i in ('reg.exe query %regspath%') do call :profimg %%i
goto :eof

:profimg
set foundsid=%1
set "usersid=%foundsid:[=%"
set "usersid=%usersid:]=%"
psgetsid -accepteula %usersid% >nul
set sidcheck=psgetsid.exe \\%dcname% -u %domainnb%\%adjoinUN% -p %adjoinPW% %usersid%
for /f "tokens=* delims=" %%a in (''%sidcheck%') do (
echo %errorlevel%
)
goto :eof

:end
und hier komme ich nicht weiter: die Ausgabe des Errorlevels entspricht nicht dem was ich erwarte. Egal ob ein aus der profilelist.txt abgearbeiteter User in der Domäne ist (Errorlevel sollte 0 sein) oder nicht ise (Errorlevel NOT 0): Der Errorlevel ist immer gleich.?!

Im Anschluss wollte ich wie folgt weitermachen.
- wenn errorcode =1 dann sid/user auslassen und weitermachen
- wenn errorcode =0 dann mittels 'reg add' die DomänenSID unter HKlm\software\microsoft\windows nt\currentversion\profilelist eintragen.
- dann darunter den Reg_Expand_Sz Eintrag 'Profilimagepath' mit dem Wert: %SystemDrive%\Winnt\Profiles\<domainuser> eintragen.
- jeweiligen Domänenbenutzer auf HKlm\software\microsoft\windows nt\currentversion\profilelist\<SID von Domänenbenutzer> rekursiv berechtigen

Vielleicht könnt Ihr mir weiterhelfen.

Danke schon einmal
JPLC
Mitglied: TsukiSan
09.10.2009 um 04:23 Uhr
Hallo LuckyPuncher,

ändere doch mal:
01.
echo %errorlevel%
in:
01.
echo Errorlevel :%sidcheck%
und nimm mal in
(''%sidcheck%')
die " und ' raus.
Die gehören da IMHO nicht nicht.?!

Den Rest machst du dann mit einer IF-Auswertung:

01.
If Errorlevel = 1 then goto Bedingung1 
02.
If Errorlevel = 0 then goto Bedingung0
Gib mal Bescheid.

Gruß
Tsuki
Bitte warten ..
Mitglied: LuckyPuncher
09.10.2009 um 10:57 Uhr
Hallo TsukiSan

Danke für die Rückmeldung.

ändere doch mal:
01.
> echo %errorlevel% 
02.
> 
in:
01.
> echo Errorlevel :%sidcheck% 
02.
> 

habe ich, bringt bei mir ledglich eine Ausgabe.

01.
Errorlevel :psgetsid.exe \\DCNAME -u ADSDOMAIN\administrator -p password S-1-5-21-... 
02.
 
M.E muss die umgebungsvariable Errorlevel immer mit %errorlevel% angesprochen werden um nicht als normale Abfolge von Zeichen interpretiert zu werden.

Mein Problem ist, dass der Wert von %errorlevel% immer true ist, egal ob die Ausführung von PSGETSID.exe samt Paramtern zu einem Fehler geführt hat. Z.B. SID gibt es nicht.

Erst wenn %errorlevel% als solche richtig gesetzt wird, macht eine weitere Auswertung Sinn.

Gruß
LuckyPuncher
Bitte warten ..
Mitglied: TsukiSan
09.10.2009 um 15:28 Uhr
Hi LuckyPuncher,

dann könnte es eventuell dem Programm "PSGETSID.exe" liegen, dass es keine vernünftige Fehlerauswertung ausgibt.
Müßte man mal googeln oder nachfragen. Wenn der Entwickler von solchen Programmen die Fehlerauswertung nicht "so ernst" nimmt, dann kann man gleichen Effekt haben.

Gruß
Tsuki
Bitte warten ..
Mitglied: rubberman
09.10.2009 um 16:35 Uhr
Hallo LuckyPuncher,

warum eigentlich die ganzen Umwege über Variable und FOR-Schleife?
Sollte psgetsid einen Errorlevel zurückgeben (vovon ich eigentlich bei allen PS-Tools ausgehe), ist das relativ einfach über eine Zeile abzufangen
01.
psgetsid.exe \\%dcname% -u %domainnb%\%adjoinUN% -p %adjoinPW% %usersid% &&goto Erfolg ||goto Fehler
Grüße
rubberman
Bitte warten ..
Mitglied: LuckyPuncher
09.10.2009 um 17:01 Uhr
Hallo rubberman!

der blosse Aufruf von Psgetsid.exe samt Parametern bringt in der Tat Errorlevels zurück. Das habe ich schon getesetet. in Kombination mit For klappts leider nicht mehr.
Die For Schleife brauche ich jedoch um weitere Aktionen mit der Rückgabe der PSGetsid.exe- Anfrage:
die DomänenuserSIDs weiterzuverwenden. Also lediglich der Errorlevel reicht leider nicht aus.

das sollte etwa weiter gemacht werden.
- wenn %errorcode% =1 dann sid/user auslassen, Eintrag in Logfile o-ä. und weitermachen in der Schleife
- wenn %errorcode% =0 dann mittels 'reg add' die DomänenSID unter HKlm\software\microsoft\windows nt\currentversion\profilelist eintragen.

Gruß
LuckyPuncher
Bitte warten ..
Mitglied: Biber
09.10.2009 um 19:34 Uhr
Moin LuckyPuncher,

die Abfrage des Errorlevels klappt bei dir nicht, weil für den CMD-Interpreter diese optisch auf Zeilen auseinadergezogene <u>Befehls<u>zeile
...
for /f "tokens=* delims=" %%a in (''%sidcheck%') do (
echo %errorlevel%
)
..
....... eben nur EINE Zeile ist, die der alle dort benötigten Variablen eben auch nur einmal (beim Loslaufen) aufgelöst werden.
Ergo: Hast du VOR dem Ausführen der ersten FOR-Anweisung bzw des ersten PsGetSID ein ErrorLevel 0 drin, hast du es auch 200 Aufrufe lang.
War das Errorlevel vorher auf 77, dann wird dich eben diese 77 bis nach dem Klammer-Zu der DO-Anweisung begleiten.

Lies dir mal am CMD-Prompt [bei SetLocal /?] und/oder hier im Forum ein bisschen was an zum Thema "DelayedExpansion" und ändere (nachdem du es verstanden hast) die Mimik so ab:

[in deinem Batch:
  • Ganz am Anfang, wo sicherlich ein "echo off (o.ä.)" steht--->eine Zeile tiefer: "Setlocal EnableDelayedExpansion"

Die FOR-Anweisung:
...
for /f "tokens=* delims=" %%a in (''%sidcheck%') do (
echo Aktuelles Errorlevel: !errorlevel!
IF !errorlevel! 1 ( machFehlerMeldung) ELSE machBissinessAsUhschl
)
..
-- ODER ohne verzögerte Variablenauflösung--
...
for /f "tokens=* delims=" %%a in (''%sidcheck%') do (
IF ErrorLevel 1 echo Aktuelles Errorlevel: 1 oder größer
IF ErrorLevel 1 ( machFehlerMeldung) ELSE machBissinessAsUhschl
)
..
Schönes Wochenende
Biber
Bitte warten ..
Mitglied: LuckyPuncher
12.10.2009 um 19:04 Uhr
Habe die Ehre Biber,

Vielen Dank für das Feedback.
das mit den delayedexpansion habe ich mir zu Gemüte geführt: macht Sinn und wäre schön, leider aber in NT4 nicht möglich. Es geht lediglich: setlocal enableextensions
also:
den Code von ODER ausprobiert: Leider hat das so nicht geklappt: Er bringt jedesmal den selben Errorcode (0).
Daher habe ich die Problematik umgangen und das Skript anders aufgebaut.
Jetzt fange ich in der For-Schleife nur SIDs mit Entsprechung ab. Diese übergebe ich an find um weiter zu filtern, Dann passe ich die Registry Profilliste um die zu migrierenden Benutzer an.

Naja, vielleicht kann das ja noch jemand mal ausser mir brauchen.

01.
for /f %%i in ('dir /B /A:D C:\winnt\profiles ^| findstr /r /v ^.*00.$') do call :process %%i 
02.
goto :eof 
03.
 
04.
:process 
05.
set username=%1 
06.
if /I %username%==system         goto :cancel 
07.
if /I %username%==administrator  goto :cancel  
08.
@for /f %%m in ('"psgetsid \\%dcname% -u %domainnb%\%adjoinUN% -p %adjoinPW% %username% 2>NUL |find /i "s-1-5-2""') do ( 
09.
if errorlevel = 1 (echo failure 
10.
) else ( 
11.
REM The processed User must not be logged on  
12.
REG ADD "HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\%%m\profileimagepath"=%username%.000>>C:\regedited.txt 
13.
14.
15.
goto :eof 
16.
 
17.
:cancel 
18.
@echo user %username% will not be migrated 
19.
 
20.
:end
Gruß
LuckyPuncher
Bitte warten ..
Mitglied: Biber
12.10.2009 um 19:53 Uhr
Uppps, sorry, LuckyPuncher,

mein Fehler.
Ich habe ein Gleichheitszeichen unterschlagen

Ich schrieb:
- entweder mit SetLocal EnableDelayedExpansion
IF !errorlevel! 1 ( machFehlerMeldung) ELSE machBissinessAsUhschl

was Bullshit ist, denn es muss lauten
IF !errorlevel! == 1 ( machFehlerMeldung) ELSE machBissinessAsUhschl

... während die andere Syntax bei "ohne DelayedExpansion"/nur "Setlocal" richtig genannt wurde:

...
for /f "tokens=* delims=" %%a in (''%sidcheck%') do (
IF ErrorLevel 1 echo Aktuelles Errorlevel: 1 oder größer
IF ErrorLevel 1 ( machFehlerMeldung) ELSE machBissinessAsUhschl
)

--> hier als "IF ERRORLEVEL 1 " ohne die doppelten Gleichheitszeichen und ohne %- oder !-Zeichen um die Variable Errorlevel (also NICHT %errorlevel% und auch nicht !errorlevel!

Tut mir leid, dass Du da ganz umsonst so eine Schleife geflogen bist.
Dafür hast du bei Gelegenheit einen Oneliner gut bei mir.

Zerknirscht
Biber
Bitte warten ..
Ähnliche Inhalte
Windows Server
Migration Fileserver - TS Profile
gelöst Frage von BellociWindows Server3 Kommentare

Guten Tag liebe Admins, Anleitungen, wie man am geschicktesten eine Migration von Fileservern hinbekommt, gibt es zuhauf Daraus resultiert ...

Windows 7
Lokale Profile einfrieren
Frage von Lebowski23Windows 73 Kommentare

Hallo, gibt es eine Möglichkeit eine lokales Profil unter Win 7 einzufrieren. Also keine Änderungen zuzulassen oder diese nach ...

Batch & Shell
Batch zum Zurücksetzen eines lokalen Profils
Tipp von Mr.ErrorBatch & Shell

Ahoi! Mir ist in diesem Forum schon sehr oft geholfen worden und daher wollte ich auch mal was zurück ...

Windows 7
Lokale Profile werden nicht gelöscht
gelöst Frage von Michel73Windows 74 Kommentare

Hallo zusammen, wir arbeiten bei uns mit Servergespeicherten Profilen. Bei jeder Anmeldung wird auf den Rechnern ein lokales Profil ...

Neue Wissensbeiträge
Linux

Meltdown und Spectre: Linux Update

Information von Frank vor 2 TagenLinux

Meltdown (Variante 3 des Prozessorfehlers) Der Kernel 4.14.13 mit den Page-Table-Isolation-Code (PTI) ist nun für Fedora freigegeben worden. Er ...

Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 2 TagenTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Sicherheit

Meltdown und Spectre: Wir brauchen eine "Abwrackprämie", die die CPU-Hersteller bezahlen

Information von Frank vor 2 TagenSicherheit12 Kommentare

Zum aktuellen Thema Meltdown und Spectre: Ich wünsche mir von den CPU-Herstellern wie Intel, AMD oder ARM eine Art ...

Sicherheit

Meltdown und Spectre: Realitätscheck

Information von Frank vor 2 TagenSicherheit10 Kommentare

Die unangenehme Realität Der Prozessorfehler mit seinen Varianten Meltdown und Spectre ist seit Juni 2017 bekannt. Trotzdem sind immer ...

Heiß diskutierte Inhalte
E-Mail
Erfahrungen mit hMailServer gesucht
Frage von it-fraggleE-Mail10 Kommentare

Hallo, meine neue Stelle möchte einen eigenen Mailserver. Ich als Linuxkind war direkt geistig mit Postfix dabei. Leider wollen ...

Firewall
Penetrationstester-Labor - Firewalls
Frage von Oli-nuxFirewall9 Kommentare

Mich würde interessieren warum man beim Einrichten eines Penetrationstester-Labor (VMs) die Firewall der Systeme deaktivieren soll? Hat das nur ...

Entwicklung
VBS: alle PDF-Dateien in einem Ordner gleichzeitig öffnen
gelöst Frage von JuweeeEntwicklung9 Kommentare

Hallo, ich habe in deiner Ordnerstruktur (.\Tagesberichte\xx.18\) mehrere dynamische PDF-Formulare (mit LCD erstellt). Die Berichtsformulare sind im Layout alle ...

Netzwerkgrundlagen
IPv6 Inter-VLAN Routing
gelöst Frage von clSchakNetzwerkgrundlagen8 Kommentare

Hi ich befasse mich gerade mit der Implementierung von IPv6 was bisher (in einem VLAN) korrekt funktioniert inkl. DNS ...