组策略命令行:secedit.exe。


secedit命令语法:

secedit /analyze
 secedit /configure
 secedit /export
 secedit /validate
 secedit /refreshpolicy

5个命令的功能分别是分析组策略、配置组策略、导出组策略、验证模板语法和更新组策略。其中secedit /refreshpolicy 在XP/2003下被gpupdate代替。这些命令具体的语法自己在命令行下查看就知道了。与访问注册表只需reg文件不同的是,访问组策略除了要有个模板文件(还是inf),还需要一个安全数据库文件(sdb)。要修改组策略,必须先将模板导入安全数据库,再通过应用安全数据库来刷新组策略。来看个例子:假设我要将密码长度最小值设置为6,并启用“密码必须符合复杂性要求”,那么先写这么一个模板:[version]

signature="$CHICAGO$"
 [System Access]
 MinimumPasswordLength = 6

PasswordComplexity = 1保存为gp.inf,然后导入:secedit /configure /db gp.sdb /cfg gp.inf /quiet这个命令执行完成后,将在当前目录产生一个gp.sdb,它是“中间产品”,你可以删除它。
/quiet参数表示“安静模式”,不产生日志。但根据我的试验,在2000sp4下该参数似乎不起作用,XP下正常。日志总是保存在%windir%\security\logs\scesrv.log。你也可以自己指定日志以便随后删除它。比如:secedit /configure /db gp.sdb /cfg gp.inf /log gp.log
del gp.*另外,在导入模板前,还可以先分析语法是否正确:secedit /validate gp.inf那么,如何知道具体的语法呢?当然到MSDN里找啦。也有偷懒的办法,因为系统自带了一些安全模板,在%windir%\security\templates目录下。打开这些模板,基本上包含了常用的安全设置语法,一看就懂。再举个例子——关闭所有的“审核策略”。(它所审核的事件将记录在事件查看器的“安全性”里)。
echo版:echo [version] >1.inf

echo signature="$CHICAGO$" >>1.inf
 echo [Event Audit] >>1.inf
 echo AuditSystemEvents=0 >>1.inf
 echo AuditObjectAccess=0 >>1.inf
 echo AuditPrivilegeUse=0 >>1.inf
 echo AuditPolicyChange=0 >>1.inf
 echo AuditAccountManage=0 >>1.inf
 echo AuditProcessTracking=0 >>1.inf
 echo AuditDSAccess=0 >>1.inf
 echo AuditAccountLogon=0 >>1.inf
 echo AuditLogonEvents=0 >>1.inf
 secedit /configure /db 1.sdb /cfg 1.inf /log 1.log /quiet

del 1.*也许有人会说:组策略不是保存在注册表中吗,为什么不直接修改注册表?因为不是所有的组策略都保存在注册表中。比如“审核策略”就不是。你可以用regsnap比较修改该策略前后注册表的变化。我测试的结果是什么都没有改变。只有“管理模板”这一部分是完全基于注册表的。而且,知道了具体位置,用哪个方法都不复杂。比如,XP和2003的“本地策略”-》“安全选项”增加了一个“本地帐户的共享和安全模式”策略。XP下默认的设置是“仅来宾”。这就是为什么用管理员帐号连接XP的ipc$仍然只有Guest权限的原因。可以通过导入reg文件修改它为

“经典”:echo Windows Registry Editor Version 5.00 >1.reg
 echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa] >>1.reg
 echo "forceguest"=dword:00000000 >>1.reg
 regedit /s 1.reg
 del 1.reg而相应的用inf,应该是:echo [version] >1.inf
 echo signature="$CHICAGO$" >>1.inf
 echo [Registry Values] >>1.inf
 echo MACHINE\System\CurrentControlSet\Control\Lsa\ForceGuest=4,0 >>1.inf
 secedit /configure /db 1.sdb /cfg 1.inf /log 1.log


