smb.conf:

[homes]
  ...
  root preexec = /users/.create_home.sh '%S'

I lost the one that I was using. -- CyberLeo

createhome.sh:

#!/bin/sh -e

pebkac() {
  echo "Usage: $(basename "${0}") <username>" >&2
  echo "" >&2
  echo "Create the zfs home directories for the given user if they do not exist." >&2
  exit 1
}

fsbase="$(realpath "$(dirname "${0}")")"
zpbase="$(mount | grep ' on '"${fsbase}"' ' | cut -d' ' -f1)"

user="${1}"
[ "${user}" ] || pebkac

zpuser="${zpbase}/${user}"
fsuser="${fsbase}/${user}"

[ ! -e "${fsuser}" ] || exit 0

fspublic="${fsuser}/Public"
fsprivate="${fsuser}/Private"
fsdropbox="${fsuser}/DropBox"
fsrecycle="${fsuser}/.recycle"

zfs create "${zpuser}"
mkdir -p "${fspublic}"
chmod 755 "${fspublic}"
mkdir -p "${fsprivate}"
chmod 700 "${fsprivate}"
mkdir -p "${fsdropbox}"
chmod 1777 "${fsdropbox}"
mkdir -p "${fsrecycle}"
chmod 777 "${fsrecycle}"
chown -R "${user}" "${fsuser}"