Windows PowerShell Automatización de usuario de aprovisionamiento, parte 3

Don Jones

Contenido

El entorno de ejemplo
Crear la carpeta
Asignación de permisos

En esta entrega de Windows PowerShell, SOY recoge donde dejó el mes pasado y continuar crear una secuencia de comandos que ayuda a crear nuevos usuarios en un entorno de Active Directory. Si aún no lee la entrega anterior todavía, se recomienda que lea primero esa columna antes de continuar aquí.

En este momento, tiene un patrón aprovisionamiento de función que contiene cuatro funciones sub. La función principal es similar a ésta:

Function Provision {
  PROCESS {
    CreateUser $_
    CreateHomeFolder $_
    AddToGroups $_
    UpdateAttributes $_
  }
}

Ya han creado las variaciones de la función CreateUser. En esta entrega, estoy centra en la función CreateHomeFolder. VOY a utilizar esta función para crear la carpeta del usuario principal y aplicar las entradas de lista (ACL) de control de acceso adecuado a ella.

Windows PowerShell preguntas y respuestas

P ¿Windows PowerShell distinguir entre comillas simples y comillas dobles en cadenas de caracteres?

A Sí. Con todo excepto una excepción, comillas sencillas y dobles comportan de forma idéntica. Es decir, de estos comandos se asignan la cadena "Microsoft" a la variable $ var:

$var = 'Microsoft'
$var = "Microsoft"

Sin embargo, comillas dobles sólo, el shell busca el carácter de signo de dólar ($). Si encuentra, el shell se supone que los caracteres siguientes el signo de dólar están un nombre de variable y sustituirá la variable con contenido de esa variable:

$var1 = 'Windows'
$var2 = "Microsoft $var1"

Después de ejecutar estos dos comandos, $var2 contendría sobre Microsoft Windows $var1 se reemplazó con su contenido. Como práctica recomendada, cumplir con comillas simples a menos que necesite explícitamente esta característica de reemplazo de la variable.

El entorno de ejemplo

Al igual que todas las funciones secundario llama a la función de provisión, CreateHomeFolder está aceptando una tabla hash como su entrada. Puesto que la creación de una carpeta particular realmente sólo requiere me saber nombre de inicio de sesión del usuario, puede utilizar la clave de la tabla hash ["sAMAccountName"]. Esta clave utiliza en el artículo del mes último, además, puesto que el atributo samAccountName es necesario al crear una nueva cuenta de usuario de Active Directory.

También necesito saber dónde se creará la carpeta particular, y se necesita para tener acceso a la red a esa ubicación. En este ejemplo, supondrá que carpetas particulares de usuario están todos los almacenados en un específico servidor, según el nombre de inicio de sesión del usuario. Por ejemplo, todo empezando A D es en el servidor HomeFolders1, mientras que las carpetas de E a H son en HomeFolders2. Mediante esta estructura, mi ejemplo debe proporcionar una estructura que se puede expandir en trabajo en el entorno. Para esta explicación, no voy a preocuparse por los usuarios cuyo nombre comience con I a la Z, el patrón será evidente y me gustaría mantener simple en el ejemplo se y ahorrar espacio.

En el entorno de ejemplo, cada uno de estos servidores tiene un recurso compartido administrativo denominado $ Holmes, que incluye todas las carpetas principales de usuario. Y he supuesto que los administradores tienen la capacidad para crear nuevas carpetas y que se se ejecuta mi secuencia de comandos por un administrador. Por último, le asumir que todos los servidores implicados están en el mismo dominio, o sean de confianza en dominios, para que se confían en la cuenta de administrador que se se utiliza para ejecutar la secuencia de comandos.

Crear la carpeta

Crear la carpeta es relativamente fácil. Primero, necesito decidir qué servidor creará la carpeta, así:

Function CreateHomeFolder {
  Param($userinfo)
  $server1 = 'a','b','c','d'
  $server2 = 'e','f','g','h'
  Switch ($userinfo['samAccountName'].    substring(0,1).tolower()) {
    { $server1 –contains $_ } 
      { $homeserver = '\\homeserver1\'; break; }
    { $server2 –contains $_ } 
      { $homeserver = '\\homeserver2\'; break; }
  }
}

¿Por lo que lo exactamente está sucediendo aquí?

  • En primer lugar, crear una matriz de letras que admite cada servidor carpeta particular. En este ejemplo, ha creado dos matrices, $server1 y $server2 y les asigna las letras que ha decidido que se host. Este enfoque facilita para mí a cambiar las asignaciones de letras en el futuro, así como para agregar más servidores si es necesario.
  • A continuación, utilizo la construcción de cambiar para evaluar una serie de condiciones posibles. El primer carácter del atributo samAccountName del usuario, evalúe después de convertir el carácter a minúsculas.
  • Para cada servidor principal que tienen, agregue una condición a la construcción de cambiar. La condición comprueba si la primera letra de samAccountName del usuario (que se encuentra en la variable especial $ _ en este punto) existe en la matriz de ese servidor de letras. Si existe, a continuación, la variable de homeserver $ se rellena con el principio de una ruta de convención de nomenclatura universal (UNC) para ese servidor. La palabra clave "salto" impide aún más las condiciones se evalúa una vez ha encontrado el servidor correcto. Tenga en cuenta que, tal como está escrita, este ejemplo no funcionará para los usuarios cuyos nombres empiezan con letras a Z, tendrá que agregar condiciones de ese intervalo de letras.

A continuación, sólo tengo Windows PowerShell a crear la carpeta, por lo que la función Ahora este aspecto:

Function CreateHomeFolder {
  Param($userinfo)
  $server1 = 'a','b','c','d'
  $server2 = 'e','f','g','h'
  Switch ($userinfo['samAccountName'].
    substring(0,1).tolower()) {
    { $server1 –contains $_ } 
      { $homeserver = '\\homeserver1\'; break; }
    { $server2 –contains $_ } 
      { $homeserver = '\\homeserver2\'; break; }
  }
  Mkdir ($homeserver + '\$Homes\' + $userinfo['samAccountName'])
}

El comando MkDir, que es realmente una función integrada que utiliza el nuevo de Itemcmdlet, acepta rutas de acceso UNC. Por lo que me combinar el nombre correcto carpeta particular del servidor con el $ compartan Holmes administrativas y samAccountName del usuario. Si samAccountName el usuario es DonJ, a continuación, MkDir creará \\server1\$Homes\DonJ.

Asignación de permisos

La nueva carpeta se, de forma predeterminada, de los permisos de su carpeta primaria hereda. Por lo que en este ejemplo, supongo que la carpeta principal tiene los permisos de base adecuados que se desea asignar a cualquier carpeta principal de usuario nueva. Por ejemplo, ese permiso puede asignar control total a la cuenta del sistema integrada, así como al grupo de administradores de dominio o grupo de administradores locales, pero ese permiso probablemente no incluiría los otros usuarios. Por lo que todo lo necesita hacer ahora es asegúrese de que la nueva cuenta de usuario tiene permisos para el directorio principal que recién creado.

Ahora, por favor, no obtener mad, pero hay que decir que esto no es una tarea para el que Windows PowerShell es está totalmente indicada. Sé, siento. Es sólo que permisos de archivo de Windows son bestias poco terrifically complicados. Tiene una lista de control de acceso (ACL), que contiene entradas de control de acceso (ACE). Cada ACE combina un indicador de permitir o denegar, permisos (such as lectura o escritura) y el GUID de un principal de seguridad (como, por ejemplo, un usuario o grupo). Esto es una gran cantidad de información que tiene que trabajar juntos.

El shell ofrece cmdlets ACL-Get y Set-ACL, pero la modificación de una lista de control de acceso (ACL) requiere que se obtenga la lista de control de acceso (ACL), estropear alrededor con objetos de Microsoft .NET Framework para modificar la lista de control de acceso (ACL) y, a continuación, suelte la ACL volver hasta el archivo o carpeta modificada. Es un poco demasiado bajo nivel para mis tastes. Podría utilizar potencialmente Instrumental de administración de Windows (WMI), pero que podría funcionan prácticamente del mismo modo.

Afortunadamente, Microsoft se incluye una gran cantidad de esa complejidad en una herramienta cómoda, más fácil de utilizar denominada cacls.exe, que está familiarizado con, como ha sido alrededor cómoda seguro. Usando no se sólo guardar me algunos esfuerzo innecesario, pero también se demostrar cómo en que Windows PowerShell funciona perfectamente con herramientas de línea de comandos externas (CACLS, ping, ipconfig etc.). Si ya sabe cómo utilizar una de estas herramientas, por favor, mantener utilizando, en Windows PowerShell. Uno de los conceptos más importantes con Windows PowerShell es que no es necesario relearn todo: desde cero.

(Por cierto, sé que cacls.exe es obsoleta. Sólo tiene una sintaxis un poco más sencilla que el reemplazo ICacls.exe, por lo que ESTOY utilizando. Se puede ajustar esta opción para usar ICacls.exe si lo desea.)

ENTRAR en el archivo de ayuda para cacls.exe, encuentro que se necesita un comando que es similar:

cacls \\server1\homes\DonJ /e /g DOMAIN\DonJ:R
cacls \\server1\homes\DonJ /e /g DOMAIN\DonJ:W

Esto asignará los permisos de lectura y escritura a nuestro nuevo usuario, sin sobrescribir los demás permisos ya en la carpeta.

Un problema, sin embargo, es que va a utilizar las variables en este comando, en lugar de valores estáticos. Poner las variables de shell en comandos externos puede ser problemático a veces. Hay una serie de métodos, pero el uno que me gusta es crear la cadena de comando completo en una variable de shell y, a continuación, utilizar (Cmd.exe) para ejecutar dicha cadena. Es similar a ésta:

$cacls1 = "cacls "+$homeserver+"$Homes\"
  +$userinfo['samAccountName']+" /E /G "
  +$user+":W"
$cacls2 = "cacls "+$homeserver+"$Homes\"
  +$userinfo['samAccountName']+" /E /G "
  +$user+":W"
cmd /c $cacls1
cmd /c $cacls2

De acuerdo, esto no sea lo bonito del mundo, pero se obtiene el trabajo realizado. También realiza Mi segunda motivo de que se pueden parametrizar demonstrating herramientas de línea de comandos externas Cómo de compleja con variables de shell. Pueden colocar estas cuatro líneas de código hacia la derecha en mi función después del comando MkDir y la función está completa.

Todos los han dejado que en este momento es crear las últimos dos funciones en mi función principal de provisión: AddToGroups y UpdateAttributes. Le mostrarán cómo hacerlo en la entrega siguiente de la columna de Windows PowerShell.

Don Jones es cofundador de (concentró Technology ConcentratedTech.com), donde blogs semanales sobre Windows PowerShell, SQL Server, app-V y otros temas. Póngase en contacto con él a través de su sitio Web.