summaryrefslogtreecommitdiff
path: root/docs/Samba-Guide/SBE-MigrateNW4Samba3.xml
diff options
context:
space:
mode:
Diffstat (limited to 'docs/Samba-Guide/SBE-MigrateNW4Samba3.xml')
-rw-r--r--docs/Samba-Guide/SBE-MigrateNW4Samba3.xml1599
1 files changed, 1599 insertions, 0 deletions
diff --git a/docs/Samba-Guide/SBE-MigrateNW4Samba3.xml b/docs/Samba-Guide/SBE-MigrateNW4Samba3.xml
new file mode 100644
index 0000000000..883a2447a6
--- /dev/null
+++ b/docs/Samba-Guide/SBE-MigrateNW4Samba3.xml
@@ -0,0 +1,1599 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE chapter PUBLIC "-//Samba-Team//DTD DocBook V4.2-Based Variant V1.0//EN" "http://www.samba.org/samba/DTD/samba-doc">
+<chapter id="nw4migration">
+ <title>Migrating NetWare 4.11 Server to Samba-3</title>
+
+ <para>
+ <indexterm><primary>Novell</primary></indexterm>
+ <indexterm><primary>SuSE</primary></indexterm>
+ <indexterm><primary>Ximian</primary></indexterm>
+ <indexterm><primary>FLOSS</primary><see>Free-Libre/Open Source Software</see></indexterm>
+ <indexterm><primary>Free-Libre/Open Source Software</primary></indexterm>
+ Novell is a company any seasoned IT manager has to admire. Since the acquisition of
+ the SuSE Linux company, the acquisition on Ximian, and other moves that are friendly
+ to the FLOSS (Free-Libre/Open Source Software) movement, Novell are emerging out of
+ a deep regression that almost saw the company disappear into obscurity. The now Linux
+ friendly Novell's SUSE Linux is being used as a host to which NetWare servers are being
+ migrated. It is in many ways ironic that Novell are today hosting NetWare on top of
+ Linux. At the same time older NetWare servers are still being migrated to Samba servers.
+ It will be interesting to see what will become of NetWare over time.
+ </para>
+
+ <para>
+ <indexterm><primary>Red Hat</primary></indexterm>
+ <indexterm><primary>Debian</primary></indexterm>
+ <indexterm><primary>Gentoo</primary></indexterm>
+ <indexterm><primary>Mandrake</primary></indexterm>
+ Whatever flavor of Linux is preferred in your environment, whether Red Hat, Debian,
+ Gentoo, Mandrake, SUSE (Novell) the information in this chapter should be read with
+ appropriate cognizance that file locations may vary a little; even so the information
+ in this chapter should provide something of value.
+ </para>
+
+ <para>
+ <indexterm><primary>migration</primary></indexterm>
+ This chapter was contributed by Misty Stanley-Jones, a UNIX administrator of many
+ years who surfaced on the Samba mailing list with a barrage of questions, and who
+ regularly now helps other administrators to solve thorny Samba migration questions.
+ </para>
+
+ <para>
+ <indexterm><primary>NetWare</primary></indexterm>
+ <indexterm><primary>NLM</primary></indexterm>
+ <indexterm><primary>NetWare</primary></indexterm>
+ <indexterm><primary>Mars_NWE</primary></indexterm>
+ One wonders how many NetWare servers remain in active service. Many are being migrated
+ to Samba on Linux. Red Hat Linux, SUSE Linux 9.x and SUSE Linux Enterprise Server 9 are
+ ideal target platforms to which a NetWare server may be migrated. The migration method
+ of choice is much dependant on the tools that the administrator finds most natural to use.
+ The old-hand NetWare guru will likely want to use the tools like the NetWare NLM for
+ <command>rsync</command> to migrate files from the NetWare server to the Samba server.
+ The UNIX administrator might prefer tools that are part of the Mars_NWE (Martin Stovers' NetWare
+ Emulator) open source package. The MS Windows network administrator will likely make use of the
+ NWConv utility that is a part of Windows NT4 Server. Whatever your tool of choice,
+ migration will be filled with joyous and challenging moments - though probably not
+ concurrently.
+ </para>
+
+ <para>
+ This chapter tells its own story, so ride along, ... maybe the information here presented
+ will help to smooth over a similar migration challenge in your favorite networking environment.
+ </para>
+
+<sect1>
+ <title>Introduction</title>
+
+ <para>
+ <indexterm><primary>Novell</primary></indexterm>
+ Misty Stanley-Jones was recruited by Abmas Inc. to administer a network that had
+ not received much attention for some years and was much in need of a make-over.
+ As a brand-new sysadmin to this company, she inherited a very old Novell file server,
+ and came with a determination to change things for the better.
+ </para>
+
+ <para>
+ A site survey turned up the following details for the old NetWare server:
+ </para>
+
+ <simplelist>
+ <member><para>200 MHz MMX processor</para></member>
+ <member><para>512K RAM</para></member>
+ <member><para>24 GB disk space in RAID1</para></member>
+ <member><para>Novell 4.11 patched to service pack 7</para></member>
+ <member><para>60+ users</para></member>
+ <member><para>7 network-attached printers</para></member>
+ </simplelist>
+
+ <para>
+ The company had outgrown this server several years ago and were dealing with
+ severe growing pains. Some of the problems experienced were:
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Very slow performance</para>
+ </listitem>
+ <listitem>
+ <para>Available storage hovering around the 5% range.</para>
+ <itemizedlist>
+ <listitem>
+ <para>Extremely slow print spooling.</para>
+ </listitem>
+ <listitem>
+ <para>
+ Users storing information on their local hard
+ drives, causing backup integrity problems.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ <indexterm><primary>payroll</primary></indexterm>
+ At one point disk space had filled up to 100% causing the payroll database
+ to become corrupt. This caused the accounting department to be down for over
+ a week and necessitated deployment of another file server. The replacement
+ server was created with very poor security and design considerations from
+ a discarded desktop PC.
+ </para>
+
+ <sect2>
+ <title>Assignment Tasks</title>
+
+ <para>
+ Misty has provided this summary of her migration experience in the hope
+ that it will help someone to avoid the challenges she faced. Perhaps her
+ configuration files and background will accelerate your learning as you
+ grapple with a similar migration challenge.
+ </para>
+
+ <para>
+ After presenting a cost-benefit report to management, as well as an estimated
+ time-to-completion, approval was given proceed with the solution proposed.
+ The server was built from purchased components. The total project cost
+ was $3000. A brief description of the configuration follows:
+ </para>
+
+ <simplelist>
+ <member>
+ <para>3.0 GHz P4 Processor</para>
+ </member>
+ <member>
+ <para>1 GB RAM</para>
+ </member>
+ <member>
+ <para>120 GB SATA operating system drive</para>
+ </member>
+ <member>
+ <para>4 x 80 GB SATA data drives (RAID5 240 GB capacity)</para>
+ </member>
+ <member>
+ <para>2 x 80 GB SATA removable drives for online backup</para>
+ </member>
+ <member>
+ <para>A DLT drive for asynchronous offline backup</para>
+ </member>
+ <member>
+ <para>SUSE Linux Professional 9.2</para>
+ </member>
+ </simplelist>
+
+ <para>
+ The new system has operated for six months without problems. Over the past months
+ much attention has been focused on cleaning up desktops and user profiles.
+ </para>
+
+ </sect2>
+</sect1>
+
+<sect1>
+ <title>Dissection and Discussion</title>
+
+ <para>
+ <indexterm><primary>LDAP</primary></indexterm>
+ <indexterm><primary>e-Directory</primary></indexterm>
+ <indexterm><primary>authentication</primary></indexterm>
+ <indexterm><primary>identity management</primary></indexterm>
+ A decision to use LDAP was made even though I know nothing about LDAP except that
+ I had been reading the book <quote>LDAP System Administration</quote>, by Gerald Carter.
+ LDAP seemed to provide some of the functionality of Novell's e-Directory Services
+ and would provide centralized authentication and identity management.
+ </para>
+
+ <para>
+ <indexterm><primary>database</primary></indexterm>
+ <indexterm><primary>RPM</primary></indexterm>
+ <indexterm><primary>tree</primary></indexterm>
+ Building the LDAP database took a while, and a lot of trial and error. Following
+ the guidance I obtained from Jerry Carter's book <quote>LDAP System
+ Administration</quote>, I installed OpenLDAP (from RPM; later I compiled
+ a more current version from source) and built my initial LDAP tree.
+ </para>
+
+ <sect2>
+ <title>Technical Issues</title>
+
+ <para>
+ <indexterm><primary>white-pages</primary></indexterm>
+ <indexterm><primary>inetOrgPerson</primary></indexterm>
+ <indexterm><primary>OpenLDAP</primary></indexterm>
+ <indexterm><primary>/etc/passwd</primary></indexterm>
+ <indexterm><primary>/etc/shadow</primary></indexterm>
+ <indexterm><primary>LDIF</primary></indexterm>
+ <indexterm><primary>IMAP</primary></indexterm>
+ <indexterm><primary>POP3</primary></indexterm>
+ <indexterm><primary>SMTP</primary></indexterm>
+ The first challenge was to create a company white-pages, followed by manually
+ entering everything from the printed company directory. This used only the inetOrgPerson
+ objectclass from the OpenLDAP schemas. The next step was to write a shell script which
+ would look at the <filename>/etc/passwd</filename> and <filename>/etc/shadow</filename>
+ files on our mail server, and create a LDIF file from which the information could be
+ imported into LDAP. This would allow use of LDAP for Linux authentication, IMAP, POP3,
+ and SMTP.
+ </para>
+
+ <para>
+ Given that a decision had been made to use Courier-IMAP the schema <quote>courier.schema</quote>
+ from the Courier-IMAP source tarball is ncessary to resolve Courier-specific LDAP directory
+ needs.
+ </para>
+
+ </sect2>
+
+</sect1>
+
+<sect1>
+ <title>Implementation</title>
+
+ <para>
+ </para>
+
+ <sect2>
+ <title>NetWare Migration Using LDAP Backend</title>
+
+ <para>
+ The following software must be installed on the SUSE Linux Enterprise Server to perform
+ this migration:
+ </para>
+
+ <simplelist>
+ <member><para>openldap2</para></member>
+ <member><para>openldap2-client</para></member>
+ <member><para>openldap2-devel (only for Samba compilation)</para></member>
+ <member><para>nss_ldap</para></member>
+ <member><para>smbldap-tools Version 0.8.7</para></member>
+ <member><para>perl-ldap</para></member>
+ <member><para>samba-3.0.12 or later</para></member>
+ <member><para>samba-client-3.0.12 or later</para></member>
+ <member><para>samba-winbind-3.0.12 or later</para></member>
+ </simplelist>
+
+ <para>
+ Each software application must be carefully configured in preparation for migration.
+ The configuration files used at Abmas are provided as a guide and should be modified
+ to meet needs at your site.
+ </para>
+
+ <sect3>
+ <title>LDAP Server Configuration</title>
+
+ <para>
+ The <filename>/etc/openldap/slapd.conf</filename> file Misty used is shown in <link linkend="ch8slapd"/>.
+ </para>
+
+<example id="ch8slapd">
+<title>OpenLDAP Control File &smbmdash; slapd.conf Part A</title>
+<screen>
+#/usr/local/etc/openldap/slapd.conf
+#
+# See slapd.conf(5) for details on configuration options.
+# This file should NOT be world readable.
+#
+include /etc/openldap/schema/core.schema
+include /etc/openldap/schema/cosine.schema
+include /etc/openldap/schema/inetorgperson.schema
+include /etc/openldap/schema/nis.schema
+include /etc/openldap/schema/samba.schema
+include /etc/openldap/schema/dhcp.schema
+include /etc/openldap/schema/misc.schema
+include /etc/openldap/schema/idpool.schema
+include /etc/openldap/schema/eduperson.schema
+include /etc/openldap/schema/commURI.schema
+include /etc/openldap/schema/local.schema
+include /etc/openldap/schema/authldap.schema
+
+pidfile /var/run/slapd/run/slapd.pid
+argsfile /var/run/slapd/run/slapd.args
+
+replogfile /data/ldap/log/slapd.replog
+
+# Load dynamic backend modules:
+modulepath /usr/lib/openldap/modules
+
+#######################################################################
+# Logging parameters
+#######################################################################
+loglevel 256
+
+#######################################################################
+# SASL and TLS options
+#######################################################################
+sasl-host ldap.corp.abmas.org
+sasl-realm DIGEST-MD5
+sasl-secprops none
+TLSCipherSuite HIGH:MEDIUM:+SSLV2
+TLSCertificateFile /etc/ssl/certs/private/abmas-cert.pem
+TLSCertificateKeyFile /etc/ssl/certs/private/abmas-key.pem
+password-hash {SSHA}
+defaultsearchbase "dc=abmas,dc=biz"
+</screen>
+</example>
+
+
+<example id="ch8slapd2">
+<title>OpenLDAP Control File &smbmdash; slapd.conf Part B</title>
+<screen>
+#######################################################################
+# bdb database definitions
+#######################################################################
+database bdb
+suffix "dc=abmas,dc=biz"
+rootdn "cn=manager,dc=abmas,dc=biz"
+rootpw {SSHA}gdo/dUvoT4ZJmULz3rUt6A3H/hBEduJ5
+directory /data/ldap
+mode 0600
+# The following is for BDB to make it flush its data to disk every
+# 500 seconds or 5kb of data
+checkpoint 500 5
+
+## For running slapindex
+#readonly on
+
+## Indexes for often-requested attributes
+index objectClass eq
+index cn eq,sub
+index sn eq,sub
+index uid eq,sub
+index uidNumber eq
+index gidNumber eq
+index sambaSID eq
+index sambaPrimaryGroupSID eq
+index sambaDomainName eq
+index default sub
+cachesize 2000
+
+replica host=baa.corp.abmas.org:389
+ suffix="dc=abmas,dc=biz"
+ binddn="cn=replica,dc=abmas,dc=biz"
+ credentials=verysecret
+ bindmethod=simple
+ tls=yes
+replica host=ns.abmas.org:389
+ suffix="dc=abmas,dc=biz"
+ binddn="cn=replica,dc=abmas,dc=biz"
+ credentials=verysecret
+ bindmethod=simple
+ tls=yes
+</screen>
+</example>
+
+<example id="ch8slapd3">
+<title>OpenLDAP Control File &smbmdash; slapd.conf Part C</title>
+<screen>
+#######################################################################
+# ACL section
+#######################################################################
+## MOST RESTRICTIVE RULES MUST GO FIRST!
+
+## Users can change their own passwords.
+## Nobody else can read the password
+access to attrs=userPassword
+ by group/groupOfUniqueNames/uniqueMember="cn=LDAP Administrators, \
+ dc=abmas,dc=biz" write
+ by self write
+ by * auth
+
+## Home contact info restricted to the logged-in user
+access to attrs=hometelephoneNumber,homePostalAddress,\
+ mobileTelephoneNumber,pagerTelephoneNumber
+ by group/groupOfUniqueNames/uniqueMember="cn=LDAP Administrators,\
+ dc=abmas,dc=biz" write
+ by self write
+ by * none
+
+## Only admins can manage email aliases
+access to dn.sub="ou=Email Aliases,dc=abmas,dc=biz"
+ filter=(roleOccupant=*)
+ attrs=maildrop
+ by dnattr=roleOccupant write
+ by * read
+
+## Allow delegated management of certain aliases which are
+## for mailman-style mailing lists.
+access to dn.sub="ou=Email Aliases,dc=abmas,dc=biz"
+ by group/groupOfUniqueNames/uniqueMember="cn=LDAP Administrators,\
+ dc=abmas,dc=biz" write
+ by * read
+
+## Default to read-only access
+access to *
+ by dn.base="cn=replica,ou=people,ou=corp,dc=abmas,dc=biz" write
+ by group/groupOfUniqueNames/uniqueMember="cn=LDAP Administrators,\
+ dc=abmas,dc=biz" write
+ by * read
+access to attrs=namingcontexts
+ by anonymous read
+</screen>
+</example>
+
+ <para>
+ <indexterm><primary>/etc/ldap.conf</primary></indexterm>
+ The <filename>/etc/ldap.conf</filename> file used is listed in <link linkend="ch8ldap"/>.
+ </para>
+
+<example id="ch8ldap">
+<title>NSS LDAP Control File &smbmdash; /etc/ldap.conf</title>
+<screen>
+# /etc/ldap.conf
+# This file is present on every *NIX client that authenticates to LDAP.
+# For me, most of the defaults are fine. There is an amazing amount of
+# customization that can be done see the man page for info.
+
+# Your LDAP server. Must be resolvable without using LDAP. The following
+# is for the LDAP server all others use the FQDN of the server
+URI ldap://127.0.0.1
+
+# The distinguished name of the search base.
+base ou=corp,dc=abmas,dc=biz
+
+# The LDAP version to use (defaults to 3 if supported by client library)
+ldap_version 3
+
+# The distinguished name to bind to the server with if the effective
+# user ID is root. Password is stored in /etc/ldap.secret (mode 600)
+rootbinddn cn=Manager,dc=abmas,dc=biz
+
+# Filter to AND with uid=%s
+pam_filter objectclass=posixAccoun
+
+# The user ID attribute (defaults to uid)
+pam_login_attribute uid
+
+# Group member attribute
+pam_member_attribute memberUID
+
+# Use the OpenLDAP password change
+# extended operation to update the password.
+pam_password exop
+
+# OpenLDAP SSL mechanism
+# start_tls mechanism uses the normal LDAP port, LDAPS typically 636
+ssl start_tls
+
+tls_cacertfile /etc/ssl/certs/private/abmas-cert.pem
+...
+</screen>
+</example>
+
+ <para>
+ The Name Server Switch control file <filename>/etc/nsswitch.conf</filename> has the following contents:
+<screen>
+# /etc/nsswitch.conf
+# This file controls the resolve order for system databases.
+
+# the following two lines obviate the "+" entry in /etc/passwd and /etc/group.
+passwd: files ldap
+group: files ldap
+shadow: files ldap
+# The above are all that I store in LDAP at this point. There are
+# possibilities to store hosts, services, ethers, and lots of other things.
+</screen>
+ </para>
+
+ <para>
+ <indexterm><primary>PAM</primary></indexterm>
+ <indexterm><primary>NSS</primary></indexterm>
+ In my setup, users authenticate via PAM and NSS using LDAP-based accounts.
+ This works out of the box with the configuration files in this chapter. It
+ enables you to have no local accounts for users (it is highly advisable
+ to have a local account for the root user). Traps for the unwary include:
+ </para>
+
+ <indexterm><primary>LDAP</primary></indexterm>
+ <indexterm><primary>authenticate</primary></indexterm>
+ <indexterm><primary>DNS</primary></indexterm>
+ <itemizedlist>
+ <listitem>
+ <para>
+ If your LDAP database goes down, nobody can authenticate except for root.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ If fail-over is configured incorrectly weird behavior can occur. For example,
+ DNS failing to resolve.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ I do have two LDAP slave servers configured. That subject is beyond the scope
+ of this document and steps for implementing it are well-documented.
+ </para>
+
+ <para>
+ The following services authenticate using LDAP:
+ </para>
+ <indexterm><primary>UNIX</primary></indexterm>
+ <indexterm><primary>Postfix</primary></indexterm>
+ <indexterm><primary>Courier-IMAP</primary></indexterm>
+ <simplelist>
+ <member><para>UNIX login/ssh</para></member>
+ <member><para>Postfix (SMTP)</para></member>
+ <member><para>Courier-IMAP/IMAPS/POP3/POP3S</para></member>
+ </simplelist>
+
+ <para>
+ <indexterm><primary>white-pages</primary></indexterm>
+ <indexterm><primary>Windows Address Book</primary></indexterm>
+ Company-wide White-Pages can be searched using a LDAP client
+ such as the one in the Windows Address Book.
+ </para>
+
+ <para>
+ <indexterm><primary>LDAP</primary></indexterm>
+ <indexterm><primary>smbldap-tools</primary></indexterm>
+ Having gained a solid understanding of LDAP, and a relatively workable LDAP tree
+ thus far, it was time to configure Samba. I compiled the latest stable SAMBA and
+ also installed the latest <command>smbldap-tools</command> from
+ <ulink url="http://idealx.com">Idealx</ulink>.
+ </para>
+
+ <para>
+ The Samba &smb.conf; file was configured as shown in <link linkend="ch8smbconf"/>.
+ </para>
+
+<smbconfexample id="ch8smbconf">
+<title>Samba Configuration File &smbmdash; smb.conf Part A</title>
+<smbconfcomment>Global parameters</smbconfcomment>
+<smbconfsection name="[global]"/>
+<smbconfoption name="workgroup">MEGANET2</smbconfoption>
+<smbconfoption name="netbios name">MASSIVE</smbconfoption>
+<smbconfoption name="server string">Corp File Server</smbconfoption>
+<smbconfoption name="passdb backend">ldapsam:ldap://localhost</smbconfoption>
+<smbconfoption name="pam password change">Yes</smbconfoption>
+<smbconfoption name="username map">/etc/samba/smbusers</smbconfoption>
+<smbconfoption name="log level">1</smbconfoption>
+<smbconfoption name="log file">/data/samba/log/%m.log</smbconfoption>
+<smbconfoption name="name resolve order">wins host bcast</smbconfoption>
+<smbconfoption name="time server">Yes</smbconfoption>
+<smbconfoption name="printcap name">cups</smbconfoption>
+<smbconfoption name="show add printer wizard">No</smbconfoption>
+<smbconfoption name="add user script">/opt/IDEALX/sbin/smbldap-useradd -m "%u"</smbconfoption>
+<smbconfoption name="add group script">/opt/IDEALX/sbin/smbldap-groupadd -p "%g"</smbconfoption>
+<smbconfoption name="add user to group script"></smbconfoption>
+<member><parameter>/opt/IDEALX/sbin/smbldap-groupmod -m "%u" "%g"</parameter></member>
+<smbconfoption name="delete user from group script"></smbconfoption>
+<member><parameter>/opt/IDEALX/sbin/smbldap-groupmod -x "%u" "%g"</parameter></member>
+<smbconfoption name="set primary group script"></smbconfoption>
+<member><parameter>/opt/IDEALX/sbin/smbldap-usermod -g "%g" "%u"</parameter></member>
+<smbconfoption name="add machine script">/usr/local/sbin/smbldap-useradd -w "%m"</smbconfoption>
+<smbconfoption name="logon script">logon.bat</smbconfoption>
+<smbconfoption name="logon path">\\%L\profiles\%U\%a</smbconfoption>
+<smbconfoption name="logon drive">H:</smbconfoption>
+<smbconfoption name="logon home">\\%L\%U</smbconfoption>
+<smbconfoption name="domain logons">Yes</smbconfoption>
+<smbconfoption name="wins support">Yes</smbconfoption>
+<smbconfoption name="ldap admin dn">cn=Manager,dc=abmas,dc=biz</smbconfoption>
+<smbconfoption name="ldap group suffix">ou=Groups</smbconfoption>
+<smbconfoption name="ldap idmap suffix">ou=People</smbconfoption>
+<smbconfoption name="ldap machine suffix">ou=People</smbconfoption>
+<smbconfoption name="ldap passwd sync">Yes</smbconfoption>
+<smbconfoption name="ldap suffix">ou=MEGANET2,dc=abmas,dc=biz</smbconfoption>
+<smbconfoption name="ldap ssl">no</smbconfoption>
+<smbconfoption name="ldap user suffix">ou=People</smbconfoption>
+<smbconfoption name="admin users">root, "@Domain Admins"</smbconfoption>
+<smbconfoption name="printer admin">"@Domain Admins"</smbconfoption>
+<smbconfoption name="force printername">Yes</smbconfoption>
+</smbconfexample>
+
+<smbconfexample id="ch8smbconf2">
+<title>Samba Configuration File &smbmdash; smb.conf Part B</title>
+<smbconfsection name="[netlogon]"/>
+<smbconfoption name="comment">Network logon service</smbconfoption>
+<smbconfoption name="path">/data/samba/netlogon</smbconfoption>
+<smbconfoption name="write list">"@Domain Admins"</smbconfoption>
+<smbconfoption name="guest ok">Yes</smbconfoption>
+
+<smbconfsection name="[profiles]"/>
+<smbconfoption name="comment">Roaming Profile Share</smbconfoption>
+<smbconfoption name="path">/data/samba/profiles/</smbconfoption>
+<smbconfoption name="read only">No</smbconfoption>
+<smbconfoption name="profile acls">Yes</smbconfoption>
+<smbconfoption name="veto files">desktop.ini</smbconfoption>
+<smbconfoption name="browseable">No</smbconfoption>
+
+<smbconfsection name="[homes]"/>
+<smbconfoption name="comment">Home Directories</smbconfoption>
+<smbconfoption name="valid users">%S</smbconfoption>
+<smbconfoption name="read only">No</smbconfoption>
+<smbconfoption name="create mask">0770</smbconfoption>
+<smbconfoption name="veto files">desktop.ini</smbconfoption>
+<smbconfoption name="hide files">desktop.ini</smbconfoption>
+<smbconfoption name="browseable">No</smbconfoption>
+
+<smbconfsection name="[software]"/>
+<smbconfoption name="comment">Software for %a computers</smbconfoption>
+<smbconfoption name="path">/data/samba/shares/software/%a</smbconfoption>
+<smbconfoption name="guest ok">Yes</smbconfoption>
+
+<smbconfsection name="[public]"/>
+<smbconfoption name="comment">Public Files</smbconfoption>
+<smbconfoption name="path">/data/samba/shares/public</smbconfoption>
+<smbconfoption name="read only">No</smbconfoption>
+<smbconfoption name="guest ok">Yes</smbconfoption>
+
+<smbconfsection name="[PDF]"/>
+<smbconfoption name="comment">Location of documents printed to PDFCreator printer</smbconfoption>
+<smbconfoption name="path">/data/samba/shares/pdf</smbconfoption>
+<smbconfoption name="guest ok">Yes</smbconfoption>
+</smbconfexample>
+
+<smbconfexample id="ch8smbconf3">
+<title>Samba Configuration File &smbmdash; smb.conf Part C</title>
+<smbconfsection name="[EVERYTHING]"/>
+<smbconfoption name="comment">All shares</smbconfoption>
+<smbconfoption name="path">/data/samba</smbconfoption>
+<smbconfoption name="valid users">"@Domain Admins"</smbconfoption>
+<smbconfoption name="read only">No</smbconfoption>
+
+<smbconfsection name="[CDROM]"/>
+<smbconfoption name="comment">CD-ROM on MASSIVE</smbconfoption>
+<smbconfoption name="path">/mnt</smbconfoption>
+<smbconfoption name="guest ok">Yes</smbconfoption>
+
+<smbconfsection name="[print$]"/>
+<smbconfoption name="comment">Printer Drivers Share</smbconfoption>
+<smbconfoption name="path">/data/samba/drivers</smbconfoption>
+<smbconfoption name="write list">root</smbconfoption>
+<smbconfoption name="browseable">No</smbconfoption>
+
+<smbconfsection name="[printers]"/>
+<smbconfoption name="comment">All Printers</smbconfoption>
+<smbconfoption name="path">/data/samba/spool</smbconfoption>
+<smbconfoption name="create mask">0644</smbconfoption>
+<smbconfoption name="printable">Yes</smbconfoption>
+<smbconfoption name="browseable">No</smbconfoption>
+
+<smbconfsection name="[acct_hp8500]"/>
+<smbconfoption name="comment">"Accounting Color Laser Printer"</smbconfoption>
+<smbconfoption name="path">/data/samba/spool/private</smbconfoption>
+<smbconfoption name="valid users">@acct, @acct_admin, @hr, "@Domain Admins",\</smbconfoption>
+<member><parameter>@Receptionist, dwayne, terri, danae, jerry</parameter></member>
+<smbconfoption name="create mask">0644</smbconfoption>
+<smbconfoption name="printable">Yes</smbconfoption>
+<smbconfoption name="copy">printers</smbconfoption>
+
+<smbconfsection name="[plotter]"/>
+<smbconfoption name="comment">Engineering Plotter</smbconfoption>
+<smbconfoption name="path">/data/samba/spool</smbconfoption>
+<smbconfoption name="create mask">0644</smbconfoption>
+<smbconfoption name="printable">Yes</smbconfoption>
+<smbconfoption name="use client driver">Yes</smbconfoption>
+<smbconfoption name="copy">printers</smbconfoption>
+</smbconfexample>
+
+<smbconfexample id="ch8smbconf4">
+<title>Samba Configuration File &smbmdash; smb.conf Part D</title>
+<smbconfsection name="[APPS]"/>
+<smbconfoption name="path">/data/samba/shares/Apps</smbconfoption>
+<smbconfoption name="force group">"Domain Users"</smbconfoption>
+<smbconfoption name="read only">No</smbconfoption>
+
+<smbconfsection name="[ACCT]"/>
+<smbconfoption name="path">/data/samba/shares/Accounting</smbconfoption>
+<smbconfoption name="valid users">@acct, "@Domain Admins"</smbconfoption>
+<smbconfoption name="force group">acct</smbconfoption>
+<smbconfoption name="read only">No</smbconfoption>
+<smbconfoption name="create mask">0660</smbconfoption>
+<smbconfoption name="directory mask">0770</smbconfoption>
+
+<smbconfsection name="[ACCT_ADMIN]"/>
+<smbconfoption name="path">/data/samba/shares/Acct_Admin</smbconfoption>
+<smbconfoption name="valid users">@”acct_admin”</smbconfoption>
+<smbconfoption name="force group">acct_admin</smbconfoption>
+
+<smbconfsection name="[HR_PR]"/>
+<smbconfoption name="path">/data/samba/shares/HR_PR</smbconfoption>
+<smbconfoption name="valid users">@hr, @acct_admin</smbconfoption>
+<smbconfoption name="force group">hr</smbconfoption>
+
+<smbconfsection name="[ENGR]"/>
+<smbconfoption name="path">/data/samba/shares/Engr</smbconfoption>
+<smbconfoption name="valid users">@engr, @receptionist, @truss, "@Domain Admins", cheri</smbconfoption>
+<smbconfoption name="force group">engr</smbconfoption>
+<smbconfoption name="read only">No</smbconfoption>
+<smbconfoption name="create mask">0770</smbconfoption>
+
+<smbconfsection name="[DATA]"/>
+<smbconfoption name="path">/data/samba/shares/DATA</smbconfoption>
+<smbconfoption name="valid users">@engr, @receptionist, @truss, "@Domain Admins", cheri</smbconfoption>
+<smbconfoption name="force group">engr</smbconfoption>
+<smbconfoption name="read only">No</smbconfoption>
+<smbconfoption name="create mask">0770</smbconfoption>
+<smbconfoption name="copy">engr</smbconfoption>
+</smbconfexample>
+
+<smbconfexample id="ch8smbconf5">
+<title>Samba Configuration File &smbmdash; smb.conf Part E</title>
+<smbconfsection name="[X]"/>
+<smbconfoption name="path">/data/samba/shares/X</smbconfoption>
+<smbconfoption name="valid users">@engr, @acct</smbconfoption>
+<smbconfoption name="force group">engr</smbconfoption>
+<smbconfoption name="read only">No</smbconfoption>
+<smbconfoption name="create mask">0770</smbconfoption>
+<smbconfoption name="copy">engr</smbconfoption>
+
+<smbconfsection name="[NETWORK]"/>
+<smbconfoption name="path">/data/samba/shares/network</smbconfoption>
+<smbconfoption name="valid users">"@Domain Users"</smbconfoption>
+<smbconfoption name="read only">No</smbconfoption>
+<smbconfoption name="create mask">0770</smbconfoption>
+<smbconfoption name="guest ok">Yes</smbconfoption>
+
+<smbconfsection name="[UTILS]"/>
+<smbconfoption name="path">/data/samba/shares/Utils</smbconfoption>
+<smbconfoption name="write list">"@Domain Admins"</smbconfoption>
+
+<smbconfsection name="[SYS]"/>
+<smbconfoption name="path">/data/samba/shares/SYS</smbconfoption>
+<smbconfoption name="valid users">chad</smbconfoption>
+<smbconfoption name="read only">No</smbconfoption>
+<smbconfoption name="browseable">No</smbconfoption>
+</smbconfexample>
+
+ <para>
+ <indexterm><primary>Qbasic</primary></indexterm>
+ <indexterm><primary>Rbase</primary></indexterm>
+ <indexterm><primary>drive letters</primary></indexterm>
+ Most of these shares are only used by one company group, but they are required
+ because of some ancient Qbasic and Rbase applications were that written expecting
+ their own drive letters.
+ </para>
+
+ <para>
+ <indexterm><primary>rsync</primary></indexterm>
+ <indexterm><primary>rsyncd.conf</primary></indexterm>
+ <indexterm><primary>synchronize</primary></indexterm>
+ Note: During the process of building the new server, I kept data files up-to-date
+ with the Novell server via use of <command>rsync</command>. On a separate system (my workstation
+ in fact) which could be rebooted whenever necessary, I set up a mount point to the
+ Novell server via <command>ncpmount</command>. I then created a
+ <filename>rsyncd.conf</filename> to share that mount point out to my new server,
+ and synchronized once an hour. The script I used to synchronize is quite nice, so
+ I will include it in an appendix. The reason I had to have the
+ <command>rsync</command> daemon running on a system which could be rebooted
+ frequently is because <constant>ncpfs</constant> has a nasty habit of creating
+ stale mount points which cannot be recovered without a reboot. The reason for
+ hourly synchronization is because some part of the chain was very slow and
+ performance-heavy (whether <command>rsync</command> itself, the network, or
+ the Novell server I am not sure probably the Novell server).
+ </para>
+
+ <para>
+ After Samba had been configured, I initialized the LDAP database. So the first
+ thing I had to do was to store the LDAP password in the Samba configuration by
+ issuing the command (as root):
+<screen>
+&rootprompt; smbpasswd -w verysecret
+</screen>
+ where <quote>verysecret</quote> is replaced by the LDAP bind password.
+ </para>
+
+<note><para>
+The Idealx smbldap-tools package can be configured using a script called
+<command>configure.pl</command> that is provided as part of the tool. See Chapter 6
+for an example of its use. Many administrators, like Misty, choose to do this manually
+so as to maintain greater awareness of how the tool-chain works, and possibly to avoid
+undesirable actions from occurring un-noticed.
+</para></note>
+
+ <para>
+ Now Samba is ready for use. Now configure the smbldap-tools. There are two
+ relevant files, which are usually put into the directory
+ <filename>/etc/smbldap-tools</filename>. The main file,
+ <filename>smbldap.conf</filename> is shown in <link linkend="ch8ideal"/>.
+ </para>
+
+<example id="ch8ideal">
+<title>Idealx smbldap-tools Control File &smbmdash; Part A</title>
+<screen>
+#########
+#
+# located in /etc/smbldap-tools/smbldap.conf
+#
+##############################################################################
+#
+# General Configuration
+#
+##############################################################################
+
+# Put your own SID
+# to obtain this number do: net getlocalsid
+SID="S-1-5-21-725326080-1709766072-2910717368"
+
+##############################################################################
+#
+# LDAP Configuration
+#
+##############################################################################
+
+# Notes: to use to dual ldap servers backend for Samba, you must patch
+# Samba with the dual-head patch from IDEALX. If not using this patch
+# just use the same server for slaveLDAP and masterLDAP.
+# Those two servers declarations can also be used when you have
+# . one master LDAP server where all writing operations must be done
+# . one slave LDAP server where all reading operations must be done
+# (typically a replication directory)
+
+# Ex: slaveLDAP=127.0.0.1
+slaveLDAP="127.0.0.1"
+slavePort="389"
+
+# Master LDAP : needed for write operations
+# Ex: masterLDAP=127.0.0.1
+masterLDAP="127.0.0.1"
+masterPort="389"
+
+# Use TLS for LDAP
+# If set to 1, this option will use start_tls for connection
+# (you should also used the port 389)
+ldapTLS="0"
+
+# How to verify the server's certificate (none, optional or require)
+# see "man Net::LDAP" in start_tls section for more details
+verify=""
+</screen>
+</example>
+
+<example id="ch8ideal2">
+<title>Idealx smbldap-tools Control File &smbmdash; Part B</title>
+<screen>
+# CA certificate
+# see "man Net::LDAP" in start_tls section for more details
+cafile=""
+ certificate to use to connect to the ldap server
+# see "man Net::LDAP" in start_tls section for more details
+clientcert=""
+
+# key certificate to use to connect to the ldap server
+# see "man Net::LDAP" in start_tls section for more details
+clientkey=""
+
+# LDAP Suffix
+# Ex: suffix=dc=IDEALX,dc=ORG
+suffix="ou=MEGANET2,dc=abmas,dc=biz"
+
+# Where are stored Users
+# Ex: usersdn="ou=Users,dc=IDEALX,dc=ORG"
+usersdn="ou=People,${suffix}"
+
+# Where are stored Computers
+# Ex: computersdn="ou=Computers,dc=IDEALX,dc=ORG"
+computersdn="ou=People,${suffix}"
+
+# Where are stored Groups
+# Ex groupsdn="ou=Groups,dc=IDEALX,dc=ORG"
+groupsdn="ou=Groups,${suffix}"
+
+# Where are stored Idmap entries (used if samba is a domain member server)
+# Ex groupsdn="ou=Idmap,dc=IDEALX,dc=ORG"
+idmapdn="ou=Idmap,${suffix}"
+
+# Where to store next uidNumber and gidNumber available
+sambaUnixIdPooldn="sambaDomainName=MEGANET2,dc=abmas,dc=biz"
+
+# Default scope Used
+scope="sub"
+</screen>
+</example>
+
+<example id="ch8ideal3">
+<title>Idealx smbldap-tools Control File &smbmdash; Part C</title>
+<screen>
+# Unix password encryption (CRYPT, MD5, SMD5, SSHA, SHA)
+hash_encrypt="MD5"
+
+# if hash_encrypt is set to CRYPT, you may set a salt format.
+# default is "%s", but many systems will generate MD5 hashed
+# passwords if you use "$1$%.8s". This parameter is optional!
+crypt_salt_format="%s"
+
+##############################################################################
+#
+# Unix Accounts Configuration
+#
+##############################################################################
+
+# Login defs
+# Default Login Shell
+# Ex: userLoginShell="/bin/bash"
+userLoginShell="/bin/false"
+
+# Home directory
+# Ex: userHome="/home/%U"
+userHome="/home/%U"
+
+# Gecos
+userGecos="Samba User"
+
+# Default User (POSIX and Samba) GID
+defaultUserGid="513"
+
+# Default Computer (Samba) GID
+defaultComputerGid="515"
+
+# Skel dir
+skeletonDir="/etc/skel"
+
+# Default password validation time (time in days) Comment the next line if
+# you don't want password to be enable for defaultMaxPasswordAge days (be
+# careful to the sambaPwdMustChange attribute's value)
+defaultMaxPasswordAge="45"
+</screen>
+</example>
+
+<example id="ch8ideal4">
+<title>Idealx smbldap-tools Control File &smbmdash; Part D</title>
+<screen>
+##############################################################################
+#
+# SAMBA Configuration
+#
+##############################################################################
+
+# The UNC path to home drives location (%U username substitution)
+# Ex: \\My-PDC-netbios-name\homes\%U
+# Just set it to a null string if you want to use the smb.conf 'logon home'
+# directive and/or disable roaming profiles
+userSmbHome=""
+
+# The UNC path to profiles locations (%U username substitution)
+# Ex: \\My-PDC-netbios-name\profiles\%U
+# Just set it to a null string if you want to use the smb.conf 'logon path'
+# directive and/or disable roaming profiles
+userProfile=""
+
+# The default Home Drive Letter mapping
+# (will be automatically mapped at logon time if home directory exist)
+# Ex: H: for H:
+userHomeDrive=""
+
+# The default user netlogon script name (%U username substitution)
+# if not used, will be automatically username.cmd
+# make sure script file is edited under dos
+# Ex: %U.cmd
+# userScript="startup.cmd" # make sure script file is edited under dos
+userScript=""
+
+# Domain appended to the users "mail"-attribute
+# when smbldap-useradd -M is used
+mailDomain="abmas.org"
+
+##############################################################################
+#
+# SMBLDAP-TOOLS Configuration (default are ok for a RedHat)
+#
+##############################################################################
+# Allows not to use smbpasswd (if with_smbpasswd == 0 in smbldap_conf.pm) but
+# prefer Crypt::SmbHash library
+with_smbpasswd="0"
+smbpasswd="/usr/bin/smbpasswd"
+</screen>
+</example>
+
+ <para>
+ <indexterm><primary>TLS</primary></indexterm>
+ NOTE: I chose not to take advantage of the TLS capability of this.
+ Eventually I may go back and tweak it. Also I chose not to take advantage
+ of the master/slave configuration as I heard horror stories that it was
+ unstable. My slave servers are replicas only.
+ </para>
+
+ <para>
+ The <filename>/etc/smbldap-tools/smbldap_bind.conf</filename> file is shown here:
+<screen>
+# smbldap_bind.conf
+#
+# This file simply tells smbldap-tools how to bind to your LDAP server.
+# It has to be a DN with full write access to the Samba portion of
+# the database.
+
+############################
+# Credential Configuration #
+############################
+# Notes: you can specify two differents configuration if you use a
+# master ldap for writing access and a slave ldap server for reading access
+# By default, we will use the same DN (so it will work for standard Samba
+# release)
+slaveDN="cn=Manager,dc=abmas,dc=biz"
+slavePw="verysecret"
+masterDN="cn=Manager,dc=abmas,dc=biz"
+masterPw="verysecret"
+</screen>
+ </para>
+
+ <para>
+ We can now run the <command>smbldap-populate</command> command which will populate
+ the LDAP tree with the appropriate default users, groups, and UID and GID pools.
+ It will create a user called Administrator with UID=0 and GID=0 matching the
+ Domain Admins group. This is fine you can still log in a root to a Windows system,
+ but it will break cached credentials if you need to log in as the administrator
+ to a system that is not on the network for whatever reason.
+ </para>
+
+ <para>
+ After the LDAP database has been pre-loaded it is prudent to validate that the
+ information needed is in the LDAP directory. This can be done done by restarting
+ the LDAP server, then performing an LDAP search by executing:
+<screen>
+&rootprompt; ldapsearch -W -x -b "dc=abmas,dc=biz"\
+ -D "cn=Manager,dc=abmas,dc=biz" \
+ "(Objectclass=*)"
+Enter LDAP Password:
+# extended LDIF
+#
+# LDAPv3
+# base &lt;dc=abmas,dc=biz&gt; with scope sub
+# filter: (ObjectClass=*)
+# requesting: ALL
+#
+
+# abmas.biz
+dn: dc=abmas,dc=biz
+objectClass: dcObject
+objectClass: organization
+o: abmas
+dc: abmas
+
+# People, abmas.biz
+dn: ou=People,dc=abmas,dc=biz
+objectClass: organizationalUnit
+ou: People
+
+# Groups, abmas.biz
+dn: ou=Groups,dc=abmas,dc=biz
+objectClass: organizationalUnit
+ou: Groups
+
+# Idmap, abmas.biz
+dn: ou=Idmap,dc=abmas,dc=biz
+objectClass: organizationalUnit
+ou: Idmap
+...
+</screen>
+ </para>
+
+ <para>
+ <indexterm><primary>Windows</primary></indexterm>
+ <indexterm><primary>POSIX</primary></indexterm>
+ <indexterm><primary>smbldap-groupadd</primary></indexterm>
+ <indexterm><primary>RID</primary></indexterm>
+ <indexterm><primary>sambaGroupMapping</primary></indexterm>
+ With the LDAP directory now intialized it is time to create the Windows and POSIX
+ (UNIX) group accounts as well as the mappings from Windows groups to UNIX groups.
+ The easiest way to do this is to use <command>smbldap-groupadd</command> command.
+ It will create the group with the posixGroup and sambaGroupMapping attributes, a
+ unique GID, and an automatically-determined RID. I learned the hard way not to
+ try to do this by hand.
+ </para>
+
+ <para>
+ <indexterm><primary>group mapping</primary></indexterm>
+ <indexterm><primary>smbldap-groupmod</primary></indexterm>
+ <indexterm><primary>memberUID</primary></indexterm>
+ After I had my group mappings in place, I added users to the groups (the users
+ don't really have to exist yet). I used the <command>smbldap-groupmod</command>
+ command to accomplish this. It can also be done manually by adding memberUID
+ attributes to the group entries in LDAP.
+ </para>
+
+ <para>
+ <indexterm><primary>sambaSamAccount</primary></indexterm>
+ <indexterm><primary>posixAccount</primary></indexterm>
+ <indexterm><primary>smbldap-usermod</primary></indexterm>
+ The most monumental task of all was adding the sambaSamAccount information to each
+ already-existent posixAccount entry. I did it one at a time as I moved people onto
+ the new server, by issuing the command:
+<screen>
+&rootprompt; smbldap-usermod -a -P username
+</screen>
+ <indexterm><primary>NetWare</primary></indexterm>
+ <indexterm><primary>LDIF</primary></indexterm>
+ <indexterm><primary>slapcat</primary></indexterm>
+ I completed that step for every user after asking the person what their current
+ NetWare password was. The wiser way to have done it would probably be to dump the
+ entire database to an LDIF file. This can be done by executing:
+<screen>
+&rootprompt; slapcat &gt; somefile.ldif
+</screen>
+ <indexterm><primary>Perl</primary></indexterm>
+ <indexterm><primary>objectClass</primary></indexterm>
+ Then update the LDIF file created by using a Perl script to parse and add the
+ appropriate attributes and objectClasses to each entry, followed by re-importing
+ the entire database into the LDAP directory.
+ </para>
+
+ <para>
+ Rebuilding of the LDAP directory can be done as follows:
+<screen>
+&rootprompt; rcldap stop
+&rootprompt; cd /data/ldap
+&rootprompt; rm *bdb _* log*
+&rootprompt; su - ldap -c "slapadd -l somefile.ldif"
+&rootprompt; rcldap start
+</screen>
+ This can be done at any time and for any reason, with no harm to the database.
+ </para>
+
+ <para>
+ So first I added a test user, of course. The LDIF for this test user looks like
+ this, to give you an idea:
+<screen>
+# Entry 1: cn=Test User,ou=people,ou=corp,dc=abmas,dc=biz
+dn:cn=Test User,ou=people,ou=corp,dc=abmas,dc=biz
+cn: Test User
+gecos: Test User
+gidNumber: 513
+givenName: Test
+homeDirectory: /home/test.user
+homePhone: 555
+l: Somewhere
+l: ST
+mail: test.user
+o: Corp
+objectClass: top
+objectClass: inetOrgPerson
+objectClass: posixAccount
+objectClass: sambaSamAccount
+postalCode: 12345
+sn: User
+street: 10 Some St.
+uid: test.user
+uidNumber: 1074
+sambaLogonTime: 0
+sambaLogoffTime: 2147483647
+sambaKickoffTime: 2147483647
+sambaPwdCanChange: 0
+displayName: Samba User
+sambaSID: S-1-5-21-725326080-1709766072-2910717368-3148
+sambaLMPassword: 9D29C287C58448F9AAD3B435B51404EE
+sambaAcctFlags: [U]
+sambaNTPassword: D062088E99C95E37D7702287BB35E770
+sambaPwdLastSet: 1102537694
+sambaPwdMustChange: 1106425694
+userPassword: {SSHA}UzFZ2VxRGdwUueLnTGtsTBtnsvMO1oj8
+loginShell: /bin/false
+</screen>
+ </para>
+
+ <para>
+ Then I went over to a spare Windows NT machine and joined it to the MEGANET2 domain.
+ It worked, and the machine's account entry under ou=Computers looks like this:
+<screen>
+dn:uid=w2kengrspare$,ou=Computers,ou=MEGANET2,dc=abmas,dc=biz
+objectClass: top
+objectClass: inetOrgPerson
+objectClass: posixAccount
+objectClass: sambaSamAccount
+cn: w2kengrspare$
+sn: w2kengrspare$
+uid: w2kengrspare$
+uidNumber: 1104
+gidNumber: 515
+homeDirectory: /dev/null
+loginShell: /bin/false
+description: Computer
+gecos: Computer
+sambaSID: S-1-5-21-725326080-1709766072-2910717368-3208
+sambaPrimaryGroupSID: S-1-5-21-725326080-1709766072-2910717368-2031
+displayName: W2KENGRSPARE$
+sambaPwdCanChange: 1103149236
+sambaPwdMustChange: 2147483647
+sambaNTPassword: CA199C45CB6737035DB6D9D9F6CD1834
+sambaPwdLastSet: 1103149236
+sambaAcctFlags: [W ]
+</screen>
+ </para>
+
+ <para>
+ <indexterm><primary>netlogon</primary></indexterm>
+ So now I can log in with a test user from the machine w2kengrspare. It's all fine and
+ good, but that user is in no groups yet so has pretty boring access. We can fix that
+ by writing the login script! To write the login script, I used
+ <ulink url="http://www.kixtart.org">Kixstart</ulink>. I used it because it will work
+ with every architecture of Windows, has an active and helpful user base, and was both
+ easier to learn and more powerful than the standard netlogon scripts I have seen.
+ I also did not have to do a logon script per user or per group.
+ </para>
+
+ <para>
+ <indexterm><primary>Kixtart</primary></indexterm>
+ I downloaded Kixtart and put the following files in my [netlogon] share:
+<screen>
+KIX32.EXE
+KX32.dll
+KX95.dll &lt;-- Not needed unless you are running Win9x clients.
+kx16.dll &lt;-- Probably not needed unless you are running DOS clients.
+kxrpc.exe &lt;-- Probably useless as it has to run on the server and can
+ only be run on NT. It's for Windows 95 to become group-aware.
+ We can get around the need.
+</screen>
+ </para>
+
+ <para>
+ <indexterm><primary>logon.kix</primary></indexterm>
+ I then wrote the <filename>logon.kix</filename> file that is shown in
+ <link linkend="ch8kix"/>. I chose to keep it all in one file, but it
+ can be split up and linked via include directives.
+ </para>
+
+<example id="ch8kix">
+<title>Kixstart Control File &smbmdash; File: logon.kix</title>
+<screen>
+; This script just calls the other scripts.
+
+; First we want to get things done for everyone.
+
+; Second, we do first-time login stuff.
+
+; Third, we go through the group-oriented scripts one at a time.
+
+
+; We want to check for group membership here to avoid the overhead of running
+; scripts which don't apply.
+call "\\massive\netlogon\scripts\main.kix"
+call "\\massive\netlogon\scripts\setup.kix"
+IF INGROUP("MEGANET2\ACCT")
+ call "scripts\acct.kix"
+ENDIF
+IF INGROUP("MEGANET2\ENGR","MEGANET2\RECEPTIONIST")
+call "\\massive\netlogon\scripts\engr.kix"
+ENDIF
+IF INGROUP("MEGANET2\FURN")
+ call "\\massive\netlogon\scripts\furn.kix"
+ENDIF
+IF INGROUP("MEGANET2\TRUSS")
+ call "\\massive\netlogon\scripts\truss.kix"
+ENDIF
+</screen>
+</example>
+
+<example id="ch8kix2">
+<title>Kixstart Control File &smbmdash; File: main.kix</title>
+<screen>
+break on
+
+; Choose whether to hide the login window or not
+IF INGROUP("MEGANET2\Domain Admins")
+ USE Z: \\massive\everything
+ SETCONSOLE("show")
+ELSE
+ ; Nobody cares about seeing the login script except admins
+ SETCONSOLE("hide")
+ENDIF
+
+; Delete all previously connected shares
+USE * /delete
+
+SETTITLE("Logging on @USERID to @LDOMAIN at @TIME")
+
+; Set the time on the workstation
+$Timeserver = "\\massive"
+Settime $TimeServer
+
+; Map the home directory
+USE H: @HOMESHR ; connect to user's home share
+IF @ERROR = 0
+
+ H:
+ CD @HOMEDIR ; change directory to user's home directory
+ENDIF
+
+; Everyone gets the N drive
+USE N: \\massive\network
+</screen>
+</example>
+
+<example id="ch8kix3">
+<title>Kixstart Control File &smbmdash; File: setup.kix, Part A</title>
+<screen>
+; My setup.kix is where all of the redirection stuff happens. Note that with
+; the use of registry keys, ths only happens the first time they log in ,or if
+; I delete the pertinent registry keys which triggers it to happen again:
+
+; Check to see if we have written the Borkholder subkey before
+$RETURNCODE = EXISTKEY("HKEY_CURRENT_USER\Borkholder")
+IF NOT $RETURNCODE = 0
+; Add key for Borkholder-specific things on the first login
+ ADDKEY("HKEY_CURRENT_USER\Borkholder")
+ ; The following key gets deleted at the end of the first login
+ ADDKEY("HKEY_CURRENT_USER\Borkholder\FIRST_LOGIN")
+ENDIF
+
+; People with laptops need My Documents to be in their profile. People with
+; desktops can have My Documents redirected to their home directory to avoid
+; long delays with logging out and out-of-sync files.
+
+; Check to see if this is the first login -- doesn't make sense to do this
+; at the very first login
+
+$RETURNCODE = EXISTKEY("HKEY_CURRENT_USER\Borkholder\FIRST_LOGIN")
+IF NOT $RETURNCODE = 0
+
+; We don't want to do this stuff for people with laptops or people in the FURN
+; group. (They store their profiles in a different server)
+
+ IF NOT INGROUP("MASSIVE\Laptop","MASSIVE\FURN")
+ $RETURNCODE=EXISTKEY("HKEY_CURRENT_USER\Borkholder\profile_copied")
+
+; A crude way to tell what OS our profile is for and copy the "My Documents"
+; to the redirected folder on the server. It works because the profiles
+; are stored as \\server\profiles\user\architecture
+ IF NOT $RETURNCODE = 0
+ IF EXIST("\\massive\profiles\@userID\WinXP")
+ copy "\\massive\profiles\@userID\WinXP\My Documents\*"
+"\\massive\@userID\"
+ ENDIF
+ IF EXIST("\\massive\profiles\@userID\Win2K")
+ copy "\\massive\profiles\@userID\Win2K\My Documents\*"
+"\\massive\@userID\"
+ ENDIF
+ IF EXIST("\\massive\profiles\@userID\WinNT")
+ copy "\\massive\profiles\@userID\WinNT\My Documents\*"
+"\\massive\@userID\"
+ ENDIF
+</screen>
+</example>
+
+<example id="ch8kix3b">
+<title>Kixstart Control File &smbmdash; File: setup.kix, Part B</title>
+<screen>
+; Now we will write the registry values to redirect the locations of "My
+Documents"
+; and other folders.
+ ADDKEY("HKEY_CURRENT_USER\Borkholder\profile_copied")
+ WRITEVALUE("HKEY_CURRENT_USER\Software\Microsoft\
+Windows\CurrentVersion\Explorer\User
+Shell Folders", "Personal","\\massive\@userID","REG_SZ")
+ WRITEVALUE("HKEY_CURRENT_USER\Software\Microsoft\
+Windows\CurrentVersion\Explorer\User
+Shell Folders", "My Pictures", "\\massive\@userID\My Pictures", "REG_SZ")
+ IF @PRODUCTTYPE="Windows 2000 Professional" or @PRODUCTTYPE="Windows XP
+Professional"
+ WRITEVALUE("HKEY_CURRENT_USER\Software\Microsoft\
+Windows\CurrentVersion\Explorer\User
+Shell Folders", "My Videos", "\\massive\@userID\My Videos", "REG_SZ")
+ WRITEVALUE("HKEY_CURRENT_USER\Software\Microsoft\
+Windows\CurrentVersion\Explorer\User
+Shell Folders", "My Music", "\\massive\@userID\My Music", "REG_SZ")
+ WRITEVALUE("HKEY_CURRENT_USER\Software\Microsoft\
+Windows\CurrentVersion\Explorer\User
+Shell Folders", "My eBooks", "\\massive\@userID\My eBooks", "REG_SZ")
+ ENDIF
+ ENDIF
+ ENDIF
+
+; Now we will delete the FIRST_LOGIN subkey that we made before.
+; Note - to run this script again you will want to delete the HKCU\Borkholder
+; subkey, log out, and log back in.
+$RETURNVALUE = EXISTKEY("HKEY_CURRENT_USER\Borkholder\FIRST_LOGIN")
+IF $RETURNVALUE = 0
+ DELKEY("HKEY_CURRENT_USER\Borkholder\FIRST_LOGIN")
+ENDIF
+</screen>
+</example>
+
+<example id="ch8kix4">
+<title>Kixstart Control File &smbmdash; File: acct.kix</title>
+<screen>
+; And here is one group-oriented script to show what can be
+; done that way: acct.kix:
+
+IF INGROUP("MASSIVE\Acct_Admin","MASSIVE\HR")
+ USE I: \\MEGANET2\HR_PR
+ENDIF
+
+; Set up printer
+$RETURNVALUE = existkey("HKEY_CURRENT_USER\Printers\,,massive,acct_hp8500")
+IF NOT $RETURNVALUE = 0
+ ADDPRINTERCONNECTION("\\massive\acct_hp8500")
+ SETDEFAULTPRINTER("\\massive\acct_hp8500")
+ENDIF
+; Set up drive mappings
+ USE M: \\massive\ACCT
+ IF INGROUP("MEGANET2\ABRA")
+ USE T: \\trussrv\abra
+ ENDIF
+</screen>
+</example>
+
+ <para>
+ As you can see in the script, I redirect the My Documents to the user's home
+ share if they are not in the “Laptop” group. I also add printers on a
+ group-by-group basis, and if applicable I setthe group printer. For this to
+ be effective, the print drivers must be installed on the Samba server in the
+ <filename>[print$]</filename> share. Ample documentation exists about how to do that so I did not
+ cover it.
+ </para>
+
+ <para>
+ I actually call this script via the logon.bat script in the [netlogon] directory:
+<screen>
+\\corpsrv\netlogon\kix32 \\corpsrv\netlogon\logon.kix /f
+</screen>
+ I only had to fully qualify the paths for Windows 9x, as Windows NT and
+ greater automatically add [NETLOGON] to the path.
+ </para>
+
+ <para>
+ Also of note for Win9x is that the drive mappings and printer setup will not
+ work because they rely on RPC. One merely has to put the appropriate settings
+ into the <filename>c:\autoexec.bat</filename> file or map the drives manually. One option would
+ be to check the OS as part of the Kixtart script, and if it is Win9x and if
+ it is the first login, copy a pre-made <filename>autoexec.bat</filename> to the <filename>C:</filename> drive. I only
+ have three such machines and one is going away in the very near future, so it
+ was easier to do it by hand.
+ </para>
+
+ <para>
+ <indexterm><primary>upgrade</primary></indexterm>
+ At this point I was able to add the users. This is the part that really falls
+ into “upgrade. I moved the users over one group at a time, starting with the
+ people who used the least amount of resources on the network. With each group
+ that I moved, I first logged in as a “standard” user in that group and took
+ careful note of their environment, mainly the printers they used, their PATH,
+ and what network resources they had access to (most importantly which ones
+ they actually needed access to).
+ </para>
+
+ <para>
+ I would then add the user's SambaSamAccount information as mentioned earlier,
+ and join the computer to the domain. The very first thing I had to do was to
+ copy the user's profile to the new server. This was very important, and I really
+ struggled with the most effective way to do it. Here is the method that worked
+ for every one of my users on Windows NT, 2000, and XP:
+ </para>
+
+ <procedure>
+ <step><para>
+ Log in as the user on the domain. This creates the local copy
+ of the user's profile and copies it to the server as they log out.
+ </para></step>
+
+ <step><para>
+ Reboot the computer and log in as the local machine administrator.
+ </para></step>
+
+ <step><para>
+ Right-click My Computer, click Properties, and navigate to the
+ user profiles tab (varies per version of Windows).
+ </para></step>
+
+ <step><para>
+ Select the user's local profile <constant>(COMPUTERNAME\username)</constant>,
+ and click the <command>Copy To</command> button.
+ </para></step>
+
+ <step><para>
+ In the next dialog, copy it directly to the profiles share on the
+ Samba server (\\PDCname\profiles\user\&lt;architecture&gt; in my
+ case). You will have had to make a connection to the share as that
+ user (e.g.: Windows Explorer type \\PDCname\profiles\username).
+ </para></step>
+
+ <step><para>
+ When the copy is complete (it can take a while) log out, and log back in
+ as the user. All his/her settings and all contents of My Documents,
+ Favorites, and the registry should have been copied successfully.
+ </para></step>
+
+ <step><para>
+ If it doesn't look right (the dead giveaway is the desktop background)
+ shut down the computer without logging out (power cycle) and try logging
+ in as the user again. If it still doesn't work, repeat the steps above.
+ I only had to ever repeat it once.
+ </para></step>
+
+ </procedure>
+
+ <para>
+ WORDS TO THE WISE:
+ </para>
+
+ <itemizedlist>
+ <listitem><para>
+ If the user was anything other than a standard user on his/her system
+ before, you will save yourself some headaches by giving them identical
+ permissions (on the local machine) as their domain account, BEFORE
+ copying their profile over. Do this through the User Administrator
+ in the Control Panel, after joining the computer to the domain and
+ before logging as that user for the first time. Otherwise they will
+ have trouble with permissions on their registry keys.
+ </para></listitem>
+
+ <listitem><para>
+ If any application was installed for the user only, rather than for
+ the entire system, it will probably not work without being reinstalled.
+ </para></listitem>
+ </itemizedlist>
+
+ <para>
+ After all these steps are accomplished, only cleanup details are left. Make sure user's
+ shortcuts and “Network Places” point to the appropriate place on the new server, check
+ the important applications to be sure they work as expected and troubleshoot any problems
+ that might arise, check to be sure the user's printers are present and working. By the
+ way, if there are any network printers installed as system printers (the Novell way)
+ you will need to log in as a local administrator and delete them.
+ </para>
+
+ <para>
+ For my non-laptop systems, I would then log in and out a couple times as the user,
+ to be sure that their registry settings were modified, then I was finished.
+ </para>
+
+ <para>
+ Some compatibility issues that cropped up included:
+ </para>
+
+ <para>
+ Blackberry client &smbmdash; It did not like having its registry settings moved around,
+ and had to be reinstalled. Also it needed write permissions to a portion of
+ the hard drive, and I had to give it those manually on the one system where
+ this was an issue.
+ </para>
+
+ <para>
+ CAMedia &smbmdash; digital camera software for Canon cameras I had all kinds of trouble
+ with the registry. I had to use the Run as service to open the registry of
+ the local user while logged in as the domain user, and give the domain user
+ the appropriate permissions to some registry keys, then export that portion
+ of the registry to a file. Then as the domain user I had to import that file
+ into the registry.
+ </para>
+
+ <para>
+ Crystal Reports version 7 &smbmdash; More registry problems that were solved by re-copying
+ the user's profile.
+ </para>
+
+ <para>
+ Printing from legacy applications &smbmdash; I found out that Novell sent its jobs to
+ the printer in a raw format. CUPS sends them in Postscript by default. I had
+ to make a second printer definition for one printer and tell CUPS specifically
+ to send raw data to the printer, and assign this printer to the LPT port with
+ Kixtart's version of the “net use”command.
+ </para>
+
+ <para>
+ These were all eventually solved by elbow grease, queries to the Samba mailing
+ list and others, and diligence. The complete migration took about 5 weeks.
+ My userbase is relatively small, but includes multiple versions of Windows,
+ multiple Linux member servers, a mechanized saw, a pen plotter, and legacy
+ applications written in Qbasic and R:Base, just to name a few. I actually
+ ended up making some of these applications work better (or work again, as
+ some of them had stopped functioning on the old server) because as part of
+ the process I had to find out how things were supposed to work.
+ </para>
+
+ <para>
+ The one thing I have not been able to get working is a very old database that
+ we had around for reference purposes which uses Novell's Btrieve engine.
+ </para>
+
+ <para>
+ As the resources compare, I went from 95% disk usage to just around 10%.
+ I went from a very high load on the server to an average load of between 1
+ and 2 runnable processes on the server. I have improved the security and
+ robustness of the system. I have also implemented
+ <ulink url="http://www.clamav.net">ClamAV</ulink> Antivirus
+ which scans the entire Samba server for viruses every two hours and
+ quarantines them. I have found it much less problematic than our ancient
+ version of Norton Antivirus Corporate Edition, and much more up-to-date.
+ </para>
+
+ <para>
+ In short, my users are much happier now that the new server is running, that
+ is what is important to me.
+ </para>
+
+ </sect3>
+
+ </sect2>
+
+</sect1>
+
+</chapter>
+