如何通过dos命令来获取 已安装sqlserver2005的机子的实例名

prcgolf 2010-09-08 02:54:35

比如:
假设机器名为dbserver
命名实例为sql8的
需要得到:
dbserver\sql8

默认实例的:
需要得到:
dbserver

若是sqlserver群集的话
需要得到:
sqlserver群集名\实例名

群集估计较难。

请诸位大侠拔刀相助,非常感谢!!
...全文
1219 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
prcgolf 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 just4 的回复:]

不能用/*..*/来代替--???
[/Quote]

非常感谢!!
就是just4 2010-09-09
  • 打赏
  • 举报
回复
"而每台机子的我的windows账户都已经加入了sqlserver的sysadmin组"

不是吧,楼主每台机子都加了这个,竟不记录下每台机子的实例名,存一个清单,直接for遍历不就行了,

否则,楼主想通过扫描不成?

"写一个存储过程肯定是可以的,不过我还是希望用dos批处理方式来实现"

不是拼凑实现,实例名不知道,楼主如何远程连接进数据库来拼凑?

其实,这不是一个伪命题,实例应该就对应某个网络端口,不先记下别人的端口,谁又知道该用哪个端口连接

扫描也不是不可以,但这个只限于默认实例名,命名实例谁又知道是哪个端口了,比如:
[code=BatchFile]s tcp 192.168.0.1 192.168.0.254 1433 100[/code]
prcgolf 2010-09-09
  • 打赏
  • 举报
回复
当然编写一个存储过程肯定是可以的,不过我还是希望用dos批处理方式来实现(而不是把这个放到sqlserver中去拼凑实现)
prcgolf 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xman_78tom 的回复:]

引用 6 楼 prcgolf 的回复:

如果不知道实例名的话,应该是不能先连接再通过SQLSERVER获取的

如果知道 ip 地址和端口就可以。例如,
SQLCMD -S tcp:192.168.1.100,1433 -U sa -P password -Q "print @@servername"

如果不知道 sql server 服务器的 ip 地址,是扫描网络上安装的……
[/Quote]

我们公司有多台sqlserver
现有新来的DBA
需要在每台sqlserver上给他建立一管理员组的windows账户并把他的windows账户直接加入sqlserver的sysadmin组
想写一批处理文件,在每台机子上直接执行一下即可完成上面的需求(当然执行者是我,而每台机子的我的windows账户都已经加入了sqlserver的sysadmin组)

net user 用户名 123456 /add
net localgroup administrators 用户名 /add

sqlcmd -E -S.\实例名
rem 如果是默认实例直接: sqlcmd -E -S.
CREATE LOGIN [机器名\用户名] FROM WINDOWS WITH DEFAULT_DATABASE=[master]
EXEC master..sp_addsrvrolemember '机器名\用户名', N'sysadmin'
GO
exit

就这个批处理而言:
需要获得的就是sqlserver实例名和机器名
然后拼进这个批处理中就可以了
就是just4 2010-09-09
  • 打赏
  • 举报
回复
不能用/*..*/来代替--???
prcgolf 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 xman_78tom 的回复:]

sqlcmd 使用 -Q 选项传递 sql 查询语句。

不必这么麻烦,像这样,
sqlcmd -E -Q "create login [%computername%\xx] from windows; exec sp_addsrvrolemember '%computername%\xx', 'sysadmin';"
[/Quote]

非常感谢,现在正确了。
还想问一下如何加入回车或换行符,以使得注释符号可以使用
比如:
sqlcmd -E -Q "--alter login sa with password='sa' create login [%computername%\xx] from windows; exec sp_addsrvrolemember '%computername%\xx', 'sysadmin';"
这句话由于注释符号的原因相当于什么也没有执行,怎么样在--alter login sa with password='sa'后边加入一换行符??
xman_78tom 2010-09-09
  • 打赏
  • 举报
回复
sqlcmd 使用 -Q 选项传递 sql 查询语句。

