Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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

Profilpfad per Script zuweisen

Frage Microsoft Windows Server

Mitglied: mactoolz

mactoolz (Level 1) - Jetzt verbinden

10.12.2006, aktualisiert 19.02.2008, 15526 Aufrufe, 30 Kommentare

Hallo,

kann man per Script oder egal was für ein Scriptformat den Profilpfad eines Benutzer zuweisen ???

Normalerweise würde man für jeden Benutzer in der OU den Profilpfad per Hand einmalig zuweisen, schöner wäre das ganze natürlich per Script ausführen zu lassen.


mfg



MacToolz
30 Antworten
Mitglied: LUPUS1985
10.12.2006 um 14:18 Uhr
hmm geht auch anders

schreib einfach den pfad per variablen rein also glaube das war "server\user\group\%username"
und dann kpoierste die dat in den default user rein
damit wird jeder neu angelgter user auff dem server -> user ->group (je nachdem wie das bei dir heist) unter seinen profilnamen ein pfad angelgt bekommen...

genau kann ich dir das jetzt nicht sagen da müste ich auch erstmal wieder in meinen ordnern suchen
aber ich schau mal
Bitte warten ..
Mitglied: LUPUS1985
10.12.2006 um 14:18 Uhr
doppelpost sorry
Bitte warten ..
Mitglied: bastla
10.12.2006 um 14:48 Uhr
Hallo mactoolz!

Die Einstellungen für einen einzelnen User kannst Du mit folgendem VB-Script vornehmen. Um dies für alle User einer Gruppe durchzuführen, benötigst Du eine Schleife wie hier gezeigt, auf OU bezogen gäbe es zB das.

HTH
bastla
Bitte warten ..
Mitglied: bastla
10.12.2006 um 15:39 Uhr
... oder um es etwas konkreter zu machen: Das folgende Script erstellt für alle User der OU "ADM" der Domäne "test.local" einen neuen "Profilpfad"-Eintrag "\\Server\ADMProfiles\Anmeldename" (analog zur Variable "%username%"):
01.
Const strOU = "ou=ADM,dc=test,dc=local" 
02.
Const strProfPath = "\\Server\ADMProfiles\" 
03.
 
04.
Set objOU = GetObject("LDAP://" & strOU) 
05.
ObjOU.Filter = Array("user") 
06.
 
07.
For Each objOUUser in objOU 
08.
	Set objUser = GetObject _ 
09.
	  ("LDAP://cn=" & objOUUser.cn & "," & strOU) 
10.
	strSAMAccountName = objUser.Get("sAMAccountName") 
11.
	objUser.Put "profilePath", strProfPath & strSAMAccountName 
12.
	objUser.SetInfo 
13.
Next
Grüße
bastla
Bitte warten ..
Mitglied: mactoolz
10.12.2006 um 16:29 Uhr
Hi,

ich habe versucht den Code umzusetzen. Leider reagiert er nicht darauf.
Jetzt weiß ich nicht ob der Ausgeführt wurde, zumindest sehe ich das er nicht für alle den PFad angelegt hat.

MAcht das denn überhaupt Sinn das bei jeder Anmeldung geprüft wird ob für einen USER der Profilpfad angelegt wurde ???

Wie kann ich denn Debuggen ???

Ist der eInsatz von diesem Code denn so richtig ??

Function Start()

Const strOU = "ou=ADM,dc=B111FST31-31.FST31g1.b111,dc=local"
Const strProfPath = "\\B111FST31-31.FST31g1.b111\Profilpfad\"

Set objOU = GetObject("LDAP://" & strOU)
ObjOU.Filter = Array("user")

For Each objOUUser in objOU
Set objUser = GetObject _
("LDAP://cn=" & objOUUser.cn & "," & strOU)
strSAMAccountName = objUser.Get("sAMAccountName")
objUser.Put "profilePath", strProfPath & strSAMAccountName
objUser.SetInfo
Next

End Function

Das ganze habe ich als VBS gespeichert

MacToolz
Bitte warten ..
Mitglied: bastla
10.12.2006 um 16:50 Uhr
Hallo mactoolz!

Das Script ist für den einmaligen Einsatz gedacht, um für alle Konten (einer OU) den Profilpfad zu ändern / einzutragen. Nach Anpassung der ersten beiden Zeilen an Deine Gegebenheiten so wie von mir gepostet (also ohne "Function" / "End Function") zB als "SetProfilePath.vbs" speichern und als Domänen-Admin ausführen.

