儘管您可以通过以文本方式键入命令与 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的名字空间(root\cimv2),ConnectServer方法返回了一个WMIService对象,接着又用这个对象的subClassesOf()方法,返回了一系列WMI的CLASS: $strComputer = "." $wmiNS = "\root\cimv2" $strUsr ="" #Blank for current security. Domain\Username $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 }
新脚本语言
由于以下原因,Windows PowerShell 使用它自己的语言,而不是重用现有的语言:
Windows PowerShell 需要用于管理.NET 对象的语言。该语言需要为使用cmdlet 提供一致的环境。该语言需要支持複杂的任务,而不会使简单的任务变得更複杂。 该语言需要与在.NET编程中使用的高级语言(如C#)一致。
本质上,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角色管理的问题。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系统功能的操作命令。
以上的命令可以从CSV档案中读取每个Windows Power Shell伺服器名并且同时在每台伺服器安装上SNMP服务。
使用Windows Power Shell控制IT许可权
在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员工一定要有相应必需的Windows 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可以作为一款管理工具来使用,但是使用它需要用户进行一定时间的学习。
Windows Power Shell期望状态配置
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期望状态配置的基本要素。
Windows Power Shell控制NTFS许可权
儘管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组,那幺账户名为Contoso\Finance。 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)。
过去的几个版本的Windows Server里,微软加大了在PowerShell工具上的研发投入,使得其能够灵活可用。其中值得称道的一点是在Windows Server 2008 R2和Windows Server 2012里,可用通过PowerShell创建能用于裸机恢复的备份。在本文中,我们将讨论如何操作。