无忧启动论坛

标题: 想写一个新建系统账户的批处理,请指教: [打印本页]

作者: lhc0688    时间: 2019-9-6 16:08
标题: 想写一个新建系统账户的批处理,请指教:
系统用户账户管理里面新建账户时候,默认非管理员权限,要手动添加,操作比较麻烦,感觉不适合小白操作。所以想写个批处理,帮小白新建账户,并直接设置为管理员权限。批处理写了个大概,主要就是执行下列两行命令:

net user %u1% /add /logonpasswordchg:yes
net localgroup Administrators %u1% /add

但有个问题,如果新建的账户已经存在,或输入的字符不规范,要怎么检测判断?批处理要怎么写?麻烦坛里的高手帮忙指点指点,先感谢!




附上批处理内容:
@echo off

:menu
cls
set u1=""
set u2=""
echo.
echo.    创建一个新系统登陆账户,并设置为管理员权限
echo.

set /p u1="请输入新建帐户名称:"
if %u1%=="" (
echo.
echo.                  账户名不得为空,按任意键返回请重新输入,退出可直接点击关闭本程序窗口 (
echo.
pause > nul
goto menu
)

echo.
set /p u2="再次输入新帐户名称:"
if %u2%=="" (
echo.
echo.                  账户名不得为空,按任意键返回请重新输入,退出可直接点击关闭本程序窗口
echo.
pause > nul
goto menu
)

if %u1%==%u2% goto xjzh else (
echo.
echo.                  两次输入不一致,按任意键返回请重新输入,退出可直接点击关闭本程序窗口
echo.
pause > nul
goto menu
)

:xjzh
net user %u1% /add /logonpasswordchg:yes
net localgroup Administrators %u1% /add

echo.
echo.                  用户【 %u1%】已创建,请重启计算机并选择新账户登陆,或在 管理计算机用户 中对账户进行设置
echo.
pause > nul
exit

新建用户.txt (912 Bytes, 下载次数: 0)



作者: lhc0688    时间: 2019-9-6 16:30
如果账户已经存在,会出现这样的错误提示:

新建.png (9.58 KB, 下载次数: 71)

新建.png

作者: lhc0688    时间: 2019-9-6 16:33
希望高手能帮忙指点:
1、如何检测判断用户是否存在?
2、如何检测判断输入的有特殊字符?
作者: 窄口牛    时间: 2019-9-6 17:19
本帖最后由 窄口牛 于 2019-9-6 17:31 编辑

先获取个现有账户的列表,用户名没必要输两次确认。特殊字符这个不好解决,等高手吧。搜了一下,现成的有js限制输入非符号的代码。
作者: hszgb    时间: 2019-9-6 17:22
net user 可以获取用户列表
作者: lhc0688    时间: 2019-9-6 17:51
窄口牛 发表于 2019-9-6 17:19
先获取个现有账户的列表,用户名没必要输两次确认。特殊字符这个不好解决,等高手吧。搜了一下,现成的有js ...

如果手误输入错误,直接就创建,两次是不是应该会保险一点。
作者: 窄口牛    时间: 2019-9-6 18:15
嗯,这个可以肯定,但是用户名是明文的,可以直接看到的,所以二次确认稍显累赘。
作者: lhc0688    时间: 2019-9-6 18:15
hszgb 发表于 2019-9-6 17:22
net user 可以获取用户列表

怎么判断 %u1% 在列表内呢?
net user get caption|find /i "%u1%"&&goto zhcf
这样写好像是错误的,提示 找不到用户名
作者: lhc0688    时间: 2019-9-6 18:20
窄口牛 发表于 2019-9-6 18:15
嗯,这个可以肯定,但是用户名是明文的,可以直接看到的,所以二次确认稍显累赘。

有道理,回头改下,先把判断账号存在解决。
作者: nttwqz    时间: 2019-9-6 21:18
感觉这批处理没什么用。

小白用户都是非小白用户给装的系统,要么内置帐户,要么管理员,默认非Users组的从未见过。

小白用户几乎都安装着360卫士、腾讯管家等之类的东西,你这脚本压根儿就运行不了!我写的脚本就有不止一次被报木马!

放弃吧,小白不会就不会吧!
作者: 荣耀    时间: 2019-9-6 21:54
本帖最后由 荣耀 于 2019-9-6 21:57 编辑
  1. set /p name1= 用户名
  2. for /f "delims=用户名 tokens=*" %%i in ('net user %name1%^|find /i "用户名"') do (set user=%%i)
  3. echo %user%
  4. if "%name1%"=="%user%" (
  5. echo 用户名已存在
  6. pause > nul
  7. )else (
  8. echo 用户名不存在
  9. pause > nul
  10. )
  11. pause > nul
复制代码

这个是判断用户名是否存在的
貌似有错,放弃,你拿去改进下,应该可以检测的了。
作者: quya    时间: 2019-9-6 21:54
本帖最后由 quya 于 2019-9-6 21:56 编辑

无需判断账户是否存在或者用户名输入不规范, 只要出错就重来

比如
net user xxx /add 2>nul||echo 用户名存在或有非法字符 &&goto menu
作者: lhc0688    时间: 2019-9-6 21:55
nttwqz 发表于 2019-9-6 21:18
感觉这批处理没什么用。

小白用户都是非小白用户给装的系统,要么内置帐户,要么管理员,默认非Users组 ...

说的确实有道理,但还是想尝试提供一些常用操作,看是否能改变一下小白滥用用数字大师的习惯,为减少数字灾害做些努力。

未标题-1.jpg (115.55 KB, 下载次数: 80)

未标题-1.jpg

作者: lhc0688    时间: 2019-9-6 22:04
quya 发表于 2019-9-6 21:54
无需判断账户是否存在或者用户名输入不规范, 只要出错就重来

比如

谢谢!这个方法应该可以,但提示信息不能暂停,直接回到menu,要怎么完善呢?
作者: quya    时间: 2019-9-6 22:07
本帖最后由 quya 于 2019-9-6 22:10 编辑
lhc0688 发表于 2019-9-6 22:04
谢谢!这个方法应该可以,但提示信息不能暂停,直接回到menu,要怎么完善呢?


net user xxx /add 2>nul||echo 用户名存在或有非法字符&&echo.&&pause &&cls&&goto menu

你menu中已经有了cls, 可以删除 &&cls

作者: 荣耀    时间: 2019-9-6 22:13
荣耀 发表于 2019-9-6 21:54
这个是判断用户名是否存在的
貌似有错,放弃,你拿去改进下,应该可以检测的了。

改进三处地方 delims tokens find 就行
作者: lhc0688    时间: 2019-9-6 22:17
quya 发表于 2019-9-6 22:07
net user xxx /add 2>nul||echo 用户名存在或有非法字符&&echo.&&pause &&cls&&goto menu

你menu中 ...

可以暂停提示了,但判断好像出错

01.png (4 KB, 下载次数: 72)

01.png

作者: nttwqz    时间: 2019-9-6 22:18
lhc0688 发表于 2019-9-6 21:55
说的确实有道理,但还是想尝试提供一些常用操作,看是否能改变一下小白滥用用数字大师的习惯,为减少数字 ...

支持这么伟大的尝试,虽然你也改变不了什么……
作者: lhc0688    时间: 2019-9-6 22:19
荣耀 发表于 2019-9-6 21:54
这个是判断用户名是否存在的
貌似有错,放弃,你拿去改进下,应该可以检测的了。

好的,非常感谢,我先试试quya朋友的方法,两种都参考下。
作者: lhc0688    时间: 2019-9-6 22:21
荣耀 发表于 2019-9-6 22:13
改进三处地方 delims tokens find 就行


作者: quya    时间: 2019-9-6 22:21
本帖最后由 quya 于 2019-9-6 22:24 编辑
lhc0688 发表于 2019-9-6 22:17
可以暂停提示了,但判断好像出错


你先把2次输入这个去掉,程序只要好用就应该简洁点。

我没仔细看你的程序,自己判断吧。或者你把 2>nul去掉, 就可以看到为什么出错了。 2>nul 屏蔽了出错信息
作者: 荣耀    时间: 2019-9-6 22:27
本帖最后由 荣耀 于 2019-9-6 22:30 编辑
  1. @echo off
  2. >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
  3. if '%errorlevel%' NEQ '0' (
  4. goto UACPrompt
  5. ) else ( goto gotAdmin )
  6. :UACPrompt
  7. echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
  8. echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
  9. "%temp%\getadmin.vbs"
  10. exit /B
  11. :gotAdmin
  12. if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
  13. title www.nat.ee
  14. color 2F
  15. :menu
  16. cls
  17. echo.
  18. echo.    创建一个新系统登陆账户,并设置为管理员权限
  19. echo.

  20. set /p u1="请输入新建帐户名称:"
  21. for /f " tokens=*" %%i in ('net user %u1%^|find /i "命令成功完成"') do (set user=%%i)
  22. if "%user%"=="%命令成功完成。" (
  23. echo 用户名已存在
  24. pause > nul
  25. goto menu
  26. )else (goto user1)
  27. :user1
  28. if %u1%=="" (
  29. echo.
  30. echo.                  账户名不得为空,按任意键返回请重新输入,退出可直接点击关闭本程序窗口 (
  31. echo.
  32. pause > nul
  33. goto menu
  34. )
  35. :user2
  36. echo.
  37. set /p u2="再次输入新帐户名称:"
  38. if %u2%=="" (
  39. echo.
  40. echo.                  账户名不得为空,按任意键返回请重新输入,退出可直接点击关闭本程序窗口
  41. echo.
  42. pause > nul
  43. goto menu
  44. )

  45. if %u1%==%u2% goto xjzh else (
  46. echo.
  47. echo.                  两次输入不一致,按任意键返回请重新输入,退出可直接点击关闭本程序窗口
  48. echo.
  49. pause > nul
  50. goto menu
  51. )

  52. :xjzh
  53. net user %u1% /add /logonpasswordchg:yes
  54. net localgroup Administrators %u1% /add

  55. echo.
  56. echo.                  用户【 %u1%】已创建,请重启计算机并选择新账户登陆,或在 管理计算机用户 中对账户进行设置
  57. echo.
  58. pause > nul
  59. exit
  60. pause
复制代码

你试试,这样应该没问题的了,解决了判断的问题。
作者: lhc0688    时间: 2019-9-6 22:33
本帖最后由 lhc0688 于 2019-9-6 22:41 编辑
lhc0688 发表于 2019-9-6 22:17
可以暂停提示了,但判断好像出错


@echo off

:menu
cls
set u1=""
echo.
echo.    创建一个新用户账号,并设置为管理员权限
echo.

set /p u1="请输入新建帐户名称:"
if %u1%=="" (
echo.
echo.                  账户名不得为空,按任意键返回请重新输入,退出可直接点击关闭本程序窗口 (
echo.
pause > nul
goto menu
)

echo.
echo.
net user %u1% /add /logonpasswordchg:yes 2>nul||echo.  -- 该用户名已存在,或有非法字符,请重新输入&&echo.&&pause &&goto menu
net localgroup Administrators %u1% /add

echo.
echo.                  用户【 %u1%】已创建,请切换新账户登陆并设置密码,或在【管理计算机用户】中对账户进行设置
echo.
pause > nul
exit

作者: 荣耀    时间: 2019-9-6 22:34
我在给你完善些,等我下个版本,完美解决
作者: lhc0688    时间: 2019-9-6 22:36
在荣耀、quya两位朋友帮助下,基本完成。再次感谢!

剩下就是如何提升账户权限(运行批处理命令不需要右键管理员),现在虽然加了管理员权限,但好像还是会提示。
作者: 荣耀    时间: 2019-9-6 22:41
lhc0688 发表于 2019-9-6 22:36
在荣耀、quya两位朋友帮助下,基本完成。再次感谢!

剩下就是如何提升账户权限(运行批处理命 ...
  1. >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
  2. if '%errorlevel%' NEQ '0' (
  3. goto UACPrompt
  4. ) else ( goto gotAdmin )
  5. :UACPrompt
  6. echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
  7. echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
  8. "%temp%\getadmin.vbs"
  9. exit /B
  10. :gotAdmin
  11. if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
复制代码

这个就是脚本自启权限
作者: lhc0688    时间: 2019-9-6 22:46
荣耀 发表于 2019-9-6 22:27
你试试,这样应该没问题的了,解决了判断的问题。

这样写检测应该更准确,可以把用户存在检测跟非法字符检测分开,不过语句好像还是有点问题。

02.png (4.04 KB, 下载次数: 79)

02.png

作者: quya    时间: 2019-9-6 22:47
本帖最后由 quya 于 2019-9-6 22:51 编辑

获得管理员权限代码也可以简洁点

  1. bcdedit >nul 2>nul &&goto gotadmin
  2. :UACPrompt
  3. echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
  4. echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
  5. "%temp%\getadmin.vbs"
  6. exit /B
  7. :gotAdmin
  8. if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
复制代码


普通用户其实是无法执行加入用户和管理员组这2句代码的, 否则人人都可以提权了。
作者: lhc0688    时间: 2019-9-6 22:54
quya 发表于 2019-9-6 22:47
获得管理员权限代码也可以简洁点

两位的语法太高深了,彻底看不明白了,不过这个提升的是当前用户权限吧?如何提升 %u1%权限,直接用变量替换吗?
作者: lhc0688    时间: 2019-9-6 22:58
如果能在新建账号时同步设置提升权限最好,不好操作的话,单独做个批处理,登陆后再提升应该也可以。
作者: lhc0688    时间: 2019-9-6 23:07
做这个批处理的初衷,就是发现系统装好后(默认administrator账号+空密码登陆),有的使用者会新建账号并设置密码,因为两个账号登陆时候要选择,所以又会禁用掉administrator,这样如果新建的账号是user权限,那后面就没法再启用admin。。。
作者: quya    时间: 2019-9-6 23:08
本帖最后由 quya 于 2019-9-6 23:17 编辑

> nul dir 等于 dir >nul 表示结果输出到了 nul, 没有输出, 也可以 1>nul
2 >&1 等于 2>nul 表示出错信息或者其他重要信息输出到了 nul

就是眼不见心不烦的意思

出错信息是@echo off 无法屏蔽的,只有 2>nul 能屏蔽, 某些重要信息甚至连 2>nul 都无法屏蔽
一般批处理调试阶段不用 2>nul 命令,因为能及时发现错误, 基本完成之后发现 @echo off 以后还会出现这些冗余信息,为了美观才用 2>nul
作者: 荣耀    时间: 2019-9-6 23:15
lhc0688 发表于 2019-9-6 23:07
做这个批处理的初衷,就是发现系统装好后(默认administrator账号+空密码登陆),有的使用者会新建账号并设 ...

完美解决判断方案就是 判断 C:\User目录下,是否存在用户名文件夹,这样就不会有那个用户名不存在的提示了。由于时间关系,我就不搞了 dir /b C:\User^|find /i %用户名%
作者: quya    时间: 2019-9-6 23:27
荣耀 发表于 2019-9-6 23:15
完美解决判断方案就是 判断 C:%user目录下,是否存在用户名文件夹,这样就不会有那个用户名不存在的提示 ...

没意思判断这个

实在要判断也是 net user %username% /add ^|find "已存在"可靠些,当然只对中文版有效。但是这个句子就不能用 net user %username% /add 2> nul ^|find "已存在" 来屏蔽出错信息,因为屏蔽了就无法find, 不屏蔽不美观。

最靠谱的当然 net user 去一个个find匹配或者for 语句去找是否相等,但是太麻烦,毫无必要。

说不可靠,因为可以存在用户而不存在你说的文件夹。比如从未登陆过,被人在PE中删除了那个文件夹等等。
作者: lhc0688    时间: 2019-9-6 23:45
两段提权脚本刚测试了下,好像没提权成功,直接运行批处理还是会提示拒绝访问。
作者: 15126222223    时间: 2019-9-6 23:53
  1. [url=home.php?mod=space&uid=336905]@echo[/url] OFF
  2. color 0a
  3. REM --> 检查获取管理员权限
  4. >nul 2>&1 "%windir%\system32\cacls.exe" "%windir%\system32\config\system"
  5. if %ERRORLEVEL% EQU 0 Goto :gotAdmin
  6. echo 请求管理员权限...
  7. mshta vbscript:createobject("shell.application").shellexecute("%~s0","","","runas",1)(window.close) & goto :eof
  8. :gotAdmin
  9. pushd %cd% & cd /d "%~dp0"
  10. REM --------------------------------------
  11. title ★ 检查获取管理员权限 ★
  12. echo 你已经具备管理权限了。。。
  13. pause
复制代码


这个是我朋友发给我的提权处理,不知道是否能帮到你。
作者: 荣耀    时间: 2019-9-6 23:55
quya 发表于 2019-9-6 23:27
没意思判断这个

实在要判断也是 net user %username% /add ^|find "已存在"可靠些,当然只对中文版有 ...

net user %username% /add ^|find "已存在"
这不矛盾? 存不存在都在添加用户,叫判断?
作者: lhc0688    时间: 2019-9-7 00:02
Windows Registry Editor Version 5.00
;
;用户帐户控制: 用于内置管理员账户的管理员批准模式,改为"已启用"、在管理员批准模式下运行所有管理员,改为"已禁用"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]
"FilterAdministratorToken"=dword:00000001
"EnableLUA"=dword:00000000
-----------------------------------------------------
这样可以将当前用户提升为管理员(运行cmd时候,窗口标题显示为 管理员)
奇怪,是不是我对提升权限的理解有歧义?
作者: 9zhmke    时间: 2019-9-7 00:11
总觉得批处理在字符串上面很烦琐,所以十年前就用VBS来做了这个功能,网上到处都可以搜到这些代码,如果有兴趣的话也可以放上来给你参考。
作者: lhc0688    时间: 2019-9-7 00:14
测试发现,用这个新建用户批处理,在win7下新建用户,运行cmd不是管理员,需要刚才那段reg;但在win81下新建用户,运行cmd直接就是管理员,不知道是什么情况。
作者: lhc0688    时间: 2019-9-7 00:20
好像搞明白了,这个win81做精简的时候应该是优化过管理员权限,win7没有。
这样的话就简单了,win7也提前加入优化就可以了。
作者: quya    时间: 2019-9-7 08:09
本帖最后由 quya 于 2019-9-7 08:13 编辑
荣耀 发表于 2019-9-6 23:55
net user %username% /add ^|find "已存在"
这不矛盾? 存不存在都在添加用户,叫判断?


并不矛盾呀,判断出错信息也是判断啊。
只是我上面的语句有些问题,出错信息先要重定向到屏幕输出才行。

以下语句应该能正确执行,只是在中文windows 10下测试成功,如果其他版本相应出错信息不一样,则需要修改下。

net user %username% /add  2>&1|find "存在" &&echo 用户名存在&&echo.&&pause &&goto menu
net user %username% /add  2>&1|find "无效" &&echo 用户名不能含有特殊字符&&echo.&&pause &&goto menu

话说回来,这种做法真的没必要,一句句子就能简明指出错误,非得要2句甚至更多句子来细化给终端用户看, 有点无聊。
作者: 9zhmke    时间: 2019-9-7 14:17

  1. Dim WshShell,ver,windir,val(500,3),reg,srv_dict,firewall_dict
  2. Set WshShell=WScript.CreateObject("WScript.Shell")
  3. Set objFSO = CreateObject("Scripting.FileSystemObject")
  4. Set objWMIService = GetObject("winmgmts:\\.")
  5. Set Shell=CreateObject("Shell.Application")
  6. Set srv_dict=CreateObject("Scripting.Dictionary") '需调整的服务
  7. Set firewall_dict=CreateObject("Scripting.Dictionary")'需禁止接连网络的程序
  8. Set objRegistry=GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
  9. Const HKEY_CLASSES_ROOT = &H80000000
  10. Const HKEY_CURRENT_USER = &H80000001
  11. Const HKEY_LOCAL_MACHINE = &H80000002
  12. tmp1="用户名"
  13. tmp2="用户密码"
  14. tmp1=trim(tmp1):tmp2=trim(tmp2)
  15. if ver>5.5 then '如果是Win78则试写注册表以检查权限,如果没有权限则以管理身份重新运行
  16.     If WScript.Arguments.length = 0 Then
  17.         Shell.ShellExecute "wscript.exe", Chr(34) &  WScript.ScriptFullName & Chr(34) & " uac", "", "runas", 1
  18.         WScript.quit
  19.     End If
  20. '如果是78则打开管理员使用应用.
  21.     SetRegACL("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System")
  22.     WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA",0,"REG_DWORD" '是否开启UAC
  23.     WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\PromptOnSecureDesktop",0,"REG_DWORD" '桌面是否变黑
  24.     WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\ConsentPromptBehaviorAdmin",0,"REG_DWORD" '通知强度级别
  25. end if
  26. msgbox tmp1
  27. user tmp1,tmp2'添加用户:
  28. '设置自动登陆
  29. 'WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultUserName",tmp1,"REG_SZ"
  30. 'WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultDefaultPassword",tmp2,"REG_SZ"
  31. 'WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoAdminLogon",1,"REG_DWORD"
  32. 'WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\ForceAutoLogon",1,"REG_DWORD"
  33. Wscript.Quit



  34. Function user(username,password) '没有用户就新建/设置密码,并永不过期/加到超级组
  35.     dim mo,ObjServices
  36.     Set objWMI = GetObject("Winmgmts:\\.\Root\Cimv2")
  37.     Set ObjServices =objWMI.ExecQuery("Select * From Win32_Service")
  38.     on error resume next
  39.         For Each mo In ObjServices
  40.             If mo.Name = "LanmanWorkstation" Then
  41.                 mo.ChangeStartMode("Automatic")
  42.                 user=mo.Start()
  43.                 exit for
  44.             End if
  45.         Next
  46.         Set objWMI = nothing
  47.         Set ObjServices = nothing
  48.         debug("检查" & username & "权限和密码是否正确")
  49.         Set wbemServices = Getobject("winmgmts:\\.")
  50.         Set wbemObjectSet=wbemServices.execquery("select name from win32_userAccount")
  51.         user=""
  52.         For Each mo In wbemObjectSet
  53.             if mo.name=username then
  54.                 user=mo.name
  55.                 exit for
  56.             end if
  57.         Next
  58.         err.clear
  59.         Set wbemServices=GetObject("WinNT://.")   '得到adsi接口,绑定
  60.         if err.number<>0 then
  61.             debug("工作站服务未正常运行,无法对用户进行操作,本操作被跳过")
  62.             err.clear
  63.             user=username
  64.         end if
  65.         If user = "" Then '无此用户则建立,有则取得句柄
  66.             Set wbemObjectSet=wbemServices.Create("user",username) '建立用户
  67.         Else
  68.             Set wbemObjectSet = GetObject("WinNT://./"&username)'得到用户
  69.         End If
  70.         wbemObjectSet.SetPassword password      '设置密码
  71.         wbemObjectSet.Put "UserFlags", &H10201'设置密码永不过期
  72.         wbemObjectSet.accountdisabled=false    '设置账号不禁用
  73.         wbemObjectSet.SetInfo               '保存
  74.         user="失败."
  75.         Set wbemServices = GetObject("WinNT://./Administrators")
  76.         Set wbemObjectSet = GetObject("WinNT://"&username)'得到用户
  77.         wbemServices.Add(wbemObjectSet.ADsPath)
  78.         user="搞定"
  79.     On error resume next
  80.     Set wbemServices= nothing
  81.     Set wbemObjectSet= nothing
  82. End Function


  83. Function SetRegACL(reg_path) '为当前用户设置注册表权限
  84.     Set ini_file = Nothing
  85.     dim tmp1,tmp2,tmp3
  86.     tmp3=WshShell.ExpandEnvironmentStrings("%temp%") & "\setacl."
  87.     tmp2="\if":tmp1=reg_path:if right(reg_path,1)<>"" then tmp1=reg_path & ""
  88.     on error resume next
  89.           objFSO.deletefile tmp3 & "ini",true
  90.           tmp2=WshShell.RegRead(tmp1)
  91.     on error goto 0
  92.     if tmp2="\if" then SetRegACL="没找到注册表" & reg_path :Exit Function
  93.     Set ini_file = objFSO.OpenTextFile(tmp3 & "ini",8,True,0)
  94.     tmp2=tmp1
  95.     tmp2=replace(tmp2,"HKEY_LOCAL_MACHINE","MACHINE",1,-1,1)
  96.     tmp2=replace(tmp2,"HKEY_CLASSES_ROOT","CLASSES_ROOT",1,-1,1)
  97.     tmp2=replace(tmp2,"HKEY_CURRENT_USER","CURRENT_USER",1,-1,1)
  98.     tmp2=replace(tmp2,"HKEY_USERS","USERS",1,-1,1)
  99.     tmp2=replace(tmp2,"HKEY_CURRENT_CONFIG","CURRENT_CONFIG",1,-1,1)
  100.     ini_file.WriteLine "[Version]" & chr(13) & "Signature = ""$Chicago$""" & chr(13) & chr(13) & "[Registry Keys]"
  101.     ini_file.WriteLine chr(34) & tmp2 & chr(34) & ", 0, "& chr(34) & "O:BA" & chr(34)
  102.     Set ini_file = Nothing
  103.     WshShell.Run "secedit /configure /db " & tmp3 & "sdb /cfg " & tmp3 & "ini /quiet",0,true '先获得所有权
  104.     objFSO.deletefile tmp3 & "ini",true
  105.     Set ini_file = objFSO.OpenTextFile(tmp3 & "ini",8,True,0)
  106.     ini_file.WriteLine tmp1 & " [1 5 7 11 14 17 21]"
  107.     Set ini_file =  Nothing
  108.     WshShell.Run "regini " & tmp3 & "ini",0,true '再设权限
  109.     objFSO.deletefile tmp3 & "ini",true
  110.     SetRegACL="正常完成"
  111. End Function
复制代码

作者: lhc0688    时间: 2019-9-7 14:49
9zhmke 发表于 2019-9-7 14:17

这个太强大了,不过我调用那两个命令方式好像也可以,访问注册表权限也没问题。
作者: 窄口牛    时间: 2019-9-11 08:05
vbs要是掌握的好,用vbs的话,需要躲避的符号就比批处理少多了。




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3