none
Windows server 2008与Windows server 2008 R2的关机脚本 RRS feed

  • 问题

  • Windows server 2008与Windows server 2008 R2的关机脚本配置不同,请问怎么在Windows server 2008 Sp2启用powershell关机脚本?

    脚本功能很简单 remove-iteam HKLM:\ABC\a*

    由于批处理和vb script都不能使用通配符,复杂的脚本我又写不出来,所以只能用powershell,但是我的应用环境是Windows server 2008 sp2 ,不是R2

    使用批处理解决。

    reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" |find /i "S-1-8-21-3772116661-1087324123-3901968664-" >c:\key.txt
    for /f "delims=" %%i in (c:\key.txt) do reg delete "%%i" /f

    2013年9月23日 5:41

答案

  • 使用批处理解决。

    reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" |find /i "S-1-8-21-3772116661-1087324123-3901968664-" >c:\key.txt
    for /f "delims=" %%i in (c:\key.txt) do reg delete "%%i" /f

    感谢各位参与者。

    • 已标记为答案 刘新亚 2013年9月26日 3:06
    2013年9月26日 3:06

全部回复

  • 您好:

            請您將下列指令碼儲存成 shutdown.ps1格式後依照格式執行,看看能否解決您的問題。謝謝~!

    Shutdown.ps1  -ComputerName  XXX  -timeout 0

     ----------------------------------------------------      

            [cmdletbinding()] param ( [parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]           
    [string[]]$ComputerName = $env:computername,           
    $Timeout = 30,           
    [switch]$Reboot           

    )           

    begin {           
    $Username = $env:username           
    if($reboot) { $flag = 2 } else { $flag = 1 }            
    if($reboot) {           
      $comment  = "Reboot initiated by $Username using $($MyInvocation.InvocationName). Timeout is $Timeout"           
    } else {           
      $comment  = "Reboot initiated by $Username using $($MyInvocation.InvocationName). Timeout is $Timeout"           
    }           
    }           

    process {           
    foreach($Computer in $ComputerName) {           
      Write-Verbose "Working on $Computer"           
      if(Test-Connection -ComputerName $Computer -Count 1 -ea 0) {           
       $OS  = Get-WMIObject -Class Win32_OperatingSystem -ComputerName $Computer           
       if( -not $OS.Win32ShutdownTracker($timeout, $comment, 0, $flag)) {           
        $Status  = "FAILED"           
       } else {           
        $Status  = "SUCCESS"           
       }           
      $OutputObj = New-Object -TypeName PSobject            
      $OutputObj | Add-Member -MemberType NoteProperty -Name ComputerName -Value $Computer           
      $OutputObj | Add-Member -MemberType NoteProperty -Name Status -Value $status           
      $OutputObj | Add-Member -MemberType NoteProperty -Name Timeout -Value $timeout           
      $OutputObj           
      }           
    }           
    }           

    end {           
    }

    2013年9月23日 7:51
  • 感谢回答。

    请问脚本实现了什么功能?

    2013年9月23日 8:31
  • 單純的关机脚本,不知道是否是您所要求的功能。

    2013年9月23日 8:58
  • 我是想在关机的时候,system自动执行一个动作,去删除注册表中的几个key。key是就是ad user的SID,所以前面一段都是相同的,只有后面几个字符不同。使用powershell很容易就能够实现,例如: remove-iteam "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\S-1-5-21-44481-2231-3259167-500A*",就可以将这些sid从注册表中删除掉.(请注意有通配符)。

    将命令保存为ps1,加入到关机脚本中,以后每次重启就能自动维护注册表项,省掉很多人工维护工作。

    万问题是,windows server 2008 r2支持powershell的关机脚本,并且测试成功;但windows server 2008 sp2 则不支持powershell关机脚本。

    我还在测试用命令行批处理来实现,for加上reg两个命令。


    2013年9月23日 9:17
  • 您好:

             在我的理解User SID 均是不相同的,刪除SID後的字元的原因為何?

    2013年9月23日 9:29
  • user非正常注销导致profilelist下留下sid记录,user下次login的时候会失败,必须删除sid才可以。

    2013年9月24日 0:49
  • 你好,

    如果把下面的脚本保存成.ps1 文件,然后手动运行一下,如果成功的话,那么我们可以直接把这个.ps1文件作为我们的关机脚步。

    remove-iteam HKLM:\ABC\a*

    只需要把这个脚本放在对应的组策略对象的 Machine\Scripts\Shutdown 文件夹(在sysvol下面的),然后选择添加或者是选择显示文件,把它添加上去即可。

    Regards,

    Yan Li


    Cataleya Li
    TechNet Community Support

    2013年9月24日 3:20
    版主
  • 脚本本身没问题,能够在Windows server 2008 R2下作为关机脚本。

    但Windows server 2008 SP2可以使用吗?

    2013年9月24日 5:15
  • 其實批處理的話, 可以這樣

    reg delete HKLM\ABC /f


    Folding@Home

    2013年9月24日 6:13
  • reg不支持通配符
    2013年9月24日 6:18
  • 雖然 reg query 不支持通配符, 但是完全可以通過

    reg query HKLM\PATH > reg_path.txt

    然後通過 find 或 findstr 分析出符合刪除條件的註冊表項, 將符合保存為變量, 最後通過

    reg delete

    刪除.

    對於最後代入變量的刪除操作, 可以參考如下例子:

    set a=DEMO

    reg delete HKLM\SOFTWARE\%a% /f


    Folding@Home

    2013年9月24日 10:49
  • 還有一種比較笨的方法, 假設需要在如下註冊表項進行操作,

    HKLM\SOFTARE\REG\A001
    HKLM\SOFTARE\REG\A002
    HKLM\SOFTARE\REG\A003

    只需要刪除 A003,

    那麼可以這樣, 先把不刪除的導出, 然後刪除父項, 最後將不刪除地重新導入

    reg exort HKLM\SOFTARE\REG\A001 %temp%\REG_A001
    reg export HKLM\SOFTARE\REG\A002 %temp%\REG_A002
    reg delete HKLM\SOFTARE\REG /f
    reg import %temp%\REG_A001
    reg import %temp%\REG_A002


    Folding@Home

    2013年9月24日 10:54
  • 最後如果確實希望通過 powershell 執行, 那麼可以

    powershell -nologo -noninteractive -comand "INSTRUCTION"

    如果命令較為複雜的話, 換成 -encodedcommand

    然後放到一個批處理文件中, 並添加到 GPO 的關機腳本.

    這樣的話, 只要客戶端安裝了 powershell 的話, 就可以執行, 另外只要是執行純命令, 那麼腳本策略也不需要改.


    Folding@Home

    2013年9月24日 11:48
  • 還有一種比較笨的方法, 假設需要在如下註冊表項進行操作,

    HKLM\SOFTARE\REG\A001
    HKLM\SOFTARE\REG\A002
    HKLM\SOFTARE\REG\A003

    只需要刪除 A003,

    那麼可以這樣, 先把不刪除的導出, 然後刪除父項, 最後將不刪除地重新導入

    reg exort HKLM\SOFTARE\REG\A001 %temp%\REG_A001
    reg export HKLM\SOFTARE\REG\A002 %temp%\REG_A002
    reg delete HKLM\SOFTARE\REG /f
    reg import %temp%\REG_A001
    reg import %temp%\REG_A002


    Folding@Home


    删除所有
    2013年9月25日 1:25
  • 如果是刪除特定註冊表項下所有子項, 比如

    HKLM\SOFTARE\REG

    那麼直接

    reg delete HKLM\SOFTARE\REG /f

    就可以了, 不用使用通配符.

    關於這點, 可以執行命令

    reg delete /?

    查看其示例知曉.


    Folding@Home

    2013年9月25日 10:48
  • 使用批处理解决。

    reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" |find /i "S-1-8-21-3772116661-1087324123-3901968664-" >c:\key.txt
    for /f "delims=" %%i in (c:\key.txt) do reg delete "%%i" /f

    感谢各位参与者。

    • 已标记为答案 刘新亚 2013年9月26日 3:06
    2013年9月26日 3:06