Zum Testen wirst Du sinnvoller Weise eine OU mit nur 2 oder 3 Testusern verwenden. Zum Debuggen kannst Du zB
01.
WScript.Echo "Profilpfad für " & objOUUser.cn & " (" & strSAMAccountName & ") eingetragen."
vor dem "Next" einsetzen. Das Ergebnis ist bei den entsprechenden Usern im Register "Profil" abzulesen.

In diesem Register "Profil" kannst Du in Zukunft bei allen neuen Konten den Profilpfad direkt eintragen, zB etwa "\\B111FST31-31.FST31g1.b111\Profilpfad\%username%", wobei vom System für "%username%" der Benutzername des bearbeiteten Kontos verwendet wird. Weitere User erstellst Du dann als Kopie, wobei diese automatisch ihren Benutzernamen eingesetzt bekommen. Das Gleiche funktioniert auch mit dem Home-Directory ("Basisordner" - "Verbinden mit").

Grüße
bastla

[Edit] Anpassung der Const-Zeilen war für mich noch nicht ersichtlich [/Edit]
Bitte warten ..
Mitglied: mactoolz
10.12.2006 um 16:59 Uhr
Hi,

irgendwie kapier ich das nicht wie VBS funktioniert. Ich kenn mich mit VBA ein wenig aus.

Ungefähr weis ich auch was dort passiert, nur bei mir kommt die Meldung mit
eine Referenzauswertung wurde vom Server zurückgesendet


Was bedeutet das ???

Sind diese beiden Zeilen richtig ???

Const strOU = "ou=Buchhaltung_Lokal,dc=B111FST31-31.FST31g1.b111,dc=local"
Const strProfPath = "\\B111FST31-31.FST31g1.b111\Profilpfad\"


Vorallem für ADM
Bitte warten ..
Mitglied: bastla
10.12.2006 um 17:01 Uhr
Nachtrag:

Wenn Du die "Debug"-Zeile eingebaut hast, starte das Script von der Kommandozeile mit
01.
cscript //nologo SetProfilePath.vbs
So kannst Du die "WScript.Echo"-Ausgaben mitlesen.

Grüße
bastla
Bitte warten ..
Mitglied: bastla
10.12.2006 um 17:08 Uhr
Hallo mactoolz!

Wenn Du unter der Domäne "B111FST31-31.FST31g1.b111.local" eine OU "Buchhaltung_Lokal" hast und der Name Deines Servers ebenfalls "B111FST31-31.FST31g1.b111" lautet, sind Deine Const-Zeilen ok.

Das gesamte Script müsste dann also so aussehen:
01.
'SetProfilePath.vbs 
02.
Const strOU = "ou=Buchhaltung_Lokal,dc=B111FST31-31.FST31g1.b111,dc=local" 
03.
Const strProfPath = "\\B111FST31-31.FST31g1.b111\Profilpfad\" 
04.
 
05.
Set objOU = GetObject("LDAP://" & strOU) 
06.
ObjOU.Filter = Array("user") 
07.
 
08.
For Each objOUUser in objOU 
09.
    Set objUser = GetObject _ 
10.
      ("LDAP://cn=" & objOUUser.cn & "," & strOU) 
11.
    strSAMAccountName = objUser.Get("sAMAccountName") 
12.
    objUser.Put "profilePath", strProfPath & strSAMAccountName 
13.
    objUser.SetInfo 
14.
    WScript.Echo "Profilpfad für " & objOUUser.cn & " (" & strSAMAccountName & ") eingetragen." 
15.
Next
Grüße
bastla
Bitte warten ..
Mitglied: mactoolz
10.12.2006 um 17:08 Uhr
Hi,

bringt nichts, zumindest wird dann die Fehlermeldung im DOs Fenster angezeigt.



MacToolz
Bitte warten ..
Mitglied: mactoolz
10.12.2006 um 17:17 Uhr
Hi,

ich muss ja den Computername der Domäne einsetzen richtig ???



MacToolz
Bitte warten ..
Mitglied: bastla
10.12.2006 um 17:20 Uhr
Hallo mactoolz!

