Users and computers now share the same template.
authorAndrew Bartlett <abartlet@samba.org>
Wed, 27 Feb 2008 21:43:10 +0000 (08:43 +1100)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 27 Feb 2008 21:43:10 +0000 (08:43 +1100)
Slowly work away at the samldb module again, it is clear that AD does
not use much of a templating system.  samAccountType is managed, as
far as I can tell, when groupType or userAccountControl changes.

Andrew Bartlett

source/dsdb/samdb/ldb_modules/samldb.c
source/setup/provision_self_join.ldif
source/setup/provision_templates.ldif
source/setup/provision_users.ldif

index 178149a8865d335db6252c9f2344519e73590ca8..905cd4a995d5916a8d81e2eea32b487886e3f3a1 100644 (file)
@@ -396,6 +396,7 @@ static int samldb_fill_group_object(struct ldb_module *module, const struct ldb_
                                                    struct ldb_message **ret_msg)
 {
        int ret;
+       unsigned int group_type;
        char *name;
        struct ldb_message *msg2;
        struct ldb_dn *dom_dn;
@@ -452,6 +453,26 @@ static int samldb_fill_group_object(struct ldb_module *module, const struct ldb_
                }
        }
        
+       if (ldb_msg_find_element(msg2, "sAMAccountType") != NULL) {
+               ldb_asprintf_errstring(module->ldb, "sAMAccountType must not be specified");
+               talloc_free(mem_ctx);
+               return LDB_ERR_UNWILLING_TO_PERFORM;
+       }
+       group_type = samdb_result_uint(msg2, "groupType", 0);
+       if (group_type == 0) {
+               ldb_asprintf_errstring(module->ldb, "groupType invalid");
+               talloc_free(mem_ctx);
+               return LDB_ERR_UNWILLING_TO_PERFORM;
+       } else {
+               unsigned int account_type = samdb_gtype2atype(group_type);
+               ret = samdb_msg_add_uint(module->ldb, msg2, msg2,
+                                        "sAMAccountType",
+                                        account_type);
+               if (ret != LDB_SUCCESS) {
+                       return ret;
+               }
+       }
+
        /* Manage SID allocation, conflicts etc */
        ret = samldb_handle_sid(module, mem_ctx, msg2, dom_dn); 
 
