电源shell? 你用它吗? 你能告诉我一些很酷的系统pipe理事情吗?

我一直在阅读PowerShell是未来的道路。 在第一次发布的时候,我做了一大堆虚拟实验,但是从那以后我还没有在生产环境中使用它。 我知道,当我处理已经安装的操作系统的时候,就会有一天,所以我想做好准备。

我想知道:

  1. 你用它吗?
  2. 你使用PowerShell的“引导”过程是什么?
  3. 你用什么样的系统pipe理任务?
  4. 我是一名SQL Server数据库pipe理员。 与它有什么关系呢?

似乎每个人都同意微软推动这一点,但没有人真正使用它。 我想从系统pipe理员那里听到使用它来做每天的任务和共享一些代码示例。

    微软正在竭尽全力让PowerShell成为各地高级用户和自动化作家的select。 在.NET中编译代码的时代已经一去不复返了,现在你只需要notepad.exe和google。 我们在办公室里是它的粉丝,特别是因为Exchange 2007的pipe理控制台没有包含在PowerShell中可以做的所有事情。 微软故意没有实现那些在一段时间内只能完成一次的事情,更容易以这种方式进行开发,如果有类似复杂环境的东西,就会迫使它使用它。

    pipe理微软的新一代产品(Win7,Windows Server 2008,Exchange 2007/2010,SQL Server 2008)都有非常丰富的PowerShell挂钩。 一旦远程Powershell(PowerShell 2.0 IIRC)与Server 2008 R2一起部署,对于自动化编写者来说,它将变得更加有用。

    我们用它做了什么:

    • 创build一个网页,将某些pipe理任务委托给帮助台用户。 该网页触发了在PowerShell中执行的命令。 它做的事情:
      • 创build和删除用户帐户,包括configurationExchange 2007邮箱和主目录
      • 解锁locking的帐户
      • 创build/删除组
      • 从组中添加/删除用户
      • 在邮件存储之间移动用户
      • 设置密码
    • 从ERP系统提取摘要,每晚将全局地址簿数据推送到Active Directory中。
    • 解决与我们的Exchange 2003迁移出现的LegacyExchangeDN问题。 不得不给以前在Exchange 2003上的每个人添加一个X500地址。一个相当短的PowerShell脚本解决了这个问题。
    • 通过脚本创build“组邮箱”(Exchange中的多个用户可以访问邮箱的共享邮箱),这是一个手动过程,因为我们需要在启动数据前了解数据的性质。 它极大地标准化了这些邮箱的设置。
    • 创build了一个脚本,遍历所有需要重置特定registry项并重新启动服务的机器。 完成了18个小时,但是完成了工作。

    所以是的,PowerShell将会和我们在一起很长一段时间。

    编辑 :添加一个代码示例,因为它被要求

      $名单=import的CSV( “groupusers.csv”)
     $ lastseengroup = $列表[0]。集团
     $ ADGroupPrefix = “grp.netware。”
     $ ADGroupSuffix =“{redacted  - 格式为,ou = groups,dc = domain,dc = domain,dc = domain}”
    清除variables成员列表
    明确variables的未知用户
     foreach(在$ list中input$){
         if($($ entry.group)-ne $ lastseengroup){
            回声“绊倒新的组$($ entry.group),提交到$ lastseengroup”
             $新闻组= $ ADgroupPrefix + $ lastseengroup
             $ newgroupdn = ' “+ ”CN = $ $新闻组ADGroupSuffix“ +”“'
            回声“获取DN为$ newgroup”
             $ existinggroup = dsquery group domainroot -name $ newgroup
            如果(($ existinggroup -ne $ null)){
                 dsmod组$ newgroupdn -chmbr $ memberlist
             } else {
                 dsadd组$ newgroupdn -scope u -secgrp yes -members $ memberlist -desc“从eDirectory导入的组”
             }
            清除variables成员列表
         }
         $ User = get-user $($ entry.member)-ErrorAction默默继续
        如果($ User.isvalid){
             $用户DN = $ User.distinguishedname
             $ memberlist = $ memberlist +'“'+”$ UserDN“+'”'
         } else {
             $ unknownusers = $ unknownusers + $($ entry.member)
         }
         $ lastseengroup = $($ entry.group)
    
     }
     dsadd group“cn = $ ADGroupPrefix $ lastseengroup $ ADGroupSuffix”-scope u -secgrp yes -members $ memberlist 

    这需要使用perl脚本创build的CSV文件并更新一组组。 如果该组已经存在,则将其replace为文件中指定的成员。 如果该组不存在,则创build它。 这是一个单向同步。 另外,还不完全在生产,但接近。

    鉴于微软的服务器产品将从一开始就是PowerShell的(我相信下一个版本的Exchange 所有的configuration都可以通过PowerShell获得),像PowerShell in Practice这样的书籍描述了一些很好的方法来自动化单调的任务,我认为有理由认为PowerShell将在Windows服务器领域成为stream行的技术一段时间了。

    我推荐Scott Hanselman的Podcast#162 。 似乎所有的Microsoft服务器团队都被迫“提供PowerShell cmdlet”,并且遵循一个一致的语法。

    此外,像VMware这样的第三方正在采用它

    简而言之,我认为从2.0开始的PowerShell严重地取代了所有batch file,而不是最重要的任务。

    我用作SQL Server数据库pipe理员的十个PowerShell脚本(全部在我的博客中描述/张贴):

    1. 检查所有SQL Server上的磁盘空间并将数据加载到SQL表中
    2. 在所有生产SQL Server上运行权限报告,并将数据加载到SQL数据库
    3. 发现networking上的所有Windows Server 2003群集,节点和虚拟并加载到SQL表
    4. 发现在SCCM中定义的所有SQL Server上的所有数据库,并加载到SQL表中
    5. 通过将所有SQL Server的备份信息加载到SQL表创build一个SQL Server备份记分卡
    6. validation在Windows Server 2003 SP2中禁用TCP卸载引擎(这是许多SQL Server的性能杀手)
    7. validation磁盘分区alignment(如果磁盘alignment不正确也是一个性能杀手)
    8. 将SQL表从一台服务器复制到另一台
    9. Recursivley将使用MSDB存储的所有SSIS包从一台服务器复制到另一台,包括文件夹结构
    10. 创build我自己的graphics对象依赖关系查看器

    你使用什么样的pipe理任务?

    应用程序/服务监视:从(远程)事件日志和存储过程中获取关键性能数字,并从单个batch file中显示它们

    我是一名SQL Server DBA,请教我一些很酷的事情呢?

    automssqlbackup :MSSQL的日常备份(每日=增量,每周+每月=满;每天保持5次,每周5次备份),压缩,电子邮件通知

    在以前的职业生涯中使用了unix shell脚本,然后转到windows服务器pipe理,我可以说我真的很喜欢powershell – 我没有时间也没有能力学习太多的神秘语法,并且很惊喜,很多PowerShell脚本可以写得非常简单的语言…采取什么它的价值,因为我曾经用ksh!

    我预测它会在很长一段时间。

    我认为这很酷:在SQL Server 2008中,您可以获得新的PowerShell扩展,使您可以像本地文件系统或registry一样导航SQL数据库。

    安装SQL Server客户端工具后,您可以在PowerShell中打开任何数据库(通过右键单击上下文菜单),并以面向对象的方式进行操作:

    PS SQLSERVER:\SQL\MyServer\MyInstance\Databases\ExampleDB\>function prompt {"PS >"} PS >cd tables PS >dir SCHEMA NAME CREATED ------ ---- ------- dbo MyTable 25/06/2009 17:02 PS > dir | format-table name, columns, rowcount, parent NAME COLUMNS ROWCOUNT PARENT ---- ------- -------- ------ MyTable {Id, Name} 0 {ExampleDB} PS >$myTable = dir | where {$_.Name -eq "MyTable"} PS >$myTable.Script() SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON CREATE TABLE [dbo].[MyTable]( [Id] [int] IDENTITY(1,1) NOT NULL [Name] [nText] NOT NULL ) ON [PRIMARY] PS >set-location \SQL\AnotherServer\Default PS >cd databases\Northwind\tables PS >$myTables = dir | where {$_.Rowcount -gt 100 -and $_.HasIndex -eq 1} PS >$myTables.Count 8 PS >foreach ($table in $tables) {$table.RebuildIndexes(90)} 

    注意第一行只是改变提示,以便它不那么长。

    希望除此之外,这是不言而喻的:)

    SQL Server 2008现在在Management Studio中有PowerShell上下文选项,所以Exchange不止于此。 另外,把它想象成DOS的替代品,因为这是MS所想的,因为它们不能提高DOS的安全性,因此它们只是创造了一些新的东西,解决了问题!

    我也是一名DBA,很长时间的脚本,回到DOSbatch file,V3.3! 移动到VB脚本,但PS是非常强大的。 看看 – 对不起,我不能发布链接,因为我是一个新用户。 从Otto Helweg的博客得到这个。 这是一个便宜而愉快的软件清单工具。

    • 1-拉取要从数据库表中查询的计算机列表
    • 2-将当前数据和时间添加到结果中
    • 3-将审计结果logging到数据库中

    示例PowerShell脚本:

     # Open the database connection $dbConn = new-object System.Data.SqlClient.SqlConnection "server=kcdb;database=Inventory;Integrated Security=sspi" $dbConn.Open() $sqlQuery = $dbConn.CreateCommand() # Get all known computers $sqlQuery.CommandText = "select * from Inventory..Computers" $reader = $sqlQuery.ExecuteReader() $computersToQuery = @() while ($reader.Read()) { $computersToQuery += $reader["Computer"] } # Close the database connection $dbConn.Close() $softwareInventory = @{} foreach ($computer in $computersToQuery) { $psinfoOutput = ./psinfo.exe -s Applications \\$computer $foundSoftwareInventory = 0 $computerName = "" foreach ($item in $psinfoOutput) { if ($foundSoftwareInventory -eq 1) { # Force the results to a string # Remove any single quotes which interfere with T-SQL statements # Load the result into a hash whereby removing any duplicates [string]$softwareInventory[$computerName][$item.Replace("'","")] = "" } if ($item -like "System information for *") { $computerName = $item.Split("\")[2].TrimEnd(":") } elseif ($item -eq "Applications:") { $foundSoftwareInventory = 1 $softwareInventory[$computerName] = @{} } } } $dbConn = new-object System.Data.SqlClient.SqlConnection "server=kcdb;database=Inventory;Integrated Security=sspi" $dbConn.Open() $sqlQuery = $dbConn.CreateCommand() foreach ($computer in $softwareInventory.Keys) { foreach ($softwareItem in $softwareInventory[$computer].Keys) { "Loading-" + $computer + ":" + $softwareItem # Try an Update then an Insert trap { $sqlQuery.CommandText = "update Inventory..SoftwareInventory set AuditDate = getdate() where Computer = '" + $computer + "' and Software = '" + $softwareItem + "'" $result = $sqlQuery.ExecuteNonQuery() continue } $sqlQuery.CommandText = "insert into Inventory..SoftwareInventory (Computer,Software,AuditDate) values ('" + $computer + "','" + $softwareItem + "',getdate())" $result = $sqlQuery.ExecuteNonQuery() } } $dbConn.Close() 

    戴夫J

    以下任务由我的团队在PowerShell上定期完成

    • 列出我们的Hyper-V群集的所有节点上的可用内存。
    • pipe理一个Netapp文件pipe理器
    • configuration新的Hyper-V虚拟机
    • 以编程方式写入和读取SharePoint列表

    我每天都有一个PS提示符,并将它用于任何我曾经使用CMD的任务。

    以下是用于阅读Sharepoint列表的一些代码示例。 我使用了Sharepoint的Web服务和PowerShell V2.0中新的“New-WebServiceProxy”cmdlet

     $url = "http://server/sites/site/_vti_bin/lists.asmx" $listWebService = new-webServiceProxy -uri $url -UseDefaultCredential $listName = "MyList" $viewGuid = $null $query= $null $viewFields = $null $numRowsReturned = 20000 $queryOptions = $null $result = $listWebService.GetListItems($listName,$ViewGuid,$query,$viewFields,$numRowsReturned,$queryOptions,$null) 

    Oisin Grehan 在使用Sharepoint Web Services方面有很好的博客文章 ,我用它来创build我所有的function。 他拥有一个非常棒的new-webservice.ps1脚本,如果您仍在使用PowerShell V1,则可以使用该脚本。

    另外,下面是我用来获取群集中节点上的可用内存的基本函数

     Function Get-AvailableMemory { param ( [string[]] $servers ) BEGIN { $query = "select AvailableBytes,__SERVER from Win32_PerfRawData_PerfOS_Memory" $availableMemory = @{ Name="AvailableMemory"; Expression = {[math]::round($_.AvailableBytes/1gb,2)} } $serverName = @{ Name ="Server"; Expression = {$_."__SERVER"} } } PROCESS { foreach ($server in $servers){ get-wmiobject -query $query -computer $server | select-object $availableMemory, $serverName } } END {} } 

    我在一个小型的项目中尝试过使用PowerShell,每天将大约600名用户和大约200个小组的子集从公司AD迁移到使用类似CSV文件的旧UNIX系统。 我被提供了一个500行的VBScript脚本(!),它以一个组和用户作为出发点。

    原来,一个〜20行的PowerShell脚本可以完成整个事情…

    作为* NIX用户(服务器和客户端),我对PowerShell感到非常惊喜。 即使你只知道一小部分命令,你也可以用它做很强大的工作。 我只需要SSH (类似)远程访问…

    我怎么能不使用它? 所有出来/正在升级的Microsoft服务器应用程序现在都使用Powershell进行pipe理。 然后提供一些或多或less烦人的用户界面/pipe理控制台内置的这个核心往往是狗慢,有人指出,缺乏function,所以我不能说我们有很多select实际上^ ^

    Powershell不是完美的,但如果你使用它,你知道这是非常酷的。 可以访问整个.net库和内置cmdlet(并在2.0中使用PS创build自己的cmdlet),这非常酷。

    我认为唯一缺less的就是一个很好的IDE,我肯定有一天它会来自MS。 现在我使用Idera的powershell plus和adminscripteditor,它们允许debugging,而且非常酷。

    我能够很好的摆脱VB的身份。

    迄今为止我最大的项目是使用“powershellASP”来创build一个运行powershell命令的基本网页,并从我的十几台VMWare ESXi(免费)主机中提取VMware主机和虚拟机信息,并将它们显示在HTML表格中。 我这样做是因为使用免费的VMWare ESXi并没有虚拟中心,没有其他方法可以实时查看公司中所有虚拟机的情况。 PowershellASP是为IIS编写的免费第三方分析器,不受MS支持。 所以它现在可以做一些有限的事情,文档是相当稀疏的。

    我有一大堆pipe理/库存脚本,它们通过ADsearch不同的东西,并通过WMI查询这些重要的统计信息,如服务器上的共享,磁盘空间,使用的磁盘空间等。

    通用脚本:

    1. 获取免费/使用的磁盘空间,RAM等
    2. 查询BIOS信息的WMI,服务器制造模型等
    3. 检查AV版本,并确保某些registry项在那里
    4. 在Windows服务器上审核共享

    用户脚本:

    1. 列举AD抓取所有用户,以及他们所属的组,然后写入Excel或CSV
    2. 通过TS和控制台查找当前login的用户

    我有一个枚举ESX服务器上的所有VMWare客户机

    我有一个脚本在x天后抓取文件并安全地删除它们。

    基本上我可以做什么花了大约200行的VBScript,并在10 PowerShell中。 你也可以做你在VBScript中做不到的事情,比如发送带有附件的电子邮件 – 我经常给我发送脚本的结果。 您还可以使用自定义服务名称和事件ID将有意义且唯一的条目写入事件日志。

    这就是我能想到的。 我select的工具是PowerShell,它只是让生活更轻松。

    基本上,对于系统pipe理员而言,Bash脚本对于Unixpipe理员来说是非常有用的。

    我正在看poweshell来replace我们的客户端批处理脚本 – 运行程序,login脚本等

    但发现它至less增加了10秒钟的login时间 – 这就是所有的“调整”。 所以结束了与我们正在使用的东西。

    不是一个.NET开发人员,我只能使用所有与PS相关的好东西。 但是,作为Exchangepipe理员(除其他外),Exchange 2007的PowerShell集成非常棒。 我终于有一个可靠的脚本引擎为我的邮件系统; 到目前为止,我已经发送给每个人每月的统计信息,根据一天中的时间调整分配给各个电子邮件地址的人员,自动创build和分配公共文件夹的权限,并在两个邮箱的DB之间对用户进行负载平衡。 从Ex07的angular度来看,另一件很酷的事情是,在GUI中执行任何操作之后,它会为您提供相关的PowerShell命令。 复制这些文件,你最终将拥有一套PS脚本,可以从头开始重新构build你的Exchange环境。

    在我工作的地方通过服务器检查自动化某些事情(从WMI收集基本信息并从事件日志收集错误和警告)。

    它处理的事件日志真棒。

    我最近编写了一个脚本来禁用福昕阅读器默认启用的自动更新popup窗口。 它从AD中拉出一个电脑列表,然后testing看看它是否上升,然后它将1变成0。

    有一件事我忘了!

    你几乎可以完全访问.NET库。 用它做很复杂的东西是一件很痛苦的事情,但是如果你有这个需要的话,它就在你的身边。

    我们将其用于相当多的pipe理任务,主要是微软的商店。 一些脚本很简单,比如清理旧文件或整理机器并logging结果。 一个脚本主要使用WMI审计计算机,并将结果logging在数据库中。 它获得硬件(CPU,RAM,驱动器等),networking信息,本地用户,安装的软件和configuration文件信息。 有一个调用Web服务来发送电子邮件。 我想在将来它会replace仍在使用的其他VBScript脚本。 我们还没有将它用于Exchange或SQL Server任务。

    我期待下一个版本,它将支持后台作业,事务,更好的exception处理,新的ISE(集成脚本环境),更好的debugging等等。

    我的Windowspipe理员还没有使用PowerShell。 他们都听说过,但他们没有花时间去熟悉它。

    我决定自己看看。 来自Unix shell的背景,我认为Windows必须有一个真正的shell编程环境。 我认为微软在PowerShell和其他方面做得不是很好。

    好的一面是它们使用对象作为PowerShell中的cmdlet之间的中介。 这为PowerShell带来了一定程度的权力,即基于文本的脚本必须破解才能工作。

    消极的一面,他们确实没有充分利用Unix shell命令。 所以学习曲线是不必要的陡峭,并不能帮助人们轻松地从Unix移到PowerShell,反之亦然。 他们做的最多的是为一些PowerShell cmdlet定义别名,比如ls别名为Get-ChildItem ,所有的命令行开关都不相同。

    只是我的两分钱…

    这更像是一个开发人员的答案,但这是真实的世界,我们将在未来几个月的某个时候开始testing。 我开始学习PowerShell,以编写脚本将SQL Server任务带入我们的持续集成环境。 持续集成脚本将主要由NAnt和MSBuild通过JetBrains TeamCity运行 。

    除此之外,我正在考虑将PowerShell作为我的主要Windows命令shell用于一般用途,尤其是对于SQL Server数据库pipe理任务。

    对不起,我还没有任何代码示例尚未分享,因为我还在学习! 我会很高兴发布一些当我做,虽然:)

    这里是一个单行代码示例,我刚刚回答你的另一个问题:)但是,嘿,维基…

    这将列出安装的修补程序:

     Get-ChildItem -Path “HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix” 

    虽然它并不是最简单的脚本语言(可靠的pipe道体验),并有自己独特的杠杆(给我一个简单的 sed -likey!!!),我发现PowerShell相当强大。 没有达到Bash或其他Unix shell的水平,但仍然。

    我用它来监督一些数据库出口和import与电子邮件警告,以防事情变糟,并做一些例行的批量操作。

    它当然已经是我的主要Windowsshell,但它不是真正的“less写更多”的东西。 PowerShell具有冗余(和.NETinheritance)。

    PowerShell版本1.0在许多方面受到严格的限制,但是2.0版本很好。 与批处理脚本相比,function更强大。 我并不是真的把它当作一个shell,只是用于脚本,所以我的经验是相应地着色的。 我不太喜欢它的语法( -eq vs ==-gt > vs >等),但是如果我需要做一些奇怪的事情,我很欣赏能够下载到.NET中 。 我认为到3.0版本会很好。 现在我把它牢牢地放在“完成工作”的范畴。

    我主要用它来自动部署代码。 这是一个用C#创build东西的地方。 与recursion目录复制等shell相关操作以及Bash脚本编写人员多年来一直认为的其他操作使事情变得如此简单。