Für den Profilpfad ("strProfPath") brauchst Du den UNC-Pfad, also "\\RechnernameDesServers\Freigabename\", für die LDAP-Abfragen den Domänennamen.

bastla
Bitte warten ..
Mitglied: mactoolz
10.12.2006 um 18:59 Uhr
Hi,

ok das habe ich ja auch wie du aus dem erstetzen Code sehen kannst.

Nur leider kann ich immer noch nichts mit der Fehlermeldung anfangen



MacToolz
Bitte warten ..
Mitglied: bastla
10.12.2006 um 19:44 Uhr
Hallo mactoolz!

Also wenn ich ganz genau hinsehe möchte ich fast meinen, in Deinem Domänennamen 2 Punkte gesehen zu haben (in welchen Wald bin ich denn da geraten?) - dann:
01.
Const strOU = "ou=Buchhaltung_Lokal,dc=B111FST31-31,dc=FST31g1,dc=b111,dc=local"
Grüße
bastla
Bitte warten ..
Mitglied: mactoolz
02.01.2007 um 11:33 Uhr
Hi,

als erstes frohes neues Jahr.

Ich wollte mich heute wieder mal daran geben.

Irgenwie verstehe ich das ganze nicht. Jetzt habe ich Probleme mit LDAP Anbindung.
Leider habe ich keine vernünftige Erklärung zu LDAP gefunden, zumindest wie sich LDAP zusammensetzt.

Der letzte Vorschlag lief wunderbar. Jetzt bekomme ich die Meldung aus Access das eine Referenzauslastung wurde vom Server zurückgesendet.

Was bedeutet das. ???

Zur Info. Ich habe den Domänencontroller geändert.

Das ist der Computername B111FST31-31.FST31B111.G1
Domäne FST31B111.G1


Danke im voraus


MacToolz
Bitte warten ..
Mitglied: bastla
02.01.2007 um 11:45 Uhr
Hallo mactoolz!

Du schreibst, die Meldung käme dieses Mal aus Access?!

Darf ich einen neuen Thread vorschlagen (hier sind wir zwei beide mittlerweile ziemlich unter uns und eín paar Augen mehr können sicher nicht schaden), in dem Du die aktuelle Situation noch einmal zusammenfasst und das neue Problem schilderst?

Grüße
bastla
Bitte warten ..
Mitglied: JoshuaTree
08.01.2008 um 11:54 Uhr
Prost Neujahr ........
Wie müßte denn das Scrip aussehen wenn ich es ganz oben ansetzen möchte, also sprich in einer OU die noch weitere Unter-OUs hat.
Da müßt doch eine Schleife erstellt werden damit er jede OU durchläuft.

Ich habe die OU > Niederlassungen > und dann die Städte (frankfurt, münchen hamburg....)
Die User sind natürlich entsprechend ihrem Standort in den OUs aufgeteilt.

So funktioniert das Script nur für User in der obersten OU.

.... achja und wie Komme ich an das Homeverzeichnis und das Terminalserverprofil ran wie heißt da die Variable aus dem AD
Bitte warten ..
Mitglied: bastla
08.01.2008 um 13:33 Uhr
Hallo JoshuaTree!

... in einer OU die noch weitere Unter-OUs hat. Da müßt doch eine Schleife erstellt werden damit er jede OU durchläuft.
Siehe zB How Can I List All the Sub-OUs in an OU?

... Homeverzeichnis und das Terminalserverprofil ran wie heißt da die Variable aus dem AD
Listen gibt es zB bei Richard Mueller

Für Homeverzeichnis: homeDrive (Laufwerksbuchstabe), homeDirectory (Pfad); für TS-Profil: TerminalServicesProfilePath (Beispiele dazu hier oder da)

Grüße
bastla
Bitte warten ..
Mitglied: JoshuaTree
08.01.2008 um 15:41 Uhr
Hi sieht gut aus jetzt habe ich aber eine neues Problem.

Wie bekomme ich die beiden routinen zusammen?
Ich habe diese die mir die User bearbeitet .

Const strOU = "ou=ADM,dc=test,dc=local"
Const strProfPath = "\\Server\ADMProfiles\"

Set objOU = GetObject("LDAP://" & strOU)
ObjOU.Filter = Array("user")