不必这么麻烦,像这样,
sqlcmd -E -Q "create login [%computername%\xx] from windows; exec sp_addsrvrolemember '%computername%\xx', 'sysadmin';"
prcgolf 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 xman_78tom 的回复:]

各个 windows 版本上的 reg query 执行结果不同,因此在 for 中 skip 跳过的行数不同,修改一下就可以了。

如,在 windows 2003 和 2008 上,skip=2;在 xp 上,skip=4(这个是我测试用的)。
[/Quote]
非常感谢,请看我的测试脚本
@echo off
net user xx "VGYCXSEkjg54" /add
net localgroup administrators xx /add
for /f "skip=2 tokens=1" %%n in ('reg query "HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL" /s') do (
setlocal EnableDelayedExpansion
if %%n == MSSQLSERVER ("set _n=%computername%") else ("set _n=%computername%\%%n")
sqlcmd.exe -S !_n! -E
declare @ nvarchar(256)
select @=replace(replace(@@servername,@@servicename,''),'\','')+'\xx'
exec('CREATE LOGIN ['+@+'] FROM WINDOWS WITH DEFAULT_DATABASE=[master]')
EXEC master..sp_addsrvrolemember @, N'sysadmin'
go
exit
)
执行此批处理后建立了windows账户xx,可是没有把它加入sqlserver中
应该是给sqlcmd命令行传语句不是这么写的,不知该如何传语句给sqlcmd???
xman_78tom 2010-09-09
  • 打赏
  • 举报
回复
各个 windows 版本上的 reg query 执行结果不同,因此在 for 中 skip 跳过的行数不同,修改一下就可以了。

如,在 windows 2003 和 2008 上,skip=2;在 xp 上,skip=4(这个是我测试用的)。
prcgolf 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xman_78tom 的回复:]

下面的批处理 lz 应该看得明白,就不解释了。
BatchFile code

@echo off

for /f "skip=4 tokens=1" %%n in ('reg query "HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL" /s') do (
setlocal EnableDelayedExp……
[/Quote]

测试不成功,奇怪,感觉应该是对的啊。虽然不成功,也非常感谢TOM猫大侠的鼎力协助

另外说明的就是:我们公司的所有sqlserver数据库中已经把BUILTIN\Administrators组给删掉了
xman_78tom 2010-09-09
  • 打赏
  • 举报
回复
其实,sql server 2000 和 sql server 2005 中 BUILTIN\Administrators 登陆帐户即对应着本地系统的 administrators 组。因此,只要将用户帐户加入 administrators 组,就可以作为 sysadmin 访问数据库。

但是,不知道为什么 sql server 2008 只是将本地的 administrator 帐户映射到 sql server 的登陆帐户。不过可以自己手动配置一个。
xman_78tom 2010-09-09
  • 打赏
  • 举报
回复
下面的批处理 lz 应该看得明白,就不解释了。
[code=BatchFile]
@echo off

for /f "skip=4 tokens=1" %%n in ('reg query "HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL" /s') do (
setlocal EnableDelayedExpansion
if %%n == MSSQLSERVER (set _n=%computername%) else (set _n=%computername%\%%n)
sqlcmd.exe -S !_n! -E -Q "print @@version"
)

[/code]
xman_78tom 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 prcgolf 的回复:]

如果不知道实例名的话,应该是不能先连接再通过SQLSERVER获取的
[/Quote]
如果知道 ip 地址和端口就可以。例如,
SQLCMD -S tcp:192.168.1.100,1433 -U sa -P password -Q "print @@servername"

如果不知道 sql server 服务器的 ip 地址,是扫描网络上安装的 sql server 服务,则需要扫描网络上所有服务器的 1434/udp 端口。

请 lz 详细描述一下要求。
就是just4 2010-09-08
  • 打赏
  • 举报
回复
[code=BatchFile]rem 获取数据库实例名

rem 直接查进程,当然服务得开启来才行,最好通过路径信息判断
tasklist|find /i "sql"

rem 直接查服务,当然命名实例名称得含sql关键字
net start|find /i "sql"

