Board logo

标题: [网络连接] 【已解决】NET USE在批处理for循环中无法使用的问题 [打印本页]

作者: SeanJuicer    时间: 2024-3-1 10:10     标题: 【已解决】NET USE在批处理for循环中无法使用的问题

本帖最后由 SeanJuicer 于 2024-3-1 21:20 编辑
  1. set H_error=
  2. for /f "tokens=2 delims=。 " %%i in ('net use H: \\192.168.1.100\app "/user:admin" "admin" /persistent:no ^| findstr [0123456789]') do (
  3.     set H_error=%%i
  4. )
  5. echo. %H_error%
  6. pause
复制代码
这段代码意在遇到net use错误时输出错误代码,但是使用中永远会提示错误代码
  1. 发生系统错误 1219:
  2. 不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接
复制代码
命令从for循环中单独拎出来就可以顺利映射

希望各位大神给点指点,感谢!

已经没有任何映射或者其它用户挂载,并且在执行前已经net use * /del /y

用自增变量计数或者在for里写goto跳转出来,也是同样的结果,计数也是显示循环了一次而已

作者: qixiaobin0715    时间: 2024-3-1 10:13

本帖最后由 qixiaobin0715 于 2024-3-1 10:17 编辑
  1. for /f "tokens=2 delims=。 " %%i in ('net use H: \\192.168.1.100\app "/user:admin" "admin" /persistent:no 2^>^&1 ^| findstr [0123456789]') do echo,%%i
复制代码
  1. @echo off
  2. set H_error=
  3. for /f "tokens=2 delims=。 " %%i in ('net use H: \\192.168.1.100\app "/user:admin" "admin" /persistent:no ^| findstr [0123456789]') do (
  4.     set H_error=%%i
  5. )
  6. echo,%H_error%
  7. pause
复制代码

作者: SeanJuicer    时间: 2024-3-1 10:17

回复 2# qixiaobin0715
  1. do echo,%%i
复制代码
请问,只是do那里不同吗?我需要set 成一个变量,后面再输出
作者: SeanJuicer    时间: 2024-3-1 10:18

回复 2# qixiaobin0715


    好的,我现在就试一下,感谢
作者: SeanJuicer    时间: 2024-3-1 10:20

回复 2# qixiaobin0715


    好像还是提示1219
作者: SeanJuicer    时间: 2024-3-1 11:41

回复 2# qixiaobin0715


    我又去测试了一下不同机器,有些电脑又是没问题的,我下午再检查一下,可能不是代码的问题。

先谢谢。
作者: czjt1234    时间: 2024-3-1 11:41

  1. @echo off
  2. set H_error=
  3. for /f "tokens=2 delims=。 " %%i in ('net use H: \\192.168.0.7\111 "/user:admin" "Aa123456" /persistent:no 2^>^&1 ^| findstr [0123456789]') do (
  4.     set H_error=%%i
  5. )
  6. echo,%H_error%
  7. pause
复制代码
我在 win7主机 和 win7虚拟机 测试没问题
你是啥系统?
作者: Batcher    时间: 2024-3-1 13:41

回复 6# SeanJuicer


比较一下正常的电脑和不正常的电脑,它们的 net use 命令返回值的格式是否有差异。
如果自己看不出来,请把它们写入文本文件上传到网盘。
作者: wlf2r    时间: 2024-3-1 15:33

回复 1# SeanJuicer


    连之前先做删除操作 net use ip /del
作者: SeanJuicer    时间: 2024-3-1 16:05

本帖最后由 SeanJuicer 于 2024-3-1 16:22 编辑

回复 7# czjt1234

运行此命令
  1. @echo off
  2. set H_error=
  3. for /f "tokens=2 delims=。 " %%i in ('net use H: \\192.168.0.7\111 "/user:admin" "Aa123456" /persistent:no 2^>^&1 ^| findstr [0123456789]') do (
  4.     set H_error=%%i
  5. )
  6. echo,%H_error%
  7. pause
复制代码
环境:
Windows 11 专业工作站版 22631.3155
全部都是自行封装的WIN11系统纯净镜像,运行没问题的是同一个虚拟机母盘早些月份封装

FOR循环挂载无错机器:
最后安装的补丁:2024-适用于 Windows 11 Version 23H2 的 02 累积更新,适合基于 x64 的系统 (KB5034765)
待更新的补丁:2024-适用于 Windows 11 Version 23H2 的 02 累积更新,适合基于 x64 的系统 (KB5034848)
FOR循环有问题的机器:
已安装全部最新补丁

打印结果
  1. 发生系统错误 1219。
  2. 不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接。中断与此服务器或共享资源的所有连接,然后再试一次。
复制代码
有问题的机器去掉这段代码
  1. 2^>^&1 ^| findstr [0123456789]
复制代码
就可以挂载成功。

如果按照原始代码执行,哪怕我故意填入错误的账号和密码,出错信息都是1219,而去掉上面那段代码,打印的错误会如实出现,比如86,密码错误。