For Each objOUUser in objOU
Set objUser = GetObject _
("LDAP://cn=" & objOUUser.cn & "," & strOU)
strSAMAccountName = objUser.Get("sAMAccountName")
objUser.Put "profilePath", strProfPath & strSAMAccountName
objUser.SetInfo
Next


und diese die mir die OUs auflistet wie bekomme ich den Wert von der zweiten routine die mir die OUs ausließt mit der ersten gekoppelt das die User in der ausgelesenen OU geändert werden.?




On Error Resume Next

Const ADS_SCOPE_SUBTREE = 2

Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection

objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE

objCommand.CommandText = _
"SELECT ADsPath FROM 'LDAP://ou=Testcenter,dc=AD,dc=Firma,dc=DE' WHERE " & _
"objectCategory='organizationalUnit'"
Set objRecordSet = objCommand.Execute

objRecordSet.MoveFirst
Do Until objRecordSet.EOF
Wscript.Echo objRecordSet.Fields("ADsPath").Value
objRecordSet.MoveNext
Loop


Danke für die Hilfe
Bitte warten ..
Mitglied: bastla
08.01.2008 um 16:45 Uhr
Hallo JoshuaTree!

Etwa so:
01.
Const strProfPath = "\\Server\ADMProfiles\" 
02.
 
03.
Const ADS_SCOPE_SUBTREE = 2 
04.
 
05.
Set objConnection = CreateObject("ADODB.Connection") 
06.
Set objCommand = CreateObject("ADODB.Command") 
07.
objConnection.Provider = "ADsDSOObject" 
08.
objConnection.Open "Active Directory Provider" 
09.
Set objCommand.ActiveConnection = objConnection 
10.
 
11.
objCommand.Properties("Page Size") = 1000 
12.
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
13.
 
14.
objCommand.CommandText = _ 
15.
"SELECT ADsPath FROM 'LDAP://ou=Testcenter,dc=AD,dc=ANZAG,dc=DE' WHERE " & _ 
16.
"objectCategory='organizationalUnit'" 
17.
Set objRecordSet = objCommand.Execute 
18.
 
19.
objRecordSet.MoveFirst 
20.
Do Until objRecordSet.EOF 
21.
	ProcessOU objRecordSet.Fields("ADsPath").Value 
22.
	objRecordSet.MoveNext 
23.
Loop 
24.
 
25.
WScript.Echo "Fertig." 
26.
' ##### Ende Hauptprogramm ##### 
27.
 
28.
 
29.
Sub ProcessOU(strOU) 
30.
 
31.
Set objOU = GetObject(strOU) 
32.
ObjOU.Filter = Array("user") 
33.
 
34.
For Each objOUUser in objOU 
35.
	Set objUser = GetObject _ 
36.
		("LDAP://cn=" & objOUUser.cn & "," & strOU) 
37.
	strSAMAccountName = objUser.Get("sAMAccountName") 
38.
	objUser.Put "profilePath", strProfPath & strSAMAccountName 
39.
	objUser.SetInfo 
40.
Next 
41.
 
42.
End Sub
Übrigens: Zum Posten von Code hätten wir hier < code>-Tags (siehe FAQ) ...

Grüße
bastla
Bitte warten ..
Mitglied: JoshuaTree
09.01.2008 um 08:53 Uhr
Vielen Dank,

Ich erhalte aber einen Fehler in Zeile 35 Zeichen 2
Fehler:0x80005000
Code:80005000
Quelle: Null

was könnte das sein?
Bitte warten ..
Mitglied: JoshuaTree
09.01.2008 um 14:00 Uhr
Vielleicht liege ich ja auch falsch aber wo wird die OU an das Unterprogramm übergeben.
Ich kann da keine Schnittstelle sehen.

Ich würde sowas wie: "hüpfe für jede OU ins Unterprogramm (Sub ProcessOU(strOU))"

Oder übersehe ich da was.

Danke für die Hilfe
Bitte warten ..
Mitglied: bastla
09.01.2008 um 14:09 Uhr
Hallo JoshuaTree!

Oder übersehe ich da was.
Ja - die Zeile "ProcessOU objRecordSet.Fields("ADsPath").Value".

Viel schlimmer ist allerdings, was ich übersehen habe: Das Ergebnis der Abfrage liefert vollständige LDAP-Pfade zurück, allerdings wird in Zeile 36 (= Fortsetzung der Zeile 35) in der Variable "strOU" der Pfad ohne führendes "LDAP://" benötigt.