del 1.*关于命令行下读取组策略的问题。
系统默认的安全数据库位于%windir%\security\database\secedit.sdb,将它导出至inf文件:secedit /export /cfg gp.inf /log 1.log没有用/db参数指定数据库就是采用默认的。然后查看gp.inf。不过,这样得到的只是组策略的一部分(即“Windows设置”)。而且,某个策略如果未配置,是不会被导出的。比如“重命名系统管理员帐户”,只有被定义了才会在inf文件中出现NewAdministratorName="xxx"。对于无法导出的其他的组策略只有通过访问注册表来获得了。此办法在XP和2003下无效——可以导出但内容基本是空的。原因不明。根据官方的资料,XP和2003显示组策略用RSoP(组策略结果集)。相应的命令行工具是gpresult。但是,它获得的是在系统启动时被附加(来自域)的组策略,单机测试结果还是“空”。所以,如果想知道某些组策略是否被设置,只有先写一个inf,再用secedit /analyze,然后查看日志了


secedit用法的一些答疑和测试记录

from:  http://blog.sina.com.cn/s/blog_5395c8d20100fx4o.html
虽然以前做程序包的时候经常要设置一些目录的DACL或者用户的权限,也用到了secedit,但是并没有特别深入地去追究这个问题,都是达到目的就罢手了,今天某个大客户(真的很大哦=。=行业N0.1)在批量改系统的一个组策略操作中遇到了一些问题,涉及到secedit的详细用法,问到我这里来了,我翻了一些资料,发现网上的资料真的是鱼龙混杂,抄来抄去都是一个版本,所有的secedit的用法基本上都是手册上的那些,遇到复杂的问题根本没办法。只好自己做了几个测试验证了一下,结果居然被他们收藏了=。=说是要当“教材”使用,我怕我过段时间自己记不住,加上好记性不如烂笔头,就记录在这里好了。
问1:
“我需要批量改系统的一个组策略。
 下面是我的操作过程。
 secedit /export /db C:\WINDOWS\security\Database\secedit.sdb /cfg C:\WINDOWS\security\templates\test.inf /areas SECURITYPOLICY
手工修改 test.inf
secedit /configure /db C:\WINDOWS\security\Database\secedit.sdb /cfg C:\WINDOWS\security\templates\test.inf /areas SECURITYPOLICY /overwrite
 帮忙看看是否可行。
 我们在测试时发现 secedit.sdb 在导入后会从 3MB 缩小到 1MB。”
回答:
首先回答为什么3MB会到1MB,因为secedit之前存储的不仅仅是组策略,而且还有其他的各种配置,看看C:\WINDOWS\security\template目录就知道了,里面很多inf文件都是系统用到的。而他们首先用的命令行里使用了/overwrite操作,/overwrite操作会把之前配置通通盖掉,而只采用inf里面配置的,所以自然就小了。其实这个问题很多人都懂,下面才是稍微复杂点的。
 
问2:secedit的configure 和 import参数 的区别是什么呢?
回答:我一度以为import参数是不存在的,这里我也孤陋寡闻了,其实正确的说法应该是xp中不存在,03是存在的,03中的参数比xp中多了很多。虽然我都是在03下写的,但是之前用import参数实在少,所以也没注意到这个参数。之后做了一系列的测试,列一下结果好了,毕竟手册中并没有说这么详细:
 
1.import参数,如果不带overwrite:
    1.1则如果import的库不存在,创建这个库,并且把inf导入库。但是这个库并不立刻使用到系统上。
    1.2如果import的库存在,如果新的inf文件中存在与老的配置冲突的地方,会覆盖老的配置(注意,是覆盖,也就是inf里面的配置起作用),其它未冲突的地方会取并集。(注意这段红字,fish觉得是最重要的,很可能用configure带存在的库不带overwrite也是这种效果)
2.如果用import,带overwrite参数,则全部覆盖,以inf为唯一配置。
  但是要提醒的是,import参数并不立刻修改系统配置,只是把inf导入到db中,可以用(注意,是可以用,也就是人来用,不是机器自动的)这个db来配置系统
3.如果用configure
 是用/db之后指定的db文件来配置(注意,这里是配置了)系统,如果db不存在,则创建一个db,/cfg参数是指配置之前需要塞入到/db参数指定的数据库中的inf,至于带或者不带overwrite的效果,应该和import是一致的。
 
 简单点说,import是用inf配置某个db,configure是用某个db来设置系统,不过这个db在设置系统前还可以插入一些要修改的部分(也就是inf)
