Board logo

标题: 紧急求救,达人们请进!万分感激! [打印本页]

作者: outmind     时间: 2006-11-29 14:02    标题: 紧急求救,达人们请进!万分感激!
我手中有几百台WINDOWS服务器,现在需要每个月根据上面的安排重启一次。每台依次重启非常麻烦,想请教各位用什么方法,来下发命令或者重启比较便捷,谢谢!万分感激! 基本需要是能够根据上面下达的时间灵活批量重启所有机器,并且部署起来不需要花太多的时间。谢谢! 有好的方法能提高效率的达人最好加我QQ:9314651 ,再次感谢!

作者: tianzizhi     时间: 2006-11-30 01:52
请问一下你的几百台服务器的ip是怎样的,
远程重启用shutdown
条件为必须为每台机子赋予可以远程重启的权利,在需要远程重启的每台机子上执行下面的操作,
1、单击“开始”按钮,选择“运行”,在对话框中输入“gpedit.msc”,然后单击“确定”,打开“组策略编辑器”。
  2、在“组策略”窗口的左窗格中打开“计算机配置”—“Windows 设置”—“安全设置”—“本地策略”—“用户权利指派”。(如图)

  3、在“组策略”窗口的右窗格中选择“Force shutdown from a remote system
(从远端系统强制关机)”,双击。
 4、在弹出的对话框中显示目前只有“Administrators”组的成员才有权从远程关机;单击对话框下方的“添加用户或组”按钮,然后在新弹出的对话框中输入“guest”,再单击“确定”。
  5、这时在“从远端系统强制关机”的属性中便添加了一个“guest”用户,单击“确定”即可。
  6、关闭“组策略”窗中。
重启命令为:shutdown -r \\ip /f
时间灵活:用at定时重启.
批量重启所有机器:用for
@echo off
set /p a=请输入要重启的时间:
for /l in %%i (2,1,255) do @(
at %a% shutdown -r \\192.168.0.%%j -f
)
echo ===完成===
pause

作者: outmind     时间: 2006-11-30 04:32
非常感谢tianzizhi的解答。我的IP是内网的,比如说172.19.64.25,172.19.60.35……
我有几个疑问:一、可否使用读取IP列表的方式呢,如读取IP.txt。二、改成GUEST可以强制关机以后会带来很多安全问题。我所有的机器的用户名和密码是一致的,是否可以通过类似Linux登陆,只询问一次输入用户名和密码的方式来连接重启呢(因为用户名和密码所有机器一致)? 三、或者最简单的方式,一、二合并成一个IP.txt,通过三个字段IP User Passwd 来读取呢?如:172.19.64.25 admin system

作者: tianzizhi     时间: 2006-11-30 06:37
如果不修改组策略,进行连接的话可以用telnet或ipc连接,telnet自动的话有点困难,那就用ipc$来连接.
ip.txt的内容你自己做,内容形式为:
ip passwd user
(注意,密码在中间)
中间用空格格开.
@echo off
set /p a=请输入要重启的时间:
for /f "tokens=1,2,3" %%i in (ip.txt) do @(
net use \\%%i\ipc$ "%%j" \user:"%%k"
start /wait at %a% shutdown -r -t 0 /f
)
echo ===完成===
pause

具体你再改,我也没法测验,有问题你再问.

作者: outmind     时间: 2006-12-1 04:25
非常感谢,我已经初步有个想法了,正在测试中……

作者: tianzizhi     时间: 2006-12-1 06:14
测试成功后,请把内容贴上来看看!

作者: outmind     时间: 2006-12-1 06:59
好的,没有问题,大致思路是你那样,代码略微修改了一些。

作者: outmind     时间: 2006-12-1 23:11
@echo off
set /p a=请输入要重启的时间:
for /f "tokens=1,2,3" %%i in (ip.txt) do @(
net use \\%%i\ipc$ "%%j" /user:"%%k"
at \\%%i %a% shutdown /r /t 30 /f
)
echo ===完成===
pause

测试通过

但是有几个问题:
1.这个没有日志,最好加上日志,把net use 不成功的在屏幕上显示出来并发送到error.txt,把成功的IP发送到success.txt
2.start /wait
这个参数很重要吗?我觉得不是很必要啊?
3.我用
at \\%%i %a% shutdown /r /t 30 /f
测试OK,但是
at %a% shutdown /m \\%%i /r /t 30 /f
就不行,我登陆上执行重启的机器里用at命令查看,任务是在里面的,但是到了时间不执行,为什么呢?

作者: tianzizhi     时间: 2006-12-1 23:59
1.加日志
@echo off
set /p a=请输入要重启的时间:
for /f "tokens=1,2,3" %%i in (ip.txt) do @(
net use \\%%i\ipc$ "%%j" /user:"%%k" || goto end
at \\%%i %a% shutdown /r /t 30 /f
echo %%i>>success.txt
:end
net use \\%%i\ipc$ "%%j" /user:"%%k" 2>>error.txt & echo %i>>error.txt
)
echo ===完成===
pause
不知行不行,你试一下.
2.start wait我是随便加上去的,去掉没关系.
3.at %a% shutdown /m \\%%i /r /t 30 /f
语法错误, 也没/m这个选项的,目标机应在at后面.

AT 命令安排在特定日期和时间运行命令和程序。
要使用 AT 命令,计划服务必须已在运行中。

AT | /DELETE ]
AT time
| /NEXT:date] "command"

