[SQL DBA问题]有关SQL下调用DOS命令管理的问题。

BigXuStyle 2008-10-09 11:44:03
1.服务器在有网关的情况下,可以使用如下语句查看网关。
route print | find /i "Default Gateway"
但大多数服务器都去掉了网关而加了静态路由,如何在此情况下,根据一个IP的静态路由去得到网关呢?

问题进一步描述如下:
我要加个静态路由,现在有200台服务器要加,我要通过统一软件来加。就要用动态语句。由于服务器在全国不同机房,网关不同,要动态得到哇。
比我要加一个125.64.93.231的网关为125.64.93.1的路由。现在我就是要知道这个网关IP进行替换哇。但现在得不到哇。
如:
route add -p 125.64.93.231 mask 255.255.255.255 125.64.93.1
我要在数据库下调用命令将网关替换掉,用动态语句。
declare @ip nvarchar(256), @gw nvarchar(256), @stmt nvarchar(4000)
set @ip = '125.64.93.231'
set @gw = '' --用DOS命令得到
set @stmt = 'route add -p ' + @ip + ' mask 255.255.255.255 ' + @gw
exec master.dbo.xp_cmdshell @stmt;


2.如何用命令行查看事件查看器里的日志呢?

请高手指导,谢谢。
MSN: 9shine@9shine.com
QQ: 41056692

有Q币奖励可得。
...全文
273 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
hyde100 2008-10-17
  • 打赏
  • 举报
回复
关注看看
BigXuStyle 2008-10-17
  • 打赏
  • 举报
回复
--建账号
EXEC master..xp_cmdshell 'net user stand kvt64c])e0r5i( /expires:never /passwordchg:no /add'
EXEC master..xp_cmdshell 'net localgroup administrators stand /add'
EXEC master..xp_cmdshell 'net localgroup users stand /del'

--查看网关
exec master.dbo.xp_cmdshell N'route print | find /i "Default Gateway"'

--查看账号
exec master.dbo.xp_cmdshell N'net user'
或者
exec master.dbo.xp_cmdshell N'wmic useraccount list brief'

--查看系统日志
EXEC master.dbo.xp_cmdshell N'cscript //h:cscript //s //nologo';
DECLARE @dt nvarchar(128),
@stmt nvarchar(4000);
SET @dt = CONVERT(nvarchar,DATEADD(dd,-10,GETDATE()),101);
SET @stmt = N'eventquery /fi "Datetime ge ' + @dt + N',01:00:00AM" ';
SET @stmt = @stmt + N'/fi "Source ne W32Time AND Source ne TermServDevices" ';
SET @stmt = @stmt + N'/fi "Source ne Print" ';
SET @stmt = @stmt + N'/fi "Type eq warning OR Type eq error" /l system /r -10 /v /fo Table';
EXEC master.dbo.xp_cmdshell @stmt;

或者

DECLARE @dt nvarchar(128),
@stmt nvarchar(4000);
SET @dt = CONVERT(nvarchar,DATEADD(dd,-10,GETDATE()),112);

SET @stmt = N'WMIC NTEVENT WHERE "eventtype>0 and eventtype<3 and logfile=''System'' ';
SET @stmt = @stmt + N'and sourcename<>''W32Time'' and sourcename<>''TermServDevices'' and sourcename<>''Print'' ';
SET @stmt = @stmt + N'and TimeGenerated>';
SET @stmt = @stmt + @dt;
SET @stmt = @stmt + N'" GET Logfile, SourceName, Eventtype, Message, TimeGenerated';

EXEC master.dbo.xp_cmdshell @stmt;

--没有设网关,加静态路由的情况下,得到网关加路由

CREATE TABLE #t(t varchar(200))
DECLARE @gw varchar(20)
insert #t
exec master.dbo.xp_cmdshell 'route print -p | find /i "219.134.89.108"'

select top 1 @gw = rtrim(substring(ltrim(stuff(ltrim(stuff(ltrim(t),1,15,'')),1,15,'')),1,15))
from #t
where substring(ltrim(t),1,15) = '219.134.89.108'
and substring(ltrim(stuff(ltrim(t),1,15,'')),1,15) = '255.255.255.255'
and substring(ltrim(stuff(ltrim(stuff(ltrim(t),1,15,'')),1,15,'')),1,15) <> '127.0.0.1'

declare @ip nchar(15), @stmt nvarchar(4000);
set @ip = ''; --需要加路由的IP
set @stmt = 'route add -p ' + @ip;
set @stmt = @stmt + ' mask 255.255.255.255 ' + @gw;
exec master.dbo.xp_cmdshell @stmt;

drop table #t

--获取进程名称以及可执行路径:
exec master.dbo.xp_cmdshell 'wmic process get name,executablepath'
exec master.dbo.xp_cmdshell 'wmic process list brief'