sum:fish的客户想做的是:在很多台的机器中统一添加(修改)某个配置,但是又不想使已有配置的存储数据库受到破坏(毕竟一下子也不知道secedit.sdb里面到底存了哪些项,当然,可以用mmc一个一个打开看,这是后话,要说的话又可以发一堆东西了,呵呵,呃。。。等等。。貌似secedit.sdb还不允许打开来着,貌似啊,我也记不太清楚了)。这样的话,最好的办法就是创建一个新的库,把inf写进去配置就好了,就来下面一句:
secedit /configure /db newdb.sdb /cfg test.inf
保证 test.inf的正确性和newdb.sdb的唯一性就行了,不过导出的inf,一般都还是正确的,呵呵。


批处理修改组策略添加开/关机脚本 from http://blog.sina.com.cn/s/blog_4d93c6e70100efxu.html
        对于Windows XP Professional版本,我们可以通过组策略添加开/关机脚本,从而达到开机或关机时运行指定的程序或指令。XP Home Edition没有组策略功能,因此不能够实现。
        手动修改组策略以添加开/关机脚本的方法,网上有介绍,这里就不多说了。本文介绍一下,如何通过批处理修改组策略,从而添加开/关机脚本。
原理介绍
        组策略的开/关机设置后,会在%windir%\system32\GroupPolicy\Machine\Scripts文件夹下创建一个配置文件,名称为scripts.ini。%windir%指系统目录,一般是C:\Windows。GroupPloicy文件夹是一个隐藏文件夹,scripts.ini是一个隐藏文件,因此需要显示隐藏文件才能够看到。
        scripts.ini是一个配置文件,其内部结构如下:

[StartUp]
 0CmdLine=xxxxx
 0Parameters=xxxxx
 [ShutDown]
 0CmdLine=xxxxx
 0Parameters=xxxx

        [Startup]段就是开机前执行的脚本配置段,每一个脚本包括两部分:脚本路径(CmdLine)和参数(Parameters)。由于开机脚本可能不止一个,因此CmdLine和Parameters前面都带有一个数字编号,第一个脚本编号为0,第二个脚本为1,依次类推。
        [ShutDown]段是关机前执行的脚本配置段,其配置结构跟[StartUp]段的完全一样。
        [ShutDown]段和[StartUp]段在Scripts.ini中的书写是不分先后的。
        修改组策略的开关机脚本就是修改这个Scripts.ini配置文件,同样,通过修改Scripts.ini也可以达到修改组策略的目的。不过,修改完Scripts.ini后要执行命令 gpupdate /force 才能够使得修改生效。
        另外需要说明的一点是,虽然组策略在注册表中也是一一对应的,但是个人感觉组策略的级别要高于注册表,即组策略可以引起注册表变化,但修改注册表却不能引起组策略的改变。
批处理添加组策略开关机脚本
        根据前面对组策略开关机脚本设置原理的介绍,想必大家就知道该如何用批处理来修改组策略了吧?对了,就是用批处理修改Scripts.ini文件!
        由于开机执行文件也可以通过添加启动项和计划任务来实现,本文就只写出一个添加关机脚本的批处理:

@echo off
 if "%1"=="exec" goto :exec
 set di=%windir%\system32\GroupPolicy\Machine\Scripts
 >%di%\scripts.ini echo [shutdown]
 >>%di%\scripts.ini echo 0CmdLine=%0
 >>%di%\scripts.ini echo 0Parameters=exec
 gpupdate /force
 pause
 exit
 :exec

echo 关机时间为:%time%>>d:\a.txt
        其中,exec之前的部分为添加脚本的头处理段,exec之后就是你要添加的关机脚本了。比如本批处理,双击后即可把自身添加为关机脚本,点击“关机”按钮后,即可执行exec后面的命令,即向D:\a.txt中写入关机时间。
        需要注意的是,关机脚本一定要能够自己结束。如果关机脚本以pause结束,则会使得计算机一直停留在“正在执行关机脚本”处,并且由于得不到用户交互而不得不硬关机损伤硬盘