在 Powershell 中不能做什么

car*_*ett -2 powershell windows-server-2012

我正在准备一份关于 Windows 2012R2 中 Powershell 管理与基于 GUI 管理的可能性的快速演示。现在,我试图确定通常使用 MMC 或类似方法执行的管理任务仍然无法使用 Powershell cmdlet/函数。

从 2012R2 开始,使用 Powershell 至少几乎完全可以管理的一些功能示例是 IIS、DHCP、Active Directory。我很清楚使用 pre-powershell 工具、WMI、COM 或 .NET 程序集还有很多其他的可能性,但根据我的经验,很少有系统管理员觉得去那里很舒服,所以我将范围限制在 cmdlet 上。

Mat*_*sen 8

你的问题没有意义

PowerShell 不仅仅是一堆cmdlets!

PowerShell 是一种功能强大且可扩展的管理工具 - 任何您可以从管理控制台执行的操作,您都可以从 PowerShell 执行 - 只需熟悉底层 API 即可

即使不一定符合众所周知的 API 的配置选项也可以通过 PowerShell、文件系统、注册表、证书存储等的内置存储提供程序进行操作。

WMI

通过 PowerShell 与 WMI 交互几乎很容易,至少回顾我早期对 VBScript 的尝试(哦,可怕)。

PowerShell 中的核心模块带有各种 cmdlet,包括Get-WMIObjectWindows 2012 引入了更通用的CIM cmdletslike Get-CimInstance):

$OSbitness = (Get-WmiObject -Class Win32_OperatingSystem).OSArchitecture
Run Code Online (Sandbox Code Playgroud)

圣球?!我们只是使用 WMI 告诉我们操作系统架构,而没有调用wmic或编写 700 行 wsh 错误处理!

通讯

PowerShell 可以调用 COM 应用程序并与之交互。可以使用New-Objectcmdlet以这种方式访问​​许多 Microsoft 应用程序。例如,
请参阅这个使用 Excel 创建和保存电子表格的示例- 非常简洁!

。网?没问题!

由于 .NET 已经是 PowerShell 不可或缺的一部分(相同的对象模型、派生类型系统、相同的运行时环境等),使用混合反射和一些内置 cmdlet(如New-Object和),.NET 可扩展性就在您的指尖Add-Type。伸开!

Powershell 运行时集合类型不适合您?你想要一个字符串的 HashSet 吗?没问题:

$myHashSet = New-Object System.Collections.Generic.Hashset[String]
Run Code Online (Sandbox Code Playgroud)

需要将现有供应商库导入您的 Powershell 会话吗?没问题:

Add-Type -Path C:\Stupid\Old\App\Lib.Helper.dll
Run Code Online (Sandbox Code Playgroud)

需要来自 GAC 的托管库?没问题:

[Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
or 
Add-Type -AssemblyName System.Windows.Forms
Run Code Online (Sandbox Code Playgroud)

动态的一些托管代码怎么样?一些使用C#? 没问题:

$typeDef = "public class HelperFuncs {public static string HelloWorld(){return "Hello World";}}"
Add-Type -TypeDefinition $typeDef
[HelperFuncs]::HelloWorld()
Run Code Online (Sandbox Code Playgroud)

原生 API?

要访问 Windows 中的本机 API,我们必须进行一些 .NET 包装或编组,但DllImportPInvoke.NET 也使此任务变得微不足道

$MethodDefinition = @'
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
public static extern bool CopyFile(string lpExistingFileName, string lpNewFileName, bool bFailIfExists);
'@
$Kernel32 = Add-Type -MemberDefinition $MethodDefinition -Name 'Kernel32' -Namespace 'Win32' -PassThru

$Kernel32::CopyFile("C:\somefile.txt","C:\newLocation\somefile.txt")
Run Code Online (Sandbox Code Playgroud)

除此之外,PowerShell 是它自己的脚本语言,它建立在许多世界中最好的语言之上,包括从 Perl、ksh、Tcl 以及 C# 及其祖先等经过验证的语言借来的语法。

它具有流控制选项,如循环、开关、if-else 和各种通用比较运算符,支持多值分配和非常强大的面向对象的管道,以及无数其他功能。

老实说,PowerShell 在 Windows Server 管理方面的唯一真正限制是距离屏幕 20 英寸

  • 我想你给了他一个完美的答案。现在他知道使用 Powershell 几乎一切皆有可能。 (2认同)
  • 你知道我喜欢 POSH 的什么吗?没有“xargs”,也没有(或至少更少)管道中的文本 - 您只是传递对象。 (2认同)