zoukankan      html  css  js  c++  java
  • [转]通过脚本添加登陆/注销/开机/关机脚本

    由于最近需要使用到关机脚本,就研究了下怎样通过代码的方式添加关机脚步;下面是一篇参考文件,现在转发。

    添加完脚步如果要马上生效需要刷新组策略,通过RefreshPolicy/RefreshPolicyEx/gpupdate 都可以

    '------------------------------------------------------------------------------------------------------------
    ' This script is used to add Logon and Logoff scripts to a local Group Policy.
     
    ' It modifies/creates the following two files needed to run logon and logoff scripts:
    ' - "%SystemRoot%system32GroupPolicygpt.ini"
    ' - "%SystemRoot%system32GroupPolicyUserScriptsscripts.ini"
     
    ' Notes:
    '        - This script will modify the existing gpt.ini file, but overwrites an existing scripts.ini file.
    '          It does NOT append or modify the scripts.ini file.
    '        - This script does not copy the actual logon/logoff scripts into place.
     
    ' The motivation to write this script was to overcome some challenges in a Novell environment due to a
    ' limitation of the integration with Novell Zen Policies, where logoff scripts are NOT supported on
    ' Terminal Servers.
     
    ' Release 1.1 Modified by Jeremy@jhouseconsulting.com on 27th October 2010.
    ' Written by Jeremy@jhouseconsulting.com on 25th August 2008.
     
    ' When managing the policy versions you should adhere to the Microsoft standards. The version numbering
    ' differs for changes made to the User and Computer configuration. In order to track changes to each
    ' configuration, the GPO must track a version number for each configuration. With only one version number,
    ' the way two versions are tracked is to split the version number into two numbers.
    ' The top 16 bits of the version number corresponds to the user configuration version. The lower 16 bits
    ' of the version number corresponds to the computer configuration version. When looking at the version
    ' entry in the gpt.ini file what you are then seeing is:
    ' Version = [user version number top 16 bits] [computer version number lower 16 bits]
    ' Esentially, each change to the User policy will increment the version by 131072, whilst each change to
    ' the Computer policy will increment the version by 1.
    '
    ' http://blogs.technet.com/grouppolicy/archive/2007/12/14/understanding-the-gpo-version-number.aspx
    '
    ' For example: In this script we are making a change to the User portion of the policy by adding a
    ' logon and logoff script. Therefore we will be incrementing the version number by 131072.
    '
    ' We also need to add the Client Side Extension (CSE) GUIDs to instructs the winlogon process
    ' to run the Startup/Shutdown/Logon/Logoff scripts.
    ' CSE GUID for script processing = {42B5FAAE-6536-11D2-AE5A-0000F87571E3}
    ' Tool extension GUID for user and computer policy mode settings = {40B66650-4972-11D1-A7CA-0000F87571E3}
    '
    ' gPCUserExtensionNames - includes a list of globally unique identifiers (GUIDs) that tells the client-side
    ' engine which client-side extensions have User data in the Group Policy object. The format is the following:
    ' [{<GUID of client-side extension>}{<GUID of MMC extension>}{<GUID of second MMC extension if appropriate>}]
    '
    ' For example: In this script we are adding logon and logoff scripts. Therefore the gPCUserExtensionNames
    ' will be set to the following at minimum:
    ' gPCUserExtensionNames=[{42B5FAAE-6536-11D2-AE5A-0000F87571E3}{40B66650-4972-11D1-A7CA-0000F87571E3}]
    '
    ' gPCMachineExtensionNames - includes a list of GUIDs that tells the client side engine which Client Side
    ' Extensions have Machine data in the GPO.
    ' The default GUIDs are as follows.
    ' gPCMachineExtensionNames=[{35378EAC-683F-11D2-A89A-00C04FBBCFA2}{0F6B957D-509E-11D1-A7CC-0000F87571E3}]
    '
    ' gPCFunctionalityVersion - The Version number of the Group Policy extension tool that created the Group
    ' Policy object.
    ' The default version is 2.
    '
    ' The Option setting has 4 values.
    ' 0 = Enable User and Computer Configurations
    ' 1 = Disable User Configuration ONLY
    ' 2 = Disable Computer Configuration ONLY
    ' 3 = Disable User and Computer Configurations
    ' If the Option value is not present, the User and Computer Configurations are both enabled.
    '------------------------------------------------------------------------------------------------------------
     
    Option Explicit
     
    Dim WshShell, strSystemRoot, strGPOLocation, objFSO, objFile, blnOption, strLine, strContents
    Dim arrLogonScripts, arrLogoffScripts, strValue, intUserPolicy, intComputerPolicy, blnUserPolicy
    Dim blnComputerPolicy, strCSEUserGUID, strToolextensionUserGUID, blnSection, blnUserExtensionNames
    Dim blnVersion, blnFunctionality, blnMachineExtensionNames, i
     
    Const ForReading = 1
    Const ForWriting = 2
     
    Set WshShell = WScript.CreateObject("WScript.Shell")
    Set objFSO = CreateObject("Scripting.FileSystemObject")
     
    strSystemRoot = WshShell.ExpandEnvironmentStrings("%SystemRoot%")
    strGPOLocation = strSystemRoot & "system32GroupPolicy"
     
    '********** These are the script variables that can be changed **********
     
    ' Setup the arrays for the location and names of the logon and logoff scripts.
    ' Note that if you don't want to use either one or the other, just leave the
    ' array blank, or comment the line out altogether.
    arrLogonScripts = Array("%SystemRoot%LoadQAT.cmd","%SystemRoot%RestoreDesktopIconPositions.Cmd")
    arrLogoffScripts = Array("%SystemRoot%SaveQAT.cmd","%SystemRoot%SaveDesktopIconPositions.Cmd")
     
    '************************************************************************
     
    strCSEUserGUID = "{42B5FAAE-6536-11D2-AE5A-0000F87571E3}"
    strToolextensionUserGUID = "{40B66650-4972-11D1-A7CA-0000F87571E3}"
     
    blnUserPolicy = True
    blnComputerPolicy = False
     
    intUserPolicy = 131072
    intComputerPolicy = 1
     
    blnSection = False
    blnFunctionality = False
    blnMachineExtensionNames = False
    blnVersion = False
    blnUserExtensionNames = False
    blnOption = False
     
    If objFSO.FileExists(strGPOLocation & "gpt.ini") Then
      Set objFile = objFSO.OpenTextFile(strGPOLocation & "gpt.ini", ForReading)
     
      Do While objFile.AtEndOfStream = False
        strLine = objFile.ReadLine
     
        If Instr(strLine,"[General]") > 0 Then
          blnSection = True
        End If
     
        If Len(strLine) > 0 AND Instr(strLine,";") <> 1 AND Instr(strLine,"[General]") <> 1 Then
        strValue=split(strLine,"=")
     
          Select Case strValue(0)
            Case "gPCFunctionalityVersion"
              blnFunctionality = True
            Case "gPCMachineExtensionNames"
              blnMachineExtensionNames = True
            Case "Version"
              If blnUserPolicy Then
                strValue(1)=strValue(1) + intUserPolicy
              End If
              blnVersion = True
            Case "gPCUserExtensionNames"
              If trim(strValue(1))="" Then
                strValue(1)="[" & strCSEUserGUID & strToolextensionUserGUID & "]"
                blnUserExtensionNames = True
              End If
              If instr(strValue(1),strCSEUserGUID) > 0 AND instr(strValue(1),strToolextensionUserGUID) > 0 Then
                blnUserExtensionNames = True
              Else
                If instr(strValue(1),strCSEUserGUID) = 0 Then
                  If Right(trim(strValue(1)),1) = "]" Then
                    strValue(1)=Left(trim(strValue(1)),Len(trim(strValue(1)))-1)
                  End If
                  strValue(1)=strValue(1) & strCSEUserGUID & "]"
                  blnUserExtensionNames = True
                End If
                If instr(strValue(1),strToolextensionUserGUID) = 0 Then
                  If Right(trim(strValue(1)),1) = "]" Then
                    strValue(1)=Left(trim(strValue(1)),Len(trim(strValue(1)))-1)
                  End If
                  strValue(1)=strValue(1) & strToolextensionUserGUID & "]"
                  blnUserExtensionNames = True
                End If
              End If
            Case "Options"
              If strValue(1)="0" Then
                blnOption = True
              End If
              If strValue(1)="1" Then
                strValue(1)="0"
                blnOption = True
              End If
              If strValue(1)="2" Then
                blnOption = True
              End If
              If strValue(1)="3" Then
                strValue(1)="2"
                blnOption = True
              End If
          End Select
          strContents = strContents & trim(strValue(0)) & "=" & trim(strValue(1)) & VbCrLf
        Else
          strContents = strContents & strLine & VbCrLf
        End If
      Loop
      objFile.Close
    End If
     
    If blnSection = False Then
      strContents="[General]" & VbCrLf & strContents
    End If
    If blnFunctionality = False Then
      strContents=strContents & "gPCFunctionalityVersion=2" & VbCrLf
    End If
    If blnMachineExtensionNames = False Then
      strContents=strContents & "gPCMachineExtensionNames=[{35378EAC-683F-11D2-A89A-00C04FBBCFA2}{0F6B957D-509E-11D1-A7CC-0000F87571E3}]" & VbCrLf
    End If
    If blnVersion = False Then
      If blnUserPolicy Then
        strContents=strContents & "Version=131073" & VbCrLf
      Else
        strContents=strContents & "Version=1" & VbCrLf
      End If
    End If
    If blnUserExtensionNames = False Then
      strContents=strContents & "gPCUserExtensionNames=[" & strCSEUserGUID & strToolextensionUserGUID & "]" & VbCrLf
    End If
    If blnOption = False Then
      strContents=strContents & "Options=0" & VbCrLf
    End If
     
    Set objFile = objFSO.OpenTextFile(strGPOLocation & "gpt.ini", ForWriting, True)
    objFile.Write(strContents)
    objFile.Close
    Set objFile = Nothing
     
    WScript.Echo "Local GPO Updated (gpt.ini): " & chr(34) & strGPOLocation & "gpt.ini" & chr(34)
     
    If NOT objfso.FolderExists(strGPOLocation & "User") Then
      objfso.CreateFolder(strGPOLocation & "User")
    End If
    If NOT objfso.FolderExists(strGPOLocation & "UserScripts") Then
      objfso.CreateFolder(strGPOLocation & "UserScripts")
    End If
    If NOT objfso.FolderExists(strGPOLocation & "UserScriptsLogoff") Then
      objfso.CreateFolder(strGPOLocation & "UserScriptsLogoff")
    End If
    If NOT objfso.FolderExists(strGPOLocation & "UserScriptsLogon") Then
      objfso.CreateFolder(strGPOLocation & "UserScriptsLogon")
    End If
     
    ' Need to unhide the scripts.ini file to prevent any "permission denied" errors.
    If objfso.FileExists(strGPOLocation & "UserScriptsscripts.ini") Then
      Set objFile = objFSO.GetFile(strGPOLocation & "UserScriptsscripts.ini")
      If objFile.Attributes = objFile.Attributes AND 2 Then
        objFile.Attributes = objFile.Attributes XOR 2
      End If
      Set objFile = Nothing
    End If
     
    strContents = "[Logon]" & VbCrLf
    If IsArray(arrLogonScripts) Then
      For i = 0 to ubound(arrLogonScripts)
        strContents = strContents & i & "CmdLine=" & arrLogonScripts(i) & VbCrLf
        strContents = strContents & i & "Parameters=" & VbCrLf
      Next
    End If
    strContents = strContents & "[Logoff]" & VbCrLf
    If IsArray(arrLogoffScripts) Then
      For i = 0 to ubound(arrLogoffScripts)
        strContents = strContents & i & "CmdLine=" & arrLogoffScripts(i) & VbCrLf
        strContents = strContents & i & "Parameters=" & VbCrLf
      Next
    End If
     
    On Error Resume Next
    Set objFile = objFSO.OpenTextFile(strGPOLocation & "UserScriptsscripts.ini", ForWriting, True)
    If Err.Number = 0 Then
      objFile.Write(strContents)
      objFile.Close
      Set objFile = Nothing
      WScript.Echo "Scripts Added (scripts.ini): " & chr(34) & strGPOLocation & "UserScriptsscripts.ini" & chr(34)
    ' Hide the scripts.ini file.
      Set objFile = objFSO.GetFile(strGPOLocation & "UserScriptsscripts.ini")
      objFile.Attributes = objFile.Attributes XOR 2
      Set objFile = Nothing
    Else
      wscript.echo "Error: " & Err.Description & ". The scripts.ini file has not been set."
    End If
    On Error Goto 0
     
    Set WshShell = Nothing
    Set objFSO = Nothing
     
    wscript.quit (0)
  • 相关阅读:
    【数通大讲坛02】IP子网划分(VLSM)
    【数通大讲坛01】利用TCP/IP模型理解数据通信过程
    新公司的第一个任务-重构系统(二)
    作为一名程序员的心得分享
    新公司的第一个任务-重构系统(一)
    第一次离职
    2018年终总结
    跳槽并不简单
    小公司的项目交付
    记一次项目测试间隔太长的问题
  • 原文地址:https://www.cnblogs.com/Quincy/p/5018383.html
Copyright © 2011-2022 走看看