rem 直接查安装路径
dir "%programfiles%\microsoft sql server"

rem 直接查注册表注册信息
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer"

rem 最好直接查进程和端口的对应信息
netstat -anob

rem 如楼上直接进数据库查询,还是这种方法最好!!!
osql -E -Q "select @@servername go"
[/code]
xwmhn 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xman_78tom 的回复:]
SQLCMD -Q "print @@servername"
[/Quote]
可以得到实列名。。。
prcgolf 2010-09-08
  • 打赏
  • 举报
回复
如果不知道实例名的话,应该是不能先连接再通过SQLSERVER获取的
xman_78tom 2010-09-08
  • 打赏
  • 举报
回复
SQLCMD -Q "print @@servername"
prcgolf 2010-09-08
  • 打赏
  • 举报
回复
混合安装的:既有sql2000的默认实例,也有sql2005的命名实例(sql2005)

DISPLAY_NAME: SQL Server Integration Services
SERVICE_NAME: msftesql$SQL2005
DISPLAY_NAME: SQL Server FullText Search (SQL2005)
SERVICE_NAME: MSOLAP$SQL2005
DISPLAY_NAME: SQL Server Analysis Services (SQL2005)
SERVICE_NAME: MSSQL$SQL2005
DISPLAY_NAME: SQL Server (SQL2005)
SERVICE_NAME: MSSQLSERVER
DISPLAY_NAME: MSSQLSERVER
SERVICE_NAME: MSSQLServerADHelper
DISPLAY_NAME: SQL Server Active Directory Helper
SERVICE_NAME: MySQL
DISPLAY_NAME: MySQL
SERVICE_NAME: ReportServer$SQL2005
DISPLAY_NAME: SQL Server Reporting Services (SQL2005)
SERVICE_NAME: SQLAgent$SQL2005
DISPLAY_NAME: SQL Server Agent (SQL2005)
SERVICE_NAME: SQLBrowser
DISPLAY_NAME: SQL Server Browser
SERVICE_NAME: SQLSERVERAGENT
DISPLAY_NAME: SQLSERVERAGENT
SERVICE_NAME: SQLWriter
DISPLAY_NAME: SQL Server VSS Writer
prcgolf 2010-09-08
  • 打赏
  • 举报
回复
命名实例的:
DISPLAY_NAME: SQL Server Integration Services
SERVICE_NAME: msftesql$SQL2005
DISPLAY_NAME: SQL Server FullText Search (SQL2005)
SERVICE_NAME: MSOLAP$SQL2005
DISPLAY_NAME: SQL Server Analysis Services (SQL2005)
SERVICE_NAME: MSSQL$SQL2005
DISPLAY_NAME: SQL Server (SQL2005)
SERVICE_NAME: ReportServer$SQL2005
DISPLAY_NAME: SQL Server Reporting Services (SQL2005)
SERVICE_NAME: SQLAgent$SQL2005
DISPLAY_NAME: SQL Server Agent (SQL2005)
SERVICE_NAME: SQLBrowser
DISPLAY_NAME: SQL Server Browser
prcgolf 2010-09-08
  • 打赏
  • 举报
回复
默认实例的:

SERVICE_NAME: msftesql
DISPLAY_NAME: SQL Server FullText Search (MSSQLSERVER)
SERVICE_NAME: MSSQLSERVER
DISPLAY_NAME: SQL Server (MSSQLSERVER)
SERVICE_NAME: MSSQLServerADHelper
DISPLAY_NAME: SQL Server Active Directory Helper
SERVICE_NAME: SQLBrowser
DISPLAY_NAME: SQL Server Browser
SERVICE_NAME: SQLSERVERAGENT
DISPLAY_NAME: SQL Server Agent (MSSQLSERVER)
SERVICE_NAME: SQLWriter
DISPLAY_NAME: SQL Server VSS Writer
加载更多回复(1)

6,849

社区成员

发帖
与我相关
我的任务
社区描述
Windows 2016/2012/2008/2003/2000/NT
社区管理员
  • Windows Server社区
  • qishine
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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