Ändere daher versuchsweise diese Zeile auf
01.
("LDAP://cn=" & objOUUser.cn & "," & Mid(strOU,8))
Grüße
bastla
Bitte warten ..
Mitglied: JoshuaTree
09.01.2008 um 14:35 Uhr
Hey cool, lllllaaaaaoooolllllaaaa

geht blöde frage wofür die 8.

Gruss


Danke für die Hilfe
Bitte warten ..
Mitglied: bastla
09.01.2008 um 14:49 Uhr
Hallo JoshuaTree!

... wofür die 8.
Benötigt wird der Teil nach "LDAP://", also ab Position 8 des Strings:
01.
LDAP://ou=... 
02.
03.
123456789
Grüße
bastla
Bitte warten ..
Mitglied: JoshuaTree
16.01.2008 um 13:07 Uhr
Funktioniert sauber,

jetzt wollt ich das ganze in Richtung TerminalServerProfil umbiegen und habe ProfilePath mit CtxWFProfilePath umgeändert also so


Const strProfPath = "\\Server\TSProfiles\"

Const ADS_SCOPE_SUBTREE = 2

Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection

objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE

objCommand.CommandText = _
"SELECT ADsPath FROM 'LDAP://ou=Test,ou=Testcenter,dc=AD,dc=ANZAG,dc=DE' WHERE " & _
"objectCategory='organizationalUnit'"
Set objRecordSet = objCommand.Execute

objRecordSet.MoveFirst
Do Until objRecordSet.EOF
ProcessOU objRecordSet.Fields("ADsPath").Value
objRecordSet.MoveNext
Loop

WScript.Echo "Fertig."
' Ende Hauptprogramm


Sub ProcessOU(strOU)

Set objOU = GetObject(strOU)
ObjOU.Filter = Array("user")

For Each objOUUser in objOU
Set objUser = GetObject _
("LDAP://cn=" & objOUUser.cn & "," & Mid(strOU,8))
strSAMAccountName = objUser.Get("sAMAccountName")
objUser.Put "CtxWFProfilePath", strProfPath & strSAMAccountName
objUser.SetInfo
Next

End Sub


Da bricht er ab mit der Meldung "Das angegebene Verzeichnisattribut existiert bereits" in Zeile 44.
Klar existiert es ich will es ja ändern ...hmmmm?`

Was könnte das sein stimmt der Attributnamen etwa nicht?
Bitte warten ..
Mitglied: bastla
16.01.2008 um 14:11 Uhr
Hallo JoshuaTree!

... stimmt der Attributnamen etwa nicht?
Weiß ich leider nicht - außer dem oben schon erwähnten "TerminalServicesProfilePath" fällt mir nix mehr ein ...

Grüße
bastla
Bitte warten ..
Mitglied: JoshuaTree
17.01.2008 um 09:09 Uhr
Hallo,

habe jetzt rausbekommen das es nicht geht über ADSI an die Einstellung für "TerminalServicesProfilePath" zu kommen. Würde erst ab 2003 gehen.
Kennt jemand eine alternative?
Bitte warten ..
Mitglied: bastla
17.01.2008 um 11:11 Uhr
Hallo JoshuaTree!

Vielleicht wäre es genau jetzt Zeit für einen neuen Thread, in welchem Du das Problem unter Nennung einiger Details (gelegentlich spielt ja sogar die OS-Version eine Rolle ) einem größeren Kreis präsentieren kannst; hier sind wir vermutlich ziemlich unter uns ...

Grüße
bastla
Bitte warten ..
Mitglied: keksprinz
19.02.2008 um 09:37 Uhr
unter windows 2003 SP1 Domain Controller gehts auch nicht

Jemand noch ne Idee ?

Das angegebene Verzeichnisdienstattribut bzw. der angegebene Verzeichnisdienstwert ist bereits vorhanden.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst PowerShell Script Move-Item nach x Tagen (5)

Frage von lupolo zum Thema Batch & Shell ...

VB for Applications
VBS Script zum versenden mehrerer Verknüpfungen zu Dateien per Lotus Notes

Frage von Sentinel87 zum Thema VB for Applications ...

Batch & Shell
Script zum Auflösen einer Ordnerstruktur und zurück gesucht (12)

Frage von websolutions zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...