问题:powershell执行net user Administrator "xRycdC302ji!a#Qyu$^C" 设置密码成功了,但密码不是xRycdC302ji!a#Qyu$^C
详述:
powershell脚本里是
net user Administrator "密码"
但实际上,这样是有缺陷的,特殊字符可能出现语法情况:执行不下去或者执行下去了是错的
①执行不下去,例如转义字符`结尾
net user Administrator "QYv_lr6dx6cj`"
②执行下去了是错的,例如:
net user Administrator "xRycdC302ji!a#Qyu$^C"
跟
cmd.exe /c 'net user Administrator "xRycdC302ji!a#Qyu$^C"'
是不一样的结果,虽然都设置密码成功,但cmd.exe /c 'net user Administrator "xRycdC302ji!a#Qyu$^C"'才是符合预期的
如图,虽然2个都成功,但效果不一样,如果拿xRycdC302ji!a#Qyu$^C去登录,后者能登录,前者不行
在 PowerShell 里,双引号会做插值($ 开头会被当作变量)、反引号是转义符号
设置密码的时候需要注意,尤其是# $ ^ ` /等特殊字符尽量不用
部分特殊字符在双引号里的特殊位置、特殊组合,会被解析或改变,导致传给 net 的实际字符串和你看到的不一致
如果密码可能以反引号结尾或包含 $ 等字符,切忌使用双引号,单引号方式最可靠
直接用 cmd.exe 调用或用 stop-parsing (--%) 会避免 PowerShell 的解析,所以那种方式得到的密码是正确的
如果密码里有多个单引号,比如有3个单引号(字面意思,即肉眼在锁屏界面要输入3个单引号),怎么用命令设置密码?
# 密码示例:Abc'''def321(包含 3 个连续单引号)
$pwPlain = 'Abc''''''def321' # 6 个单引号代表字面上的 3 个单引号
$pw = ConvertTo-SecureString $pwPlain -AsPlainText -Force
Set-LocalUser -Name 'Administrator' -Password $pw
$quotes = [string]::new([char]39, 3)
$pwPlain = 'Abc' + $quotes + 'def321'
$pwPlain
$secure = ConvertTo-SecureString $pwPlain -AsPlainText -Force
Set-LocalUser -Name 'Administrator' -Password $secure
$quotes = [string]::new([char]39, 3)
$pwPlain = 'Abc' + $quotes + 'def321'
$pwPlain
$user = [ADSI]"WinNT://./Administrator,user"
$user.SetPassword($pwPlain)
在powershell里执行net user Administrator "xRycdC302ji!a#Qyu$^C"生效的密码一般不是字面密码,具体是什么,还真不一定,以下就是几种生效不一样的情况
①生效的密码是xRycdC302ji!a#QyuC
"xRycdC302ji!a#Qyu$^C"|Format-Hex -Encoding Unicode
net user Administrator "xRycdC302ji!a#Qyu$^C"
"xRycdC302ji!a#Qyu$^C"|Format-Hex -Encoding Unicode
这段命令里,net user Administrator "xRycdC302ji!a#Qyu$^C"之前的上一个字符串是空,所以最终密码是xRycdC302ji!a#QyuC(用空替代$^占位即可)
②生效的密码是xRycdC302ji!a#QyuxRycdC302ji!a#Qyu$^CC
'xRycdC302ji!a#Qyu$^C'|Format-Hex -Encoding Unicode
"xRycdC302ji!a#Qyu$^C"|Format-Hex -Encoding Unicode
net user Administrator "xRycdC302ji!a#Qyu$^C"
"xRycdC302ji!a#Qyu$^C"|Format-Hex -Encoding Unicode
这段命令里,net user Administrator "xRycdC302ji!a#Qyu$^C"之前的上一个字符串是xRycdC302ji!a#Qyu$^C,所以最终密码是xRycdC302ji!a#QyuxRycdC302ji!a#Qyu$^CC(用xRycdC302ji!a#Qyu$^C替代$^占位即可)
③生效的密码是xRycdC302ji!a#QyunetC
net user Administrator "QYv_lr6dx6cj"
"xRycdC302ji!a#Qyu$^C"|Format-Hex -Encoding Unicode
net user Administrator "xRycdC302ji!a#Qyu$^C"
"xRycdC302ji!a#Qyu$^C"|Format-Hex -Encoding Unicode
这段命令里,net user Administrator "xRycdC302ji!a#Qyu$^C"之前的上一个字符串是net,所以最终密码是xRycdC302ji!a#QyunetC(用net替代$^占位即可)
④生效的密码是xRycdC302ji!a#QyuhostC
host
"xRycdC302ji!a#Qyu$^C"|Format-Hex -Encoding Unicode
net user Administrator "xRycdC302ji!a#Qyu$^C"
"xRycdC302ji!a#Qyu$^C"|Format-Hex -Encoding Unicode
这段命令里,net user Administrator "xRycdC302ji!a#Qyu$^C"之前的上一个字符串是host,所以最终密码是xRycdC302ji!a#QyuhostC(用host替代$^占位即可)
⑤生效的密码是xRycdC302ji!a#QyuhostnameC
hostname
"xRycdC302ji!a#Qyu$^C"|Format-Hex -Encoding Unicode
net user Administrator "xRycdC302ji!a#Qyu$^C"
"xRycdC302ji!a#Qyu$^C"|Format-Hex -Encoding Unicode
这段命令里,net user Administrator "xRycdC302ji!a#Qyu$^C"之前的上一个字符串是hostname,所以最终密码是xRycdC302ji!a#QyuhostnameC(用hostname替代$^占位即可)
⑥生效的密码是xRycdC302ji!a#QyuwhoamiC
whoami
"xRycdC302ji!a#Qyu$^C"|Format-Hex -Encoding Unicode
net user Administrator "xRycdC302ji!a#Qyu$^C"
"xRycdC302ji!a#Qyu$^C"|Format-Hex -Encoding Unicode
这段命令里,net user Administrator "xRycdC302ji!a#Qyu$^C"之前的上一个字符串是whoami,所以最终密码是xRycdC302ji!a#QyuwhoamiC(用whoami替代$^占位即可)
总结:
net user Administrator "xRycdC302ji!a#Qyu$^C"在powershell里执行后,
真正生效的密码跟net命令之前的那句命令有关,$^会被前一句命令的第一个字符串占位替换
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。