电源外壳?你用吗?您能告诉我一些我可以使用的很棒的系统管理功能吗?[关闭]


45

我到处都读到PowerShell是未来的方式。当它第一次发布时,我做了很多虚拟实验室,但是从那时起,我仍然没有在生产环境中使用过它。我知道要处理已经安装的操作系统的日子已经来临,所以我想做好准备。

我想知道:

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

似乎每个人都同意Microsoft会为此努力,但实际上还没有人使用它。我希望听到系统管理员正在使用它来执行日常任务并共享一些代码示例。


JScript死了吗?
苏菲·阿尔珀特

7
下次不要在误导性头条新闻中成为巨魔。
Jaykul,2009年

也许是因为有时我希望它会像jscript一样消失。是我还是丑陋且冗长?
尼克·卡瓦迪亚斯

Answers:


34

微软正在竭尽所能,使PowerShell在各地成为高级用户和自动化编写者的选择。为了执行相同的操作而在.NET中编译代码的日子已经一去不复返了,现在您只需要notepad.exe和google。我们是办公室的忠实拥护者,尤其是因为Exchange 2007的管理控制台并未包含您在PowerShell中可以做的所有事情。Microsoft故意未能实现只能在很长时间内完成一次的事情,而这种方式更容易开发,如果您具有类似于复杂环境的任何东西,则彻头彻尾地强制使用它。

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

我们所做的是:

  • 创建一个网页以将某些管理任务委派给技术支持用户。该网页会触发在PowerShell中执行的命令。它所做的事情:
    • 创建和删除用户帐户,包括配置Exchange 2007邮箱和主目录
    • 解锁锁定的帐户
    • 创建/删除组
    • 从群组添加/删除用户
    • 在邮件存储之间移动用户
    • 设定密码
  • 每晚从ERP系统中提取数据并将全局地址簿数据推送到Active Directory中。
  • 解决随着我们的Exchange 2003到Exchange 2007迁移而出现的LegacyExchangeDN问题。必须为以前使用Exchange 2003的每个用户添加X500地址。一个相当短的PowerShell脚本对其进行了修复。
  • 脚本创建“组邮箱”(在Exchange中,多个用户可以访问该邮箱的共享邮箱),由于在启动数据之前我们需要数据的性质,因此是手动处理。它极大地标准化了这些邮箱的设置。
  • 创建了一个脚本,该脚本遍历了所有域计算机,重置了特定的注册表项并重新启动了服务。它花了18个小时才完成,但是却完成了工作。

是的,PowerShell将与我们保持相当一段时间。

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

$ list = import-csv(“ groupusers.csv”)
$ lastseengroup = $ list [0] .group
$ ADGroupPrefix =“ grp.netware”。
$ ADGroupSuffix =“ {已编辑-格式为,ou = groups,dc = domain,dc = domain,dc = domain}”
清除变量成员列表
清除变量的未知用户
foreach($ list中的$ entry){
    如果($($ entry.group)-ne $ lastseengroup){
        回声“偶然发现新组$($ entry.group),将更改提交给$ lastseengroup”
        $ newgroup = $ ADgroupPrefix + $ lastseengroup
        $ newgroupdn ='“'+” cn = $ newgroup $ ADGroupSuffix“ +'”'
        回显“获取$ newgroup的DN”
        $ existinggroup = dsquery组domainroot -name $ newgroup
        如果((($ existinggroup -ne $ null)){
            dsmod组$ newgroupdn -chmbr $成员列表
        }其他{
            dsadd组$ newgroupdn -scope u -secgrp是-members $ memberlist -desc“从eDirectory导入的组”
        }
        清除变量成员列表
    }
    $ User =获取用户$($ entry.member)-ErrorAction静默继续
    如果($ User.isvalid){
        $ UserDN = $ User.distinguishedname
        $ memberlist = $ memberlist +'“'+” $ UserDN“ +'”'
    }其他{
        $ unknownusers = $ unknownusers + $($ entry.member)
    }
    $ lastseengroup = $($ entry.group)

}
dsadd组“ cn = $ ADGroupPrefix $ lastseengroup $ ADGroupSuffix” -scope u -secgrp是-members $ memberlist

这将使用通过perl脚本创建的CSV文件并更新一组组。如果该组已经存在,它将用文件中指定的成员身份替换成员身份。如果该组不存在,它将创建它。这是一种单向同步。此外,没有相当的生产还没有,但接近。


6
远程PowerShell!你的意思是像ssh!?!大约时间!
尼克·卡瓦迪亚斯

2
您如何从网站上运行Powershell脚本,如何将Powershell脚本用作Web编程语言?您在使用powershellASP吗?您是否以IIS用户身份运行脚本?
2009年

17

鉴于微软的服务器产品从一开始就将启用PowerShell(我相信Exchange的下一版本将通过PowerShell提供所有配置),并且像PowerShell in Practice这样的书描述了一些自动化否则单调任务的绝佳方法,我认为有理由建议,PowerShell在一段时间内将成为Windows Serverland中的一种流行技术。


那本书仍处于测试阶段/正在撰写中
尼克·卡瓦迪亚斯

是的,它是-但您仍然可以立即购买并尽早访问其中的内容。那里有大量的服务器维护内容:)
moobaa