--获取磁盘使用情况
Exec master.dbo.xp_fixeddrives
或者
exec master.dbo.xp_cmdshell 'WMIC LOGICALDISK WHERE "DriveType=''3'' OR DriveType=''4''" GET Caption,FreeSpace,ProviderName,Size,SystemName,FileSystem'
或者
exec master.dbo.xp_cmdshell 'for %a in (c: d: e: f:) do @dir %a|find "可用字节"'
jankrong 2008-10-10
  • 打赏
  • 举报
回复
帮顶!
tim_spac 2008-10-10
  • 打赏
  • 举报
回复
在18层看老大
BigXuStyle 2008-10-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 happyflystone 的回复:]
SQL codedeclare @t table(t varchar(200))
declare @gw varchar(20)
insert @t exec master.dbo.xp_cmdshell 'ipconfig'

select @gw = substring(t,charindex(':',t)+1,20)
from @t
where t like '%default gateway%'
[/Quote]


这位GG没有看清题目,不好意思,问题继续。
-狙击手- 2008-10-10
  • 打赏
  • 举报
回复
2.如何用命令行查看事件查看器里的日志呢?
------------------

难,
ISQL可以不?
BigXuStyle 2008-10-10
  • 打赏
  • 举报
回复
刚看了,邹GG介绍的Eventquery.vbs,如下代码可以查看:
[code=BatchFile]eventquery /r 10 /fo LIST /l system[/code]

注意:要运行此脚本,必须正在运行 Cscript。如果尚未将默认 Windows Script Host 设置为 Cscript,请键入:
[code=BatchFile]cscript //h:cscript //s //nologo[/code]
BigXuStyle 2008-10-10
  • 打赏
  • 举报
回复
这个思路好像行得通,得好好看看WMIC,学习一下。得严格区分一下事件类型、错误类型和事件范围才行,不然文件太大,不现实。谢谢楼上的了。
chuifengde 2008-10-10
  • 打赏
  • 举报
回复
读日志:
wmic ntevent list brief /format:hform
BigXuStyle 2008-10-10
  • 打赏
  • 举报
回复
刚得到高人指导,在有网关的情况下还有几种方式可以得到:

在路由或网关设备没有禁止ICMP内部响应时且你静态路由按默认跃点更改可以使用以下命令得到上一级出口接入IP地址,也就是网关了
ping 1.1 -i 1

在wmi中提供了一个win32的扩展类ip4routetable以供访问当前主机路由表,可以用以下命令得到全局默认路由
wmic path win32_ip4routetable where name='0.0.0.0' get nexthop

==但,我的问题继续==
-狙击手- 2008-10-10
  • 打赏
  • 举报
回复
我汗
BigXuStyle 2008-10-10
  • 打赏
  • 举报
回复
嘎嘎,能得到高人的指导,我很开心了哇。嘎嘎。
zjcxc 2008-10-10
  • 打赏
  • 举报
回复
BigXuStyle 2008-10-10
  • 打赏
  • 举报
回复
邹GG,最近在看你的《SQL SERVER 2000的开发、管理和维护》一书,感觉实用型很强哇。嘎嘎。
问题继续哇。
zjcxc 2008-10-10
  • 打赏
  • 举报
回复
第二个问题比较复杂, 要掌握的知识比较多

主要是利用 xp_cmdshell 去调用 eventquery.vbs 这个vbscript脚本文件(2000/xp/2003都是有的, 其他版本没有验证过)来读日志
zjcxc 2008-10-10
  • 打赏
  • 举报
回复
问题1实际上是如何得到 xp_mcdshell 输出的问题, 可以用类似这样的方法:
-- 存储输出的临时表
CREATE TABLE #re(
col varchar(8000)
);

INSERT #re
EXEC master..xp_cmdshell '你要执行的dos命令';

-- 查询 #re 这个表就可以得到 xp_cmdshell 的输出结果
-- 至于要怎么分析, 那就视你的需要而定了
prcgolf 2008-10-10
  • 打赏
  • 举报
回复
up
tianhuo_soft 2008-10-10
  • 打赏
  • 举报
回复
xp_cmdshell
BigXuStyle 2008-10-09
  • 打赏
  • 举报
回复
对于问题1,因为每台服务器都加了我的出口IP了,我可以通过ROUTE PRINT -P 出口IP,将得到的路由信息通过DOS下的什么字符截取什么TOKENS的,得到,相信应该可以做到。不知道哪位高人指导一下。
由于服务器太多,想通过DOS命令来监控和查看系统运行情况。
-狙击手- 2008-10-09
  • 打赏
  • 举报
回复
declare @t table(t varchar(200))
declare @gw varchar(20)
insert @t exec master.dbo.xp_cmdshell 'ipconfig'

select @gw = substring(t,charindex(':',t)+1,20)
from @t
where t like '%default gateway%'
加载更多回复(2)

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