O Windows PowerShellAutomatizando o usuário de configuração, parte 3

Don Jones

Conteúdo

O ambiente de exemplo
Criar a pasta
Atribuindo permissões

Nesta edição do Windows PowerShell, SOU separação de onde eu parou no mês passado e continuar a criar um script que ajuda a configurar novos usuários no ambiente do Active Directory.Se você ainda não leu a edição anterior ainda, recomendo que você leia essa coluna primeiro antes de continuar aqui.

Neste ponto, tem um mestre de configuração função que contém quatro funções de sub-rotina.A função de mestre tem esta aparência:

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

Já criei variações da função de CreateUser. Nesta edição, eu estou enfocando a função CreateHomeFolder. VOU usar esta função para criar a pasta base do usuário e aplicar as entradas de ACL (lista) de controle de acesso apropriados para ele.

O Windows PowerShell perguntas e respostas

P O Windows PowerShell faz distinção entre aspas simples e aspas duplas ao redor de seqüências de caracteres?

A Sim. Com apenas uma exceção, o única e duplas cotações tenham comportamento idêntico. Ou seja, ambos esses comandos irão atribuir a seqüência "Microsoft" como a variável $ var:

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

No entanto, entre aspas duplas somente, o shell procura o caractere de cifrão ($). Se ele encontrá-lo, o shell pressupõe que os caracteres após o sinal de cifrão são um nome de variável, e ele substituirá a variável com o conteúdo da variável:

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

Depois de executar esses dois comandos, $var2 conteria "Microsoft Windows" ($var1 foi substituído com o seu conteúdo). Como prática recomendada, fique com aspas simples a menos que seja explicitamente necessário esse recurso de substituição de variável.

O ambiente de exemplo

Como todas as funções filho chamadas pela função criar, CreateHomeFolder está aceitando um hashtable como sua entrada. Como criar uma pasta base somente realmente exige eu souber nome de logon do usuário, POSSO usar a chave de hashtable ['samaccountname']. Eu usei essa chave no artigo do mês passado, além disso, como o atributo samAccountName é necessário ao criar uma nova conta de usuário do Active Directory.

Também preciso saber onde a pasta base será criada e preciso ter acesso de rede para esse local. Neste exemplo, assumirá que pastas base do usuário são todos armazenadas em um específico servidor, com base no nome de logon do usuário. Por exemplo, tudo o que começa com À D está em servidor HomeFolders1, embora sejam pastas para E a H em HomeFolders2. Usando essa estrutura, meu exemplo deve fornecer uma estrutura que você pode expandir para trabalho em seu próprio ambiente. Para esta discussão, não vou preocupar com os usuários cujos nomes começam com I a Z, o padrão será evidente e I ' d like to manter o exemplo simples e conservar espaço.

No meu ambiente de exemplo, cada um desses servidores tem um compartilhamento administrativo chamado $ casas, que inclui todas as pastas base do usuário. E presumo que os administradores têm a capacidade de criar novas pastas e que o meu script é que está sendo executado por um administrador. Finalmente, considerarei que todos os servidores envolvidos no mesmo domínio ou estão em confiar em domínios, para que eles confiará a conta de administrador que está sendo usada para executar o script.

Criar a pasta

Criar a pasta é relativamente fácil. Primeiro, precisará decidir qual servidor criará a pasta, assim:

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; }
  }
}

Portanto, o que exatamente está acontecendo aqui?

  • Primeiro, cria uma matriz de letras que ofereça suporte a cada servidor de pasta base. Neste exemplo, eu criou duas matrizes, $server1 e $server2 e atribuídos a eles as letras que decidi que irão hospedar. Essa abordagem torna mais fácil para mim para alterar as atribuições de letra no futuro, bem como para adicionar mais servidores se necessário.
  • , Em seguida, use a construção de alternar para avaliar uma série de condições possíveis. Eu avaliar o primeiro caractere do atributo de samAccountName do usuário, após converter o caractere em minúsculas.
  • Para cada servidor de base que tenho, eu adicionar uma condição para a construção de opção. A condição verifica se a primeira letra de samAccountName do usuário (que está contida na variável especial $ _ neste momento) existe na matriz do servidor de letras. Em caso afirmativo, em seguida, a variável de homeserver $ é preenchida com o início de um caminho UNC (convenção de nomenclatura universal) para esse servidor. A palavra-chave "interrupção" impede mais condições sendo avaliada quando eu encontrei o servidor correto. Observe que, como escrito, este exemplo não funcionarão para os usuários cujos nomes começam com letras I a Z, você precisará adicionar condições para esse intervalo de letras.

Em seguida, eu simplesmente ter Windows PowerShell criar a pasta, para que a função agora esta aparência:

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'])
}

O comando MkDir — que é realmente uma função interna que utiliza o New-Itemcmdlet — aceita caminhos UNC. Portanto, eu estou combinar o nome do servidor pasta base correta com o $ casas administrativas compartilham e samAccountName do usuário. Se samAccountName o usuário for DonJ, MkDir criará \\server1\$Homes\DonJ.

Atribuindo permissões

A nova pasta será, por padrão, herdam as permissões da sua pasta pai. Portanto, para que este exemplo, presumo que a pasta pai tenha as permissões de base adequadas que eu poderia deseja atribuir para qualquer nova pasta base do usuário. Por exemplo, essa permissão pode atribuir controle total para a conta interna do sistema, bem como a grupo Admins. do domínio ou o grupo de administradores local, mas essa permissão provavelmente não inclui nenhum outro usuário. Portanto, tudo o que preciso fazer agora é Verifique se minha nova conta de usuário tem permissões para o diretório base que acabou de criar.

Agora, por favor, não obter mad, mas preciso dizer que esse não é uma tarefa para o qual o Windows PowerShell é no momento adequado. Eu sei, estou sinto muito. É apenas que permissões de arquivo do Windows são terrifically complicado e pouco. Você tem uma lista de controle de acesso (ACL), que contém entradas de controle de acesso (ACEs). Cada ACE combina um sinalizador de permitir/negar, as permissões (como leitura ou gravação) e o GUID de um objeto de segurança (como, por exemplo, um usuário ou grupo). Isso é muito de informações que tem que trabalhar juntos.

O shell oferece cmdlets Get-ACL e Set-ACL, mas modificar uma ACL requer que você obter a ACL, estragar ao redor com objetos do Microsoft .NET Framework para modificar a ACL e, em seguida, solte a ACL modificada volta para o arquivo ou pasta. É um pouco muito baixo nível para minhas preferências. Potencialmente pode usar de WMI, mas que deve trabalhar praticamente da mesma maneira.

Felizmente, a Microsoft tem empacotada backup muita essa complexidade para uma ferramenta conveniente, mais fácil de usar chamada cacls.exe, que aposto que você está familiarizado, como ele foi ao redor para sempre. Usá-lo não só salvará me algum esforço desnecessário, mas também demonstrará como o Windows PowerShell funciona perfeitamente bem com ferramentas de linha de comando externas (cacls, ping, ipconfig e assim por diante). Se você já souber como usar uma dessas ferramentas, por favor, continue a usá-lo no Windows PowerShell. Um dos mais importantes conceitos com o Windows PowerShell é que você não precisa que reaprender tudo desde o início.

(A propósito, sei que cacls.exe é preterido. Ele apenas tem uma sintaxe um pouco mais simples que a substituição ICacls.exe, portanto, ESTOU usando ela. Você pode ajustar esta opção para usar ICacls.exe se desejar.)

Vai pelo arquivo de ajuda para o cacls.exe, acho que preciso de um comando que é semelhante esta:

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

Isso atribuirá permissões de leitura e gravação a nosso novo usuário, sem substituir as outras permissões já na pasta.

Um problema, no entanto, é que desejo usar variáveis nesse comando, em vez de valores estáticos. Colocar as variáveis de shell em comandos externos pode ser complicado às vezes. Há várias abordagens, mas que gosto é criar a seqüência de comando inteiro em uma variável de shell e, em seguida, usar o cmd.exe para executar essa seqüência. Ele fica assim:

$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

Concedido, isso não pode ser a coisa prettiest no mundo, mas ele obtém o trabalho feito. Ele também realiza meu motive ulterior de demonstrating ferramentas de linha de comando externas como complexas podem ser parametrizadas usando variáveis de shell. Pode soltar estas quatro linhas de código diretamente no minha função após o comando MkDir e a função é concluída.

Neste momento todos deixei para fazer é criar as duas últimas funções em minha função de mestre de criar: AddToGroups e UpdateAttributes. VOU mostrar como fazer isso na próxima edição da coluna do Windows PowerShell.

Don Jones é co-fundador da tecnologia concentrou ( ConcentratedTech.com), onde blogs he semanais sobre aplicativos do Windows PowerShell, SQL Server,-V e outros tópicos. Entrar em contato com ele através de seu site.