4
自Exchange 2007以来,Exchange一直是所有PowerShell。OCS在其下一发行版中将完全具有PowerShell功能。大多数System Center产品要么完全支持它,要么将在其下一个版本中支持。PowerShell不会随处可见。
2009年

12

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

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

简而言之,我认为从2.0开始的PowerShell可以认真地为大多数琐碎的任务替换批处理文件。


10

我作为SQL Server数据库管理员使用的十个PowerShell脚本(全部描述/发布在我的Blog上):

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

8

您编写了什么样的管理任务脚本?

应用程序/服务监视:从(远程)EventLog和存储过程中获取关键性能数字,并从单个批处理文件中显示它们

我是SQL Server DBA,向我展示一些很棒的东西吗?

automssqlbackup:带有轮换的MSSQL的每日备份(每天=增量,每周+每月=完整;保留5个每天,5个每周备份),压缩,电子邮件通知


+1用于自动化整个MSSQL备份过程。
2009年

是的... Powershell是纯金,用于在SQL Server中自动执行复杂的备份。我们用它来压缩和加密每小时备份,然后将文件发送到Amazon S3的异地存储:codeblog.theg2.net/2010/02/...
格雷格·布雷

7

在之前的职业中使用过unix shell脚本,然后转向Windows服务器管理,我可以说我真的非常感谢powershell -我没有时间也没有能力学习太多的奥秘语法,并且感到非常惊讶可以用非常简单的语言编写许多powershell脚本...以我习惯于ksh的价值为准!

我预计它将持续很长时间。


7

我认为这很酷:使用SQL Server 2008,您将获得新的PowerShell扩展,这些扩展使您可以像浏览本地文件系统或注册表一样浏览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)}

请注意,第一行只是更改了提示,因此它不会太长。

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


+1哇,这非常有用。谢谢!
jftuga 2010年

5

SQL Server 2008现在在Management Studio中具有PowerShell上下文选项,因此,Exchange对此不仅仅抱有这种选择。另外,也可以将其视为DOS的替代品,因为MS一直在思考它们的问题,因为它们不能提高DOS的向后兼容性问题的安全性,因此他们只是创建了一些新的东西,解决了问题!


4

我也是DBA,并且是长期的脚本编写者,回到DOS批处理文件V3.3!转到VB脚本,但PS 非常强大。看一下-抱歉,由于我是新用户,因此无法发布链接。从Otto Helweg的博客中获得了此信息。这是一种便宜而开朗的软件清单工具。

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

示例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


3

以下任务由我的团队定期使用PowerShell完成

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

每天,我都会一直有PS提示,并将其用于我过去使用CMD的任何一项关闭任务。

这是一些读取共享点列表的代码示例。我在PowerShell V2.0中使用来自Sharepoint的Web服务和新的“ 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作为我创建所有功能的基础。他甚至拥有一个很棒的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 {}    

}

