尽管您可以通过以文本方式键入命令与 Windows PowerShell 进行交互,但 Windows PowerShell 是基于对象的,而不是基于文本的。命令的输出即为对象。可以将输出对象发送给另一条命令以作为其输入。因此,Windows PowerShell 为曾使用过其他外壳程序的人员提供了熟悉的界面,同时引入了新的、功能强大的命令行范例。通过允许发送对象(而不是文本),它扩展了在命令之间发送数据的概念。
易于过渡到脚本
使用 Windows PowerShell,您可以很方便地从以交互方式键入命令过渡到创建和运行脚本。您可以在 Windows PowerShell命令提示符下键入命令以找到可执行任务的命令。随后,可将这些命令保存到脚本或历史记录中,然后将其复制到文件中以用作脚本。
有两种连接WMI服务的方法:l 使用Get-WmiObject可以很容易地连接到WMI服务,并且获取WMI对象。 l 使用一个COM对象,“WbemScripting.SWbemLocator”,可以连接WMI的服务。SWbemLocator对象只有一个方法,就是ConnectServer()。该方法接受5个参数:用户名,密码,语言代码,验证方法(Kerberos, NTLM等),标志(超时值)。
下例中,我们使用New-Object命令,创建了一个“WbemScripting.SWbemLocator”的实例。然后用这个实例的ConnectServer方法连接了到了一个WMI的名字空间(rootcimv2),ConnectServer方法返回了一个WMIService对象,接着又用这个对象的subClassesOf()方法,返回了一系列WMI的CLASS: $strComputer = "." $wmiNS = "
ootcimv2" $strUsr ="" #Blank for current security. DomainUsername $strPWD = "" #Blank for current security. $strLocl = "MS_409" #US English. Can leave blank for current language $strAuth = "" #if specify domain in strUsr this must be blank $iFlag = "0" #only two values allowed: 0 and 128. $objLocator = New-Object -comobject "WbemScripting.SWbemLocator" $objWMIService = $objLocator.ConnectServer($strComputer, ` $wmiNS, $strUsr, $strPWD, $strLocl, $strAuth, $iFLag) $colItems = $objWMIService.subClassesOf() Write-Host "There are: " $colItems.count " classes in $wmiNS" foreach ($objItem In $colItems) { $objItem.path_.class }
本质上,PowerShell新的工作流构建能写入与功能类似的东西,使用PowerShell翻译命令和脚本代码到Windows工作流技术WWF进程中。WWF然后能管理整个任务,包括修复网络故障与重启计算机等。它是编排长期运行的、复杂的、多步骤任务的更有效更可靠的一种方式。如果这个功能与下一个版本的System Center Orchestrator集成。
Windows Power Shell在用户管理和维护Windows方面是一个强大的命令行环境。虽然Windows Power Shell是一个本地管理工具,但是它也用于管理远程服务器。事实上,管理员可以针对大量的服务器创建Windows Power Shell脚本来执行管理任务。Invoke-Command和New-PSSession都是在远程服务器中Windows Power Shell的执行命令。
Invoke-Command
如果你只需要针对单台或者多台远程v服务器执行一个Windows Power Shell命令(或者一系列的管道命令),那么最便利的方法就是Windows Power Shell使用Invoke-Command命令。Microsoft的文档列出了绝大多数的参数和语法,导致人人皆知Invoke-Command命令的复杂性。即使如此,使用Invoke-Command在远程系统上执行Windows Power Shell命令仍然出奇地容易。
对于基本的Windows Power Shell远程命令执行,你只需要提供远程计算机的名称和想要执行的代码块。假设你想要在名称为Production1的远程服务器上执行Get-VM命令,你可以使用下面的Windows Power Shell命令:
第二点,你必须要知道虽然这个方式的设计目的只是简单地在单个远程系统上运行的单一Windows Power Shell命令,但是你也可以运行多个Windows Power Shell命令。如果查看之前的Windows Power Shell几行代码,你会注意到允许在远程计算机上运行的Get-VM命令是包含在花括号里面的。任何在花括号里面的Windows Power Shell命令都会在指定的远程计算机行运行。同样的,只要所有的Windows Power Shell命令都包含在花括号里面,你可以使用管道符号把Windows Power Shell命令把它们链接在一起。
第三点你必须知道上面的Windows Power Shell语法只有在所有计算机中使用了Kerberos认证才会运行,同时包括有命令输入和已经加入了域。否则,你必须使用HTTPS传输,并且必须指定远程系统是受信任的主机。
New-PSSession
New-PSSession通常用于在远程系统上执行Windows Power Shell命令。Invoke-Command命令设计于用于在远程系统上执行单一Windows Power Shell命令(或者一连串的Windows Power Shell命令),而New-PSSession实际上是用于在远程服务器上重定向PowerShell。实质上,你输入的任何Windows Power Shell命令都会自动发送到远程机器上运行。
这个命令如此简易,它只要求提供远程计算机的名称。例如,如果你想和名为Production1的计算机建立一个会话,你可以使用以下Windows Power Shell命令:
New-PSSession –ComputerName Production1
这个Windows Power Shell命令会与指定的计算机建立会话,但是它不会自动重定向任何你在远程计算机输入的执行PowerShell命令;原因是Microsoft并不限制你只使用一个远程会话。你可能需要和多个不同的服务器建立回话。因此,输入上述命令建立一个Windows Power Shell会话,PowerShell会提供确认的会话,也会罗列出一个会话ID号,但仅此而已。
如果你想要使用远程会话,那么你将不得不使用另一个名为 Enter-PSSession的Windows Power Shell,只是简单地附件上你想连接到会话ID号即可。例如,如果有一个连接到Production1,且会话ID为列名1的New-PSSession会话,你就可以输入一下命令来连接这个会话:
Enter-PSSession 1
当你在使用这个Windows Power Shell命令时,PowerShell会提示你为这个远程程系统更改一个相关的名称,这样你就可以很轻松地跟踪你正在发送命令的系统了。
现在,可以看到所有想停止的Windows Power Shell会话。接下来,只需要杀死这些Windows Power Shell会话。要做到这一点,要知道PSTerminalServices模块提供了Stop-TSSession cmdlet,可以帮你杀死Windows Power Shell会话(图4)。
Stop-TSSession cmdlet结束Windows Power Shell会话后可能会导致最终用户丢失工作内容,因此会提示管理员。这里可以点击“A”继续下一步,但有时管理员不喜欢弹出Windows Power Shell提示信息。如果将这些放在一个更大的Windows Power Shell脚本中,提示将中断Windows Power Shell脚本。最好的办法是省略提示。
Stop-TSSession cmdlet有一个通用的Windows Power Shell参数,叫做–Force,Windows Power Shell允许管理员执行操作时没有任何确认信息打扰。
对于使用Windows Power Shell及以上版本的大型微软应用软件环境下的系统管理员,很有可能日常都会面临管理Windows Power Shell角色管理的问题。Windows Power Shell服务器允许管理员通过点击功能窗口按钮来增加、删除或修改系统角色和功能,但是点击功能窗口大部份操作对于管理员来说不是自动完成的。这就是Windows Power Shell发挥作用的地方。
Windows Power Shell服务管理器是一个单独创建的用于管理服务器标识和系统信息的图形化用户界面(GUI)区域。Windows Power Shell通过管理接口允许管理员针对某个服务,Windows Power Shell通过点击功能键执行各种工作。虽然这种方法适合用于小规模的应用环境,但Windows Power Shell不适合大规模集群下的应用环境。通过Windows Power Shell命令行的方式就以简化这些操作。
Windows Power Shell有一个叫“ServFerManager”的模块,它包含了许多可以帮助管理系统角色和功能的命令(图1)。
当不加参数地使用“Gevt-Windows Feature”命令,Windows Power Shell会输出系统中所有的系统角色和功能—不论现在Windows Power Shell是否在系统中安装。图2展示了在测试系统中的一些可用的功能。
图2. 以“Get-Windows Feature”命令的一些选项为例
Windows Power Shell对于现在系统中已经安装系统功能,可以使用“Where-Object”命令查看(图3)。
图3. Where-Object命令输出测试系统已安装的功能
如果想安装一个新的Windows Power Shell系统功能,应怎样做呢?可以使用“Install-Windows Feature”命令。例如想在我的本地服务器上安装SNMP服务,我可以使用“Install-Windows Feature”命令并且加上名字参数。如图5表示Windows Power Shell功能服务已安装完成。
图4. SNMP服务功能已安装完成
可以使用“Remove-Windows Feature”命令来删除某些Windows Power Shell系统功能。删除Windows Power Shell系统功能就像安装Windows Power Shell某个功能一样容易,即加上命令的Name参数就行。
图5. 使用“Remove-Windows Feature”命令删除Windows Power Shell系统下的某个功能
在图形化界面操作时需注意必须重启Windows Power Shell服务器才能完成删除某个系统功能。如果使用Windows Power Shell命令脚本的方式,可以不通过手动操作完成。“Install-Windows Feature”和“Remove-W?indows Feature”命令都有“remove”参数。如果有必要,Windows Power Shell可以执行完命令后自动重启服务器。
如果只有一台单独的Windows Power Shell服务器,本地化操作没有问题,但是可以通过使用Windows Power Shell服务管理器以相似的方式对多台Windows Power Shell服务器进行操作管理。使用Windows Power Shell远程管理功能,管理员可以使用“Computername”参数指定对远程任一个服务器进行操作,如图6:
图6. 使用ComputerName参数用于指定执行任务的远程服务器
如果想同时在100台Windows Power Shell服务器上安装一个Windows Power Shell系统功能应该怎样操作呢?如果把服务器信息写入一个文本文件中后,这就不是问题。如果在服务端有一个包含了Windows Power Shell服务器名字CSV文件,可以使用Windows Power Shell import命令来读取csv文件内容并且可以并发执行任何对Windows Power Shell系统功能的操作命令。
在Windows Power Shell受攻击面方面,IT安全专家经常谈论的话题是Windows Power Shell服务器和应用程序。尽管Windows Power Shell的大部分安全工作都是为了强化操作系统和应用程序以减少可能的受攻击面,但是有可能IT员工自己本身会成为受攻击面。
很多Windows Power Shell网络攻击利用了恶意软件来获取受害者系统的访问权限。像很多其他的软件一样,Windows Power Shell恶意软件也会受限于当前的安全环境。比如说,一个拥用基本Windows Power Shell用户权限的用户不小心运行了一个恶意软件会比一个管理员运行这个恶意软件带来的损坏小得多。
IT专家长期接受移除管理员Windows Power Shell权限来提高安全性的方法,但是剥夺所有IT员工的管理员Windows Power Shell权限并不是一个实用的方法。IT员工一定要有相应必需的Win~!dows Power Shell权限来执行他们的工作。
这就是需要用到Just Enough Administration的地方了。Just Enough Administration( JEA) 是一个Windows Power Shell工具包来帮助企业组织限制管理员权限,以提供自身Windows Power Shell整体安全性。
JEA是一种基于角色的访问控制形式。主要的方法是精确地授予IT员工他们工作必需的Windows Power Shell权限,不多也不少。即使如此,JEA也和传统的基于Windows Power Shell身份的访问控制不一样,传统的访问控制是基于一份详尽的权限集合夊?!—!。而相比之下,JEA是基于限制某个用户能运行的Windows Power Shell然后限制用户以管理员的身份连接目标服务器。
这就引出了一个Windows Power Shell问题,即一个标准用户如何在没有Windows Power Shell权限的情况下去执行Windows Power Shell任务呢?理解它工作原理的关键在于,要意识到用户从来不会直接登陆服务器控制台。用户会登录进一个标准的工作站,然后使用JEA PowerShell工具包与被管理的Windows Power Shell服务器建立远程会话。用户登陆的时候会使用自己被限制的Windows Power Shell账号密码,但操作的时候会利用Run As账户来执行任何需要Windows Power Shell更高权限的操作。
从表面上看,如果使用Run As账户这种方式并不会比直接给用户账号授予Windows Power Shell权限更好。但是这两种账号之间有非常重要的区别:一个被赋予Windows Power Shell权限的用户账号基本上算是一个域管理员。使用JEA 的Run As账户是被管理服务器本地的。这个账户不会有域管理权限,这也意味着这个用户不能通过网络进行Windows Power Shell管理员授权的传递。
Just Enough Administration PowerShell工具包不仅仅依赖对用户账号的创新使用来提高安全性,它同时也限制了用户允许执行的Windows Power Shell。这可以保证用户可以运行他工作需要的cmdlets,但是不会有额外的cmdlets。
Just Enough Administration包含了创建一个到被Windows Power Shell管理服务器的远程会话。Windows Power Shell远程会话可以通过会话配置文件或者脚本来进行限制。Just Enough Administration工具包运行允许这些限制以简单的文本文件来配置,这可以控制Windows Power Shell用户被授权运行哪些PowerShell cmdlets。Just Enough Administration工具包同时也可以被设置执行审计的功能。那样的话,如果一个Windows Power Shell用户尝试非授权的行为,这个行为会被阻止并且记录下来以待查看。
Just Enough Administration工具包可以很大程度上地提供企业内部的安全性,Windows Power Shell用户只能执行某些设置好的管理员任务。使用这个工具集的最大缺点是它是面向Windows Power Shell的。Windows Power Shell可以作为一款管理工具来使用,但是使用它需要用户进行一定时间的学习。 [8]
Windows Power Shell期望状态配置(DSC)是2013年下半年发布的Windows 8.1和Windows Server 2012 R2最终版本中默认自带的一个功能。Windows Power Shell是一个基于标准Web服务的配置管理系统,Windows Power Shell允许你按照自己的方式对机器进行配置,介绍什么是Windows Power Shell DSC,并将展示它是如何工作的,以及Windows Power Shell可以完成怎样的任务,达到怎样的目标。 许多管理员第一次听说Windows Power Shell工具时就想了解关于Windows Power Shell的一些背景和问题:在试验或真实系统管理解决方案如System Center或者其他第三方工具上使用Windows Power Shell期望状态配置的意义是什么?其有很多优势,但是其中有三点是最为突出的。 Windows Power Shell期望状态配置内置于Windows Server,所以Windows Power Shell没有购买许可和系统管理、配置部署软件管理实例的额外开支。 Windows Power Shell期望状态配置几乎不需要代理,需求只是安装好Windows Power Shell,并且可以通过80或者443端口查询Web服务器来抓取配置信息,这里不需要额外的配置系统管理开销。 Windows Power Shell期望状态配置看起来只是配置文件定义的功能。Windows Power Shell忽略其他设置,使配置负载更加轻巧和加速其他部署,这样Windows Power Shell就可以定义多个配置和堆叠工作负载(一台Web服务器也充当文件服务器,并且Windows Power Shell可以获取没有文件服务器设置覆盖的Web服务器的设置),这类部署是许多系统管理套件无法很容易地应付,甚至完全不能处理。
Windows Power Shell的Push模式和Pull模式
Windows Power Shell DSC的基本原则是使用定义所需配置的两种模式,这样管理员既可以自定义地有间隔地使机器从中央存储库获取正确配置信息,也可以将这类Windows Power Shell信息推送回去。 Windows Power Shell的Push模式是一个主动的配置模式运行方式,当你发出的Windows Power Shell命令并且键入的命令带有“-Path”的属性时,Windows Power Shell就会立即触发存在任何位置的基于文件存储的系统配置推送出去。这几乎是一种即时执行“现在就做”的方式来管理你放在中央存储位置的所有配置文件目标和需求,这些文件可以让你计划的目标机器去访问。这个需要你设置经常去触发Windows Power Shell推动,并且默认配置不会自己检测。 Windows Power Shell的Pull模式有一点点被动;Windows Power Shell需要一台服务器同时为配置文件和其它为计算机各方面配置充当中介角色的构件提供清算服务。举个例子,在你编写一个自定义服务提供程序——可以提供使用Windows Power Shell DSC的一段代码——Windows Power Shell可以转换本地自定义业务应用程序的配置文件中的指令。Windows Power Shell的Pull服务器只是一台运行IIS的服务器,而IIS可以发布OData。OData是一种典型、明确定义以及标准支持的界面,通过这个界面Windows Power Shell的Web 服务器可以获取到真正的配置数据。因此,Pull模式是实施Windows Power Shell DSC最常用的方式,也可以用来部署当配置远离期望状态并且超时的情况。Windows Power Shell DSC定期运行,下发正确的配置,执行静默的进程来更改配置为期望状态。 以上的Windows Power Shell配置定义都集成在管理对象文件或者MOF 文件,基本上都是一些文本文件,像一系列的classes,或者是一些Windows Power Shell 配置引擎可以读懂的与Windows操作系统有关的一些元素,抑或是一些可以定义期望配置的classes参数。 Windows Power Shell的MOF文件通常是手动建立一次,然后根据需求进行复制和粘贴。Windows Power Shell对于检测这个配置涉及的安装、移除或者确保某些Windows角色和功能是否已经存在,你可以使用内置命令Get-DscResource来检测。这个Windows Power Shell命令会根据你所以给出的角色或者功能名称,抓取出它们的正确使用语法和其他可用选项。 这些都是Windows Power Shell期望状态配置的基本要素。 [9]
尽管Windows Power Shell包含一系列本地用来配置存储的cmdlet,但配置NTFS权限的能力明显有限。幸运的是,微软提供了一种利用Windows Power Shell来检索和配置NTFS权限的方法,但是你需要提前下载并安装一个Windows Power Shell专用模块。 所需的模块是文件系统安全Windows Power Shell模块。将文件复制到Windows Power Shell模块文件夹中的NTFSSecurity文件夹下。默认情况下,Windows Power Shell模块文件夹路径 将Windows Power Shell模块复制到相应的文件夹后,可以通过使用下面的Windows Power Shell命令来验证模块的可用性 假设NTFS模块出现在列表里, 记住,除非你已经利用Set-ExecutionPolicy cmdlet更改了服务器的执行策略,否则上面这条Windows Power Shell命令将生成一个错误消息,告诉你系统上的Windows Power Shell脚本是禁止运行的。 输入执行策略后,你就拥有NTFS权限了。 然而,每次需要使用权限的时候都必须输入NTFSSecurity模块。 假设我在服务器上创建了文件夹C:Data 。接着,假如想查看这个Windows Power Shell文件夹的访问控制列表条目, 上面命令列出每个访问文件夹的账户/安全组、访问权限、应用权限、权限类型以及IsInherited和InheritedFrom标志(见图1)。
图1. 通过Windows Power Shell查看NTFS权限
授予Windows Power Shell文件夹访问权限与查看现有权限一样简单。你需要使用Add-NTFSAccess cmdlet。另外还需要指定路径、账户和访问权限。这里使用例子说明。假设“Everyone”都能安全访问到C:Data文件夹。 现在,我已经添加了Windows Power Shell权限,让每个人都能访问C:Data,并且利用Get-NTFSAccess cmdlet验证权限(图2)。
图2. Windows Power Shell任何人可访问
即使能够将Windows Power Shell权限授权给所有人,通常来说必须确认Windows Power Shell账户位置(图2)。例如,一些已有的权限位置为BUILTIN或NT AUTHORITY。在实际操作中,通常会指定一个Windows Power Shell连带用户组名或用户名的域名。例如,如果你想授权访问Contoso域中的Finance组,那么账户名为ContosoFinance。 Windows Power Shell删除NTFS权限有点棘手。接着上面的例子,你必须确认Windows Power Shell路径、账户名称以及打算删除的Windows Power Shell权限。 该Windows Power Shell命令有点棘手的原因在于,你无法删除Windows Power Shell继承权限。而且,删除的Windows Power Shell权限必须与目前分配给该帐户的Windows Power Shell权限准确匹配。如果匹配失误,则命令无效。 因为有时难以完全精准匹配权限,所以使用几个命令一起删除权限会更加方便。假如你想删除C:Data文件夹Everyone的所有权限,不必手工匹配权限,你可以使用Windows Power Shell读取该权限然后进行删除该。 如果你想从整个Windows Power Shell文件夹树中删除权限,可以递归使用该命令(图3)。