有问题的镜像重做系统3次,问题都存在,而其它不论是win10,还是我早些时候封装的win11,都无此问题,可以顺利挂载顺利读出错误代码

我所做的测试全部都会在前面执行net use * /del /y,因为不执行清除,挂载是成功的。
.
.
.
.
作者: SeanJuicer    时间: 2024-3-1 16:09

我准备更新这台没问题的win11那个补丁,看下问题是否会复现,真是奇了怪了。
作者: czjt1234    时间: 2024-3-1 16:13

自从纳德拉担任CEO解除了测试部门后,每次微软出补丁都会让全世界的技术维护员心惊胆战

记得有次补丁造成文件可以共享,但打印机不能共享。。。那个电话啊那个痛苦啊
作者: SeanJuicer    时间: 2024-3-1 16:26

更新补丁到最新,没有复现问题!
作者: czjt1234    时间: 2024-3-1 16:37

会不会账户限制,同一账户只允许一个远程连接之类
作者: SeanJuicer    时间: 2024-3-1 16:41

回复 14# czjt1234


    不会,那台服务器是群晖,同一个账号已经在其它电脑重复登陆过了,是不限制SMB同时登陆的。
作者: SeanJuicer    时间: 2024-3-1 16:59

一会下班回家,在家里做个系统连接家里的服务器,看看问题是否存在。再回溯一下封装的母盘,看看哪一步的优化对这个代码运行产生影响了。
作者: SeanJuicer    时间: 2024-3-1 19:41

测试了,虚拟机内直接安装系统连接自己的服务器也是不行的,看来是这次封装优化了某个地方导致了这个问题,我检查一下。
作者: czjt1234    时间: 2024-3-1 19:53

虚拟机装了win23H2自动更新后测试
出现1219错误,net use查看列表确实是空的
但是,我本机是guest用户无密码就可以访问的
我是复制代码在本机,然后虚拟机的win11通过网上邻居复制的批处理
此时net use查看列表确实是空的

也就是说,确实已经存在了一个网络连接,所以报1219错误
此时运行7楼的代码,输出为1219

我重启虚拟机的win11,不打开网上邻居
此时运行运行7楼的代码,输出为86,也就是密码错误
作者: SeanJuicer    时间: 2024-3-1 20:18

回复 18# czjt1234


    感谢如此认真对待,我已经发现问题所在,我现在整理一下
作者: SeanJuicer    时间: 2024-3-1 20:31

本帖最后由 SeanJuicer 于 2024-3-1 20:33 编辑

回复 18# czjt1234


首先,你的测试简直太精准了,直击问题要害。

其次,答案正如你所料,是两个账户访问同一个会话的原因。


这个问题发生的原因是,最新镜像有个需求,就是以管理员身份运行的程序需要访问到映射的网络磁盘

于是我做了一个优化项目:管理员访问网络驱动器


因为我每封装一次镜像都会在虚拟机内打快照,按照与上次优化的项目逐一对比,发现了这一项,才想起来。



还原优化项目,问题迎刃而解。


引用微软官方的一篇相关的文档:
当 UAC 配置为提示输入凭据时,从提升的提示中无法使用映射驱动器

摘取一段内容:
原因
启用 UAC 后,系统会在用户登录时创建两个登录会话。 这两个登录会话相互链接。 一个会话表示提升会话期间的用户,另一个会话表示你在用户权限最低的情况下运行的另一个会话。


这个代码以普通权限创建了一个连接,又想以管理员身份创建连接,所以就提示1219了。

问题找到了,那么为何去掉
  1. findstr [0123456789]
复制代码
就可以映射了呢?我的需求似乎还是没有解决,哈哈

.
.
.
作者: SeanJuicer    时间: 2024-3-1 20:36

回复 8# Batcher


    顺便感谢一下管理员,帮助过我好多次了哈哈
作者: SeanJuicer    时间: 2024-3-1 20:46

本帖最后由 SeanJuicer 于 2024-3-1 21:06 编辑

我的代码头部有setlocal enabledelayedexpansion变量延迟

会导致这个问题,去掉就可以挂载不出现1219了,关闭延迟就好了,我测试一下去
作者: SeanJuicer    时间: 2024-3-1 21:10

结论:如果开启了管理员访问网络驱动器,这个for循环net use需要关闭变量延迟扩展才能顺利执行。否则开不开都不影响代码。

不知我这个结论对不对?
作者: 77七    时间: 2024-3-1 21:10

回复 22# SeanJuicer


   如果setlocal 和endlocal 之间设置的变量,后面的代码不再使用可以直接关;如果需要使用可以试试 帖子中方法 (http://www.bathome.net/redirect.php?goto=findpost&ptid=9074&pid=275675)
作者: SeanJuicer    时间: 2024-3-1 21:19

回复 24# 77七


    明白了,感谢




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2