\\computername 指定远程计算机。如果省略这个参数,
会计划在本地计算机上运行命令。
id 指定给已计划命令的识别号。
/delete 删除某个已计划的命令。如果省略 id,
计算机上所有已计划的命令都会被删除。
/yes 不需要进一步确认时,跟删除所有作业
的命令一起使用。
time 指定运行命令的时间。
/interactive 允许作业在运行时,与当时登录的用户
桌面进行交互。
/every:date 每个月或每个星期在指定的日期运行命
令。如果省略日期,则默认为在每月的
本日运行。
/next:date 指定在下一个指定日期(如,下周四)运
行命令。如果省略日期,则默认为在每
月的本日运行。
"command" 准备运行的 Windows NT 命令或批处理
程序。

Last edited by tianzizhi on 2006-12-2 at 12:10 AM ]

作者: tianzizhi     时间: 2006-12-2 06:48
把日志的弄好了如下:
@echo off
set /p a=请输入要重启的时间:
for /f "tokens=1,2,3" %%i in (ip.txt) do @(
net use \\%%i\ipc$ "%%j" /user:"%%k" && at \\%%i %a% shutdown /r /t 30 /f && echo %%i>>success.txt
net use \\%%i\ipc$ "%%j" /user:"%%k" 2>>error.txt || echo %%i>>error.txt

)
echo ===完成===
pause

Last edited by tianzizhi on 2006-12-2 at 06:56 AM ]

作者: outmind     时间: 2006-12-2 07:29
Good,不断优化中……

作者: vkill     时间: 2006-12-2 08:41
tianzizhi 兄,这样不知道行吗?

net use \\%%i\ipc$ "%%j" /user:"%%k" &&( at \\%%i %a% shutdown /r /t 30 /f && echo %%i>>success.txt ) ||(echo %%i>>error.txt)

作者: tianzizhi     时间: 2006-12-2 08:50
你要的不显示信息的如下:
@echo off
set /p a=请输入要重启的时间:
echo "正在执行远程批量重启,请稍等>>>>>>"
for /f "tokens=1,2,3" %%i in (ip.txt) do @(
net use \\%%i\ipc$ "%%j" /user:"%%k" >nul 2>nul && at \\%%i %a% shutdown /r /t 30 /f >nul &&

echo %%i>>success.txt >nul 2>nul
net use \\%%i\ipc$ "%%j" /user:"%%k" >nul 2>nul || echo %%i>>error.txt >nul && net use \\%%

i\ipc$ "%%j" /user:"%%k" 2>nul 2>>error.txt

)
echo ===批量重启完成,详细信息请查看日志===
pause

Last edited by tianzizhi on 2006-12-2 at 08:53 AM ]

作者: tianzizhi     时间: 2006-12-2 09:02
Originally posted by vkill at 2006-12-2 08:41:
tianzizhi 兄,这样不知道行吗?

net use \\%%i\ipc$ "%%j" /user:"%%k" &&( at \\%%i %a% shutdown /r /t 30 /f && echo %%i>>success.txt ) ||(echo % ...


vkill你好,你的代码不行的,遇到一个错误,整个程序就结束了.

作者: outmind     时间: 2006-12-4 07:56
程序还是有一些问题,比如说 1.屏蔽错误信息后,如果遇到IPC连接不上的机器,提示符长时间停留在"正在执行远程批量重启,请稍等>>>>>>"这里,是否可以加个超时忽略的功能呢,比如说3秒连接不上就跳到下一个IP,把这个超时IP记日志。
2.还有就是日志信息error.txt有错,显示如下:NET USE
]
username]
username]



| ]

NET USE {devicename | *} /HOME

NET USE


此命令的语法是:

作者: dato     时间: 2006-12-4 10:19
呵呵,

机房经常碰到,通过将系统默认的共享开启,然后用
LanHelper来远程关机,win2k没有shutdown的吧,当然可以远程上传,不过还是习惯使用LanHelper

作者: outmind     时间: 2006-12-4 13:10
呵呵~谢谢dato。但是我们这里讨论的是不依赖于第三方软件的做法,我们希望通过讨论编写、优化脚本共同提高的一个过程。

作者: outmind     时间: 2006-12-4 13:20
LanHelper这个软件需要注册才能使用的,你能把注册码发给我试一下么?

作者: outmind     时间: 2006-12-4 13:42
我修改后的代码如下:

@echo off
echo Following are the successful ip : > success.txt
echo Following are the failure ip : > error.txt
set /p a=请输入要重启的时间:
echo.
echo 您输入的时间是"%a%",请确认!
pause
echo "正在执行远程批量重启,请稍等>>>>>>"
for /f "tokens=1,2,3" %%i in (ip.txt) do @(
net use \\%%i\ipc$ "%%j" /user:"%%k" >nul 2>nul && at \\%%i %a% shutdown /r /t 30 /f >nul && echo %%i has restarted!!!>>success.txt >nul 2>nul
net use \\%%i\ipc$ "%%j" /user:"%%k" >nul 2>nul || echo %%i failed:>>error.txt && net use \\%%i\ipc$ "%%j" /user:"%%k" 2>nul 2>>error.txt
)
echo ===批量重启完成,详细信息请查看日志===
pause
还有一个问题,能否实现定时准确到某一天,如 12-25日8:00重启?

作者: outmind     时间: 2006-12-6 05:37
还有一个问题,能否实现定时准确到某一天,如 12-25日8:00重启?

作者: xiaochaochao     时间: 2006-12-6 22:19
呀..不懂呀...虽然能看出个意思来...但叫我自己写写不出来...

作者: outmind     时间: 2006-12-8 00:12
又在进行修改,目的是ip.txt不保存密码,因为密码是敏感数据。只保存IP和用户名两个 属性,通过统一密码的方式,在cmd下来输入带*的密码。

作者: tianzizhi     时间: 2006-12-8 23:31
这些天学校断网,没有能上网,过几天再帮你想。