@@ -473,6 +494,7 @@ static int samldb_fill_user_or_computer_object(struct ldb_module *module, const
        const char *rdn_name;
        TALLOC_CTX *mem_ctx = talloc_new(msg);
        const char *errstr;
+       unsigned int user_account_control;
        if (!mem_ctx) {
                return LDB_ERR_OPERATIONS_ERROR;
        }
@@ -485,36 +507,15 @@ static int samldb_fill_user_or_computer_object(struct ldb_module *module, const
                return LDB_ERR_OPERATIONS_ERROR;
        }
 
-       if (samdb_find_attribute(module->ldb, msg, "objectclass", "computer") != NULL) {
-
-               ret = samdb_copy_template(module->ldb, msg2, 
-                                         "computer",
-                                         &errstr);
-               if (ret) {
-                       ldb_asprintf_errstring(module->ldb, 
-                                              "samldb_fill_user_or_computer_object: "
-                                              "Error copying computer template: %s",
-                                              errstr);
-                       talloc_free(mem_ctx);
-                       return ret;
-               }
-       } else {
-               ret = samdb_copy_template(module->ldb, msg2, 
-                                         "user",
-                                         &errstr);
-               if (ret) {
-                       ldb_asprintf_errstring(module->ldb, 
-                                              "samldb_fill_user_or_computer_object: Error copying user template: %s\n",
-                                              errstr);
-                       talloc_free(mem_ctx);
-                       return ret;
-               }
-               /* readd user objectclass */
-               ret = samdb_find_or_add_value(module->ldb, msg2, "objectclass", "user");
-               if (ret) {
-                       talloc_free(mem_ctx);
-                       return ret;
-               }
+       ret = samdb_copy_template(module->ldb, msg2, 
+                                 "user",
+                                 &errstr);
+       if (ret) {
+               ldb_asprintf_errstring(module->ldb, 
+                                      "samldb_fill_user_or_computer_object: Error copying user template: %s\n",
+                                      errstr);
+               talloc_free(mem_ctx);
+               return ret;
        }
 
        rdn_name = ldb_dn_get_rdn_name(msg2->dn);
@@ -545,14 +546,30 @@ static int samldb_fill_user_or_computer_object(struct ldb_module *module, const
                }
        }
 
-       /*
-         TODO: useraccountcontrol: setting value 0 gives 0x200 for users
-       */
+       if (ldb_msg_find_element(msg2, "sAMAccountType") != NULL) {
+               ldb_asprintf_errstring(module->ldb, "sAMAccountType must not be specified");
+               talloc_free(mem_ctx);
+               return LDB_ERR_UNWILLING_TO_PERFORM;
+       }
+       user_account_control = samdb_result_uint(msg2, "userAccountControl", 0);
+       if (user_account_control == 0) {
+               ldb_asprintf_errstring(module->ldb, "userAccountControl invalid");
+               talloc_free(mem_ctx);
+               return LDB_ERR_UNWILLING_TO_PERFORM;
+       } else {
+               unsigned int account_type = samdb_uf2atype(user_account_control);
+               ret = samdb_msg_add_uint(module->ldb, msg2, msg2,
+                                        "sAMAccountType",
+                                        account_type);
+               if (ret != LDB_SUCCESS) {
+                       return ret;
+               }
+       }
 
        /* Manage SID allocation, conflicts etc */
        ret = samldb_handle_sid(module, mem_ctx, msg2, dom_dn); 
 
-       /* TODO: objectCategory, userAccountControl, badPwdCount, codePage, countryCode, badPasswordTime, lastLogoff, lastLogon, pwdLastSet, primaryGroupID, accountExpires, logonCount */
+       /* TODO: userAccountControl, badPwdCount, codePage, countryCode, badPasswordTime, lastLogoff, lastLogon, pwdLastSet, primaryGroupID, accountExpires, logonCount */
 
        if (ret == 0) {
                *ret_msg = msg2;
@@ -689,7 +706,7 @@ static int samldb_add(struct ldb_module *module, struct ldb_request *req)
        }
 
        /* is user or computer? */
-       if ((samdb_find_attribute(module->ldb, msg, "objectclass", "user") != NULL) ||
+       if ((samdb_find_attribute(module->ldb, msg, "objectclass", "user") != NULL) || 
            (samdb_find_attribute(module->ldb, msg, "objectclass", "computer") != NULL)) {
                /*  add all relevant missing objects */
                ret = samldb_fill_user_or_computer_object(module, msg, &msg2);
@@ -745,6 +762,53 @@ static int samldb_add(struct ldb_module *module, struct ldb_request *req)
        return ret;
 }
 
+/* modify */
+static int samldb_modify(struct ldb_module *module, struct ldb_request *req)
+{
+       struct ldb_message *msg;
+       struct ldb_message_element *el, *el2;
+       int ret;
+       unsigned int group_type, user_account_control, account_type;
+       if (ldb_msg_find_element(req->op.mod.message, "sAMAccountType") != NULL) {
+               ldb_asprintf_errstring(module->ldb, "sAMAccountType must not be specified");
+               return LDB_ERR_UNWILLING_TO_PERFORM;
+       }
+
+       el = ldb_msg_find_element(req->op.mod.message, "groupType");
+       if (el && el->flags & (LDB_FLAG_MOD_ADD|LDB_FLAG_MOD_REPLACE) && el->num_values == 1) {
+               req->op.mod.message = msg = ldb_msg_copy_shallow(req, req->op.mod.message);
+
+               group_type = strtoul((const char *)el->values[0].data, NULL, 0);
+               account_type =  samdb_gtype2atype(group_type);
+               ret = samdb_msg_add_uint(module->ldb, msg, msg,
+                                        "sAMAccountType",
+                                        account_type);
+               if (ret != LDB_SUCCESS) {
+                       return ret;
+               }
+               el2 = ldb_msg_find_element(msg, "sAMAccountType");
+               el2->flags = LDB_FLAG_MOD_REPLACE;
+       }
+
+       el = ldb_msg_find_element(req->op.mod.message, "userAccountControl");
+       if (el && el->flags & (LDB_FLAG_MOD_ADD|LDB_FLAG_MOD_REPLACE) && el->num_values == 1) {
+               req->op.mod.message = msg = ldb_msg_copy_shallow(req, req->op.mod.message);
+
+               user_account_control = strtoul((const char *)el->values[0].data, NULL, 0);
+               account_type = samdb_uf2atype(user_account_control);
+               ret = samdb_msg_add_uint(module->ldb, msg, msg,
+                                        "sAMAccountType",
+                                        account_type);
+               if (ret != LDB_SUCCESS) {
+                       return ret;
+               }
+               el2 = ldb_msg_find_element(msg, "sAMAccountType");
+               el2->flags = LDB_FLAG_MOD_REPLACE;
+       }
+       return ldb_next_request(module, req);
+}
+
+
 static int samldb_init(struct ldb_module *module)
 {
        return ldb_next_init(module);
@@ -754,4 +818,5 @@ _PUBLIC_ const struct ldb_module_ops ldb_samldb_module_ops = {
        .name          = "samldb",
        .init_context  = samldb_init,
        .add           = samldb_add,
+       .modify        = samldb_modify
 };
index 58669660f4d339b2f8f195b1bc00965a7271919c..503656a9bff00b894e4db98179b72b50e75b7132 100644 (file)
@@ -8,7 +8,6 @@ localPolicyFlags: 0
 primaryGroupID: 516
 accountExpires: 9223372036854775807
 sAMAccountName: ${NETBIOSNAME}$
-sAMAccountType: 805306369
 operatingSystem: Samba
 operatingSystemVersion: 4.0
 dNSHostName: ${DNSNAME}
@@ -33,7 +32,6 @@ description: DNS Service Account
 userAccountControl: 514
 accountExpires: 9223372036854775807
 sAMAccountName: dns
-sAMAccountType: 805306368
 servicePrincipalName: DNS/${DNSDOMAIN}
 isCriticalSystemObject: TRUE
 sambaPassword:: ${DNSPASS_B64}
index fafedc6966925160a9f07d492facf710caee4f09..cc0ab212cdc6c96433e190542c48156784f31753 100644 (file)
@@ -18,7 +18,7 @@ objectClass: container
 description: Container for SAM account templates
 
 dn: CN=TemplateUser,CN=Templates
-userAccountControl: 514
+userAccountControl: 546
 badPwdCount: 0
 codePage: 0
 countryCode: 0
@@ -29,21 +29,6 @@ pwdLastSet: 0
 primaryGroupID: 513
 accountExpires: -1
 logonCount: 0
-sAMAccountType: 805306368
-
-dn: CN=TemplateComputer,CN=Templates
-userAccountControl: 4098
-badPwdCount: 0
-codePage: 0
-countryCode: 0
-badPasswordTime: 0
-lastLogoff: 0
-lastLogon: 0
-pwdLastSet: 0
-primaryGroupID: 513
-accountExpires: -1
-logonCount: 0
-sAMAccountType: 805306369
 
 dn: CN=TemplateTrustingDomain,CN=Templates
 userAccountControl: 2080
@@ -56,18 +41,9 @@ lastLogon: 0
 primaryGroupID: 513
 accountExpires: -1
 logonCount: 0
-sAMAccountType: 805306370
 
 dn: CN=TemplateGroup,CN=Templates
 groupType: -2147483646
-sAMAccountType: 268435456
-
-# Currently this isn't used, we don't have a way to detect it different from an incoming alias
-#
-# dn: CN=TemplateAlias,CN=Templates
-# cn: TemplateAlias
-# groupType: -2147483644
-# sAMAccountType: 268435456
 
 dn: CN=TemplateForeignSecurityPrincipal,CN=Templates
 
index 05fde1597405e2999510f94a3d82db11daee4569..4b053d916635b76451d05b7d18762b69722f774d 100644 (file)
@@ -44,7 +44,6 @@ objectSid: ${DOMAINSID}-502
 adminCount: 1
 accountExpires: 9223372036854775807
 sAMAccountName: krbtgt
-sAMAccountType: 805306368
 servicePrincipalName: kadmin/changepw
 isCriticalSystemObject: TRUE
 sambaPassword:: ${KRBTGTPASS_B64}
@@ -85,7 +84,6 @@ objectClass: group
 cn: Cert Publishers
 description: Members of this group are permitted to publish certificates to the Active Directory
 groupType: 2147483652
-sAMAccountType: 536870912
 objectSid: ${DOMAINSID}-517
 sAMAccountName: Cert Publishers
 isCriticalSystemObject: TRUE
@@ -136,7 +134,6 @@ cn: RAS and IAS Servers
 description: Servers in this group can access remote access properties of users
 objectSid: ${DOMAINSID}-553
 sAMAccountName: RAS and IAS Servers
-sAMAccountType: 536870912
 groupType: 2147483652
 isCriticalSystemObject: TRUE
 
@@ -151,7 +148,6 @@ member: CN=Administrator,CN=Users,${DOMAINDN}
 objectSid: S-1-5-32-544
 adminCount: 1
 sAMAccountName: Administrators
-sAMAccountType: 536870912
 systemFlags: 2348810240
 groupType: 2147483653
 isCriticalSystemObject: TRUE
@@ -188,7 +184,6 @@ description: Users are prevented from making accidental or intentional system-wi
 member: CN=Domain Users,CN=Users,${DOMAINDN}
 objectSid: S-1-5-32-545
 sAMAccountName: Users
-sAMAccountType: 536870912
 systemFlags: 2348810240
 groupType: 2147483653
 isCriticalSystemObject: TRUE
@@ -202,7 +197,6 @@ member: CN=Domain Guests,CN=Users,${DOMAINDN}
 member: CN=Guest,CN=Users,${DOMAINDN}
 objectSid: S-1-5-32-546
 sAMAccountName: Guests
-sAMAccountType: 536870912
 systemFlags: 2348810240
 groupType: 2147483653
 isCriticalSystemObject: TRUE
@@ -215,7 +209,6 @@ description: Members can administer domain printers
 objectSid: S-1-5-32-550
 adminCount: 1
 sAMAccountName: Print Operators
-sAMAccountType: 536870912
 systemFlags: 2348810240
 groupType: 2147483653
 isCriticalSystemObject: TRUE
@@ -231,7 +224,6 @@ description: Backup Operators can override security restrictions for the sole pu
 objectSid: S-1-5-32-551
 adminCount: 1
 sAMAccountName: Backup Operators
-sAMAccountType: 536870912
 systemFlags: 2348810240
 groupType: 2147483653
 isCriticalSystemObject: TRUE
@@ -248,7 +240,6 @@ description: Supports file replication in a domain
 objectSid: S-1-5-32-552
 adminCount: 1
 sAMAccountName: Replicator
-sAMAccountType: 536870912
 systemFlags: 2348810240
 groupType: 2147483653
 isCriticalSystemObject: TRUE
@@ -260,7 +251,6 @@ cn: Remote Desktop Users
 description: Members in this group are granted the right to logon remotely
 objectSid: S-1-5-32-555
 sAMAccountName: Remote Desktop Users
-sAMAccountType: 536870912
 systemFlags: 2348810240
 groupType: 2147483653
 isCriticalSystemObject: TRUE
@@ -272,7 +262,6 @@ cn: Network Configuration Operators
 description: Members in this group can have some administrative privileges to manage configuration of networking features
 objectSid: S-1-5-32-556
 sAMAccountName: Network Configuration Operators
-sAMAccountType: 536870912
 systemFlags: 2348810240
 groupType: 2147483653
 isCriticalSystemObject: TRUE
@@ -284,7 +273,6 @@ cn: Performance Monitor Users
 description: Members of this group have remote access to monitor this computer
 objectSid: S-1-5-32-558
 sAMAccountName: Performance Monitor Users
-sAMAccountType: 536870912
 systemFlags: 2348810240
 groupType: 2147483653
 isCriticalSystemObject: TRUE
@@ -296,7 +284,6 @@ cn: Performance Log Users
 description: Members of this group have remote access to schedule logging of performance counters on this computer
 objectSid: S-1-5-32-559
 sAMAccountName: Performance Log Users
-sAMAccountType: 536870912
 systemFlags: 2348810240
 groupType: 2147483653
 isCriticalSystemObject: TRUE
@@ -309,7 +296,6 @@ description: Members can administer domain servers
 objectSid: S-1-5-32-549
 adminCount: 1
 sAMAccountName: Server Operators
-sAMAccountType: 536870912
 systemFlags: 2348810240
 groupType: 2147483653
 isCriticalSystemObject: TRUE
@@ -328,7 +314,6 @@ description: Members can administer domain user and group accounts
 objectSid: S-1-5-32-548
 adminCount: 1
 sAMAccountName: Account Operators
-sAMAccountType: 536870912
 systemFlags: 2348810240
 groupType: 2147483653
 isCriticalSystemObject: TRUE
@@ -341,7 +326,6 @@ cn: Pre-Windows 2000 Compatible Access
 description: A backward compatibility group which allows read access on all users and groups in the domain
 objectSid: S-1-5-32-554
 sAMAccountName: Pre-Windows 2000 Compatible Access
-sAMAccountType: 536870912
 systemFlags: 2348810240
 groupType: 2147483653
 isCriticalSystemObject: TRUE
@@ -355,7 +339,6 @@ cn: Incoming Forest Trust Builders
 description: Members of this group can create incoming, one-way trusts to this forest
 objectSid: S-1-5-32-557
 sAMAccountName: Incoming Forest Trust Builders
-sAMAccountType: 536870912
 systemFlags: 2348810240
 groupType: 2147483653
 isCriticalSystemObject: TRUE
@@ -367,7 +350,6 @@ cn: Windows Authorization Access Group
 description: Members of this group have access to the computed tokenGroupsGlobalAndUniversal attribute on User objects
 objectSid: S-1-5-32-560
 sAMAccountName: Windows Authorization Access Group
-sAMAccountType: 536870912
 systemFlags: 2348810240
 groupType: 2147483653
 isCriticalSystemObject: TRUE
@@ -379,7 +361,6 @@ cn: Terminal Server License Servers
 description: Terminal Server License Servers
 objectSid: S-1-5-32-561
 sAMAccountName: Terminal Server License Servers
-sAMAccountType: 536870912
 systemFlags: 2348810240
 groupType: 2147483653
 isCriticalSystemObject: TRUE
@@ -391,7 +372,6 @@ cn: Distributed COM Users
 description: Members are allowed to launch, activate and use Distributed COM objects on this machine.
 objectSid: S-1-5-32-562
 sAMAccountName: Distributed COM Users
-sAMAccountType: 536870912
 systemFlags: 2348810240
 groupType: 2147483653
 isCriticalSystemObject: TRUE