Windows PowerShell自动执行用户提供,部件 3

Don Jones

内容

示例环境
创建文件夹
分配权限

在 Windows PowerShell 的这期,我正在选取我离开位置上的个月并继续创建帮助提供在 Active Directory 环境中的新用户的脚本。如果您尚未阅读上一期还,我建议首先然后再继续此阅读该专栏。

此时,我有了主控形状设置包含四个子函数的函数。主函数如下所示:

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

我已经创建了该 CreateUser 函数的变体。 在这期,我将着重 CreateHomeFolder 函数。 我将使用此函数创建用户的主文件夹,并向其中应用适当的访问控制列表 (ACL) 条目。

Windows PowerShell 常见问题

问: Windows PowerShell 区分单引号和双引号周围的字符的字符串?

A 是。 所有保留一个异常单引号和双引号的报价单的行为相同。 这就是这两个这些命令会将字符串"Microsoft"分配给变量 $ var:

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

但是,在双引号仅,外壳程序寻找美元符号 ($) 字符。 如果发现它,则外壳程序假定以下美元符号的这些字符是变量的名称并它将用该变量的内容替换变量假定:

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

在运行这两个命令之后 $var2 将包含"Microsoft Windows"($var1 其内容由替代))。 最佳做法是坚持使用单引号除非您显式需要此可变的替换功能。

示例环境

类似的所有子函数调用,提供函数,CreateHomeFolder 作为其输入都接受哈希表。 由于创建主文件夹仅真正需要知道用户的登录名,我可以使用 [samAccountName] 哈希表项。 我使用此项在上个月的文章,以及,因为 samAccountName 属性是必需创建新的 Active Directory 用户帐户时。

我还需要知道,将创建主文件夹,和我需要对网络访问到该位置。 例如,将假设的用户主文件夹所有存储在上特定服务器根据用户的登录名。 是例如开头 A 到 D 的所有内容位于服务器 HomeFolders1,E 通过 H 的文件夹时 HomeFolders2。 使用此结构,我的示例应该提供一个结构,您可以在您自己的环境中展开到工作。 有关此的讨论我不要考虑的用户的名称以 I 开头到 Z,该模式将明显,并且我想简化该示例,并节省一些空间。

在我的示例环境中每个这些服务器可以有名为 $ 家庭,其中包括所有用户的主文件夹的管理共享。 我假设管理员有权创建新文件夹,并且由管理员运行我的脚本。 最后,我假设所有涉及的服务器都在相同的域,或信任域中,以便它们将信任被用来运行该脚本在管理员帐户。

创建文件夹

创建该文件夹是相对容易一些。 首先,我需要决定哪个服务器我将创建该文件夹在像下面这样:

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

发生因此完全了什么情况此处?

  • 首先中,,我创建的每个主文件夹服务器支持的字母的数组。 例如,我创建两个数组、 $server1 和 $server2,并分配这些的字母我决定在将承载。 此方法便于我在以后更改号的分配以及添加必要的更多的服务器。
  • 然后,我使用开关构造来评估一系列的可能情况。 我将转换为小写字符后评估用户的 samAccountName 属性的第一个字符。
  • 为我有每个主服务器,我向开关构造添加条件。 条件检查该服务器的阵列的字母中是否存在用户的 samAccountName 包含在特殊的 $ _ 变量此时) 的首字母。 如果存在,$ homeserver 变量将用通用命名约定 (UNC) 路径 (该服务器的开始填充。 "中断"关键字防止进一步条件进行计算一旦我发现了正确的服务器。 注意,编写,本示例将不工作的用户名称以字母我到 Z,您将需要添加该区域的条件的字母。

接下来,我只是使用 Windows PowerShell 创建文件夹,因此该函数现在如下所示:

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

MkDir 命令,它是实际一个内置函数,它利用新的 Itemcmdlet) 接受 UNC 路径。 因此我在 $ 家管理共享和用户的 samAccountName 合并正确的主文件夹的服务器名称。 如果用户的 samAccountName DonJ,则 MkDir 将创建 \\server1\$Homes\DonJ。

分配权限

新文件夹将默认,继承其父文件夹的权限。 因此例如,我假设父文件夹具有适当的基本权限将要分配给任何新的用户主文件夹。 是例如该权限可能分配完全控制,该内置系统帐户以及 Domain Admins 组或在本地的管理员组但是该权限可能会不包含任何其他用户。 因此我需要做现在是确保我的新用户帐户具有刚创建的主目录的权限。

现在,不获取请 Mad,但我不得不说这不是当前适合 Windows PowerShell 是一个任务。 我知道,我抱歉。 就只是 Windows 文件权限的 terrifically 复杂的小大块头。 您具有访问控制列表 (ACL),其中包含访问控制项 (ACE)。 每个 ACE 结合一个允许 / 拒绝标志、 权限 (如读取或写入) 和 (如用户或组) 的安全主体的 GUID。 这是信息的许多协同工作。

外壳程序确实提供了 get ACL 和组的 ACL 的 Cmdlet 但修改 ACL 需要您获取 ACL,解决影响与 Microsoft.NET Framework 对象修改 ACL,然后放置回文件或文件夹已修改的 ACL。 就有点过低级的我的人。 我可能可以使用 Windows Management Instrumentation (WMI),但的工作方式几乎相同。

幸运的是,Microsoft 已换到方便、 易于使用工具,称为该我敢打赌周围永远已经为您熟悉的 Cacls.exe 复杂性很多最。 使用它将不仅保存我一些不必要的工作但还将演示 Windows PowerShell 工作原理非常好用 (cacls、 ping、 ipconfig,等) 的外部命令行工具。 如果已经知道如何使用这些工具之一请保留中使用 Windows PowerShell。 使用 Windows PowerShell 最重要的概念之一就是您不必 relearn 从零开始的所有内容。

(顺便,我知道 Cacls.exe 被否决。 它只一个稍微简单语法有比替换 ICacls.exe,因此我使用。 您可以调整此如果您喜欢使用 ICacls.exe)。

我将帮助文件的 Cacls.exe,发现我需要类似的命令:

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

这将分配读取并写入我们新的用户权限不覆盖在其他已在文件夹的权限。

一个问题,但是,是我需要使用此命令,(而不是静态值的变量。 外壳程序变量置于外部命令可以是棘手有时。 有多种方法,但我的一是创建在外壳程序变量的整个命令字符串,然后执行该字符串中使用 Cmd.exe。 其如下所示:

$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

授予,将这可能不是世界上,最别致的事情,但它获得完成任务。 此外实现了我 ulterior Motive 的演示方式复杂的外部命令行工具可以参数化使用外壳程序的变量。 我可以到我的函数删除这四行代码,MkDir 命令后,然后该函数是完成。

所有我已保留为此时是我主机提供函数中创建最后两个函数: AddToGroups 和 UpdateAttributes。 我将介绍如何在 Windows PowerShell 列的下一期操作的。

Don Jones 是集中的技术 (的创始人 ConcentratedTech.com),在每周有关 Windows PowerShell,SQL Server,App V 他博客以及其他主题。 通过他的网站与他联系。