有您愿意分享的任何示例代码吗?我对阅读和编写SharePoint列表特别感兴趣。
布赖恩2009年

2

我尝试使用PowerShell在工作中的一个小项目-每天将约600个用户和200个组的子集从公司AD迁移到使用CSV格式文件的旧UNIX系统。向我提供了500行的VBScript脚本(!),该脚本以单个组及其用户作为起点。

事实证明,大约20行的PowerShell脚本可以完成整个任务...

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


查找psremoting
山姆

1

我怎么不能使用它?现在,使用Powershell管理所有即将推出/正在升级的Microsoft服务器应用程序。然后在此核心之上提供了或多或少烦人的UI /管理控制台,该速度通常很慢,并且有人指出,缺少可用的功能...所以我不能说我们实际上有很多选择^ ^


看看这个小小的powershell脚本来生成您的程序集并加速所有基于powershell的控制台:msexchangeteam.com/archive/2008/08/01/449426.aspx
Jesse Weigert

1

Powershell并不是完美的,但是如果您使用过它,您就会知道它非常酷。可以访问整个.net库以及内置的cmdlet(并在2.0版中使用PS制作自己的cmdlet),这非常酷。

我认为唯一缺少的是出色的IDE,我肯定有一天会来自MS。现在,我使用Idera的powershell plus和adminscripteditor,它们允许调试并且非常酷。

我能够很好地摆脱VB的困扰。

到目前为止,我最大的项目是使用“ powershellASP”制作一个基本的网页,该网页运行powershell命令并从十几个VMWare ESXi(免费)主机中提取vmware主机和VM信息,并将其显示在HTML表中。我这样做是因为免费的VMWare ESXi和无虚拟中心,没有其他方法可以实时了解公司中的所有VM。PowershellASP是为IIS编写的免费的第三方分析器,MS不支持。因此,它现在可以做一些有限的事情,并且文档很少。


有PowerGUI,在powergui中使用ScriptEditor.exe,我无法想象如果没有它,我该如何生活……
Nicolas Dorier 2009年

Powershell 2包含出色的Powershell ISE(集成脚本编辑器)。在CTP 3是可用的,RTM大约是现在,在2009年10月最终发布
陡峭

1

我有一堆管理/清单脚本,它们通过AD搜索不同的事物,然后通过WMI查询它们以获取重要的统计信息,例如服务器上的份额,磁盘空间,已用磁盘空间等。

通用脚本:

  1. 获取可用的/已用的磁盘空间,RAM等。
  2. 在WMI中查询BIOS信息,服务器型号等。
  3. 检查AV版本,并确保存在某些注册表项
  4. Windows服务器上的审核共享

用户脚本:

  1. 枚举AD捕获所有用户,以及他们属于哪些组,然后写入Excel或CSV
  2. 通过TS和控制台查找当前登录的用户

我有一个枚举我的ESX服务器上的所有VMWare来宾计算机的计算机

我有一个脚本,可以在x天后抓取文件并将其安全删除。

基本上,我可以执行大约200行VBScript的操作,并在10个PowerShell中执行该操作。您还可以在VBScript中做一些您做不到或做的事情,例如发送带有附件的电子邮件,我会定期向我发送脚本结果。您还可以使用自定义服务名称和事件ID将有意义且唯一的条目写入事件日志。

这就是我能想到的。我现在选择的工具是PowerShell,它使生活更轻松。

基本上,它对系统管理员和Bash脚本对Unix管理员一样有用。


0

我正在寻找poweshell来替换我们的客户端批处理脚本-运行程序,登录脚本等。

但是发现它至少增加了10秒钟的登录时间-这就是所有“调整”到位的情况。因此最终还是坚持使用了我们所使用的东西。


这不是世界上最快的事情,但是它几乎可以完成所有事情。如果您只需要映射几个驱动器,则批处理脚本会更快。
sysadmin1138

0

不是.NET开发人员,我只能有限地使用PS允许您使用的所有与.NET相关的东西。但是,作为Exchange管理员(除其他外),Exchange 2007的PowerShell集成是AWESOME。我终于为我的邮件系统有了一个可靠的脚本引擎;到目前为止,我已经将每个月的统计信息发送给我,每个月的统计信息,根据一天中的时间调整将各种电子邮件地址分配给谁,自动在公用文件夹上创建和分配权限以及在两个邮箱邮箱数据库之间负载平衡用户。从Ex07的角度来看,另一件很酷的事情是,在GUI中执行任何操作之后,它将为您提供相关的PowerShell命令,以供您执行刚才的操作。复制这些脚本,您最终将拥有一组PS脚本,这些脚本可以从头开始削弱Exchange环境。


0

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

它对事件日志的处理非常棒。

我最近写了一个脚本来禁用默认运行的Foxit Reader启用的自动更新弹出窗口。它从AD中提取计算机列表,然后进行测试以查看其是否启动,然后将1更改为0。

我忘了一件事!

您几乎可以完全访问.NET库。用它来做真正复杂的事情有点痛苦,但是如果您有需要,它就在您身边。


0

我们将其用于许多管理任务,主要是一家Microsoft商店。有些脚本很简单,例如清理旧文件或对计算机进行碎片整理并记录结果。一个脚本主要使用WMI审计计算机,并将结果记录在数据库中。它获取诸如硬件(CPU,RAM,驱动器等),网络信息,本地用户,已安装的软件和配置文件信息之类的信息。有一种调用网络服务来发送电子邮件。我认为将来它将取代仍在使用的其余VBScript脚本。我们尚未将其用于Exchange或SQL Server任务。

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


0

我的Windows管理员尚未使用PowerShell。他们都听说过,但是他们并没有花时间去熟悉它。

我决定自己看看。我来自Unix shell背景,我认为Windows最终必须有一个真正的shell编程环境。我认为Microsoft在PowerShell方面做得很好,而在某些方面做得不好。

从好的方面来说,它们将对象用作PowerShell中cmdlet之间的中介。这为PowerShell提供了一定的功能,基于文本的脚本必须破解才能正常工作。

不利的一面是,它们实际上并没有充分利用Unix shell命令的大部分。因此,学习曲线不必要地陡峭,并不能帮助人们轻松地从Unix迁移到PowerShell,反之亦然。他们所做的最多就是为某些PowerShell cmdlet定义别名,例如ls别名Get-ChildItem,而所有命令行开关都不相同。

只是我的两分钱


0

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

除此之外,我还打算将PowerShell用作主要的Windows命令外壳程序,以用于一般用途,尤其是用于SQL Server数据库管理任务。

抱歉,我尚未共享任何代码示例,因为我还在学习!不过,我很乐意张贴一些内容:)

这是一个单行代码示例,我刚刚用:)回答了您的另一个问题:嘿,对于Wiki ...

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

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

hooray for powershell,太可惜了,它默认情况下没有安装在2003服务器上。注册表位置有所帮助!
尼克·卡瓦迪亚斯

0

虽然它不是最容易掌握的脚本语言(假定具有扎实的管道经验),并且具有自己的独特优势(给我一个简单的 sed,如东西一样的东西!),但我发现PowerShell相当强大。尚未达到Bash或其他Unix shell 的水平,但仍然如此。

我使用它来管理一些数据库导出和导入,并通过电子邮件警告以防万一情况恶化,并执行一些常规的批处理操作。

尽管它并不是“少写多做”的东西,但肯定已经是我的主要Windows Shell。PowerShell具有它的冗长性(和.NET继承)。


0

PowerShell版本1.0在很多方面都受到很大限制,但是2.0版本进展顺利。与批处理脚本相比,它的功能要强大得多。我并没有真正将其用作外壳,仅用于脚本,因此我的经验也因此而有所不同。我不太喜欢语法(-eqvs ==-gtvs >等),但是如果我需要做一些奇怪的事情,我很高兴能够进入.NET。我认为3.0版会很棒。现在,我将其牢牢地放在“完成工作”类别中。

我主要将其用于自动化代码部署。这是在C#中创建内容的一个亮点。与shell相关的操作(例如递归目录复制)以及Bash脚本编写者多年来一直认为的其他事情,使事情变得如此简单。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.