none
如何自动创建ODBC数据源 RRS feed

  • 问题

  • 由于需要给很多用户创建ODBC数据源,为了方便,想统一让用户自己简单的双击运行bat或者vbs就可以自动配置。

    在查询的过程中发现,用VBS需通过注册表进行,但是注册表里无法编辑登录ID和密码。

    而通过微软自带的odbcconf命令,参数里也没有发现有输入登录ID和密码的选项,比如下面的可以添加后,但是必须又要自己手动输入用户名和密码:

    odbcconf /A {CONFIGDSN "SQL Server" "DSN=test|Server=test-server|DATABASE=Training"}

    希望能够有一种方法可以解决自动创建ODBC输入登录ID和密码的问题,谢谢。

    2015年3月9日 6:55

答案

  • 自己写一个批处理文件,然后依次调用sql脚本

    DB.bat

    @echo on
    
    echo Create DB
    osql.exe   -Usa -Ptest123456  -i   ".\StationDB.sql"
    
    
    echo   updating   db   
    osql.exe   -Usa -Ptest123456 -d   GPOSDB   -i   ".\Station.sql"
    
    
    odbcconf CONFIGSYSDSN "sql server" "DSN=GPOSDB|SERVER=(local)|Database=GPOSDB" 
    
    REG Delete "HKLM\SOFTWARE\ODBC\ODBC.INI\heatnet" /v "LastUser" /f
    
    REG ADD "HKLM\SOFTWARE\ODBC\ODBC.INI\heatnet" /v "LastUser" /t "REG_SZ" /d "sa" /f
    
    
    bcp  GPOSDB.dbo.SystemPara  in SystemPara.txt  -c  -q -Usa  -Ptest132456

    Station.sql

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CT_DelOilCan]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[CT_DelOilCan]
    GO
    
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CT_DelTLSCubage]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[CT_DelTLSCubage]
    GO
    
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CT_GetCardByNo]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[CT_GetCardByNo]
    GO
    
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CT_GetGrayList]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[CT_GetGrayList]
    GO
    
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CT_GetOilCan]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[CT_GetOilCan]
    GO



    Love SQL


    2015年3月10日 5:53

全部回复

  • 参考下面的 vbs 脚本,可以弹出一个连接窗口,选择各种数据源进行连接配置,然后得到对应的 connection string (有显示“允许保存密码”的复选框要选上,不然连接字符串中就不会有密码)

    set objConn=createobject("datalinks")
    strConn=objConn.promptnew.connectionstring
    msgbox strConn

    2015年3月9日 8:21
  • https://msdn.microsoft.com/en-us/library/aa984313%28v=vs.71%29.aspx?f=255&MSPPError=-2147217396

    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    請記得將對您有幫助的回覆標示為解答以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to clickMark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.

    2015年3月9日 8:25
  • 我不想让用户知道登录的密码,而且这个还是要教用户如何去配置剩下的内容,还是比较麻烦的,能否还有其他的方法呢,现在最主要的还是想有直接能将密码塞进去的机制。
    2015年3月9日 8:44
  • Use windows authentication.
    2015年3月9日 13:12
  • 我是通过 VBS 提供给用户的,也就是用户能够看到源代码,那也就章法着能够通过源代码找到连接字符串,那就是能够看到密码了

    所以你的这个方案先不管是否能够实例,本身就不可避免让用户知道密码吧

    或者你可以考虑自己写个 windows service或者 web service, 把连接部分封装到 service 中, 用户只能通过调用你的 service 获取数据,则不能直接访问数据,在 service 中,你自己实现连接信息的加密存储即可

    2015年3月10日 1:09
  • 如果连接的只是 SQL Server, 倒是可以考虑 windows 身份验证, 如果还有其他不支持 windows 身份验证的数据库类型,那就没什么好办法了
    2015年3月10日 1:11
  • 自己写一个批处理文件,然后依次调用sql脚本

    DB.bat

    @echo on
    
    echo Create DB
    osql.exe   -Usa -Ptest123456  -i   ".\StationDB.sql"
    
    
    echo   updating   db   
    osql.exe   -Usa -Ptest123456 -d   GPOSDB   -i   ".\Station.sql"
    
    
    odbcconf CONFIGSYSDSN "sql server" "DSN=GPOSDB|SERVER=(local)|Database=GPOSDB" 
    
    REG Delete "HKLM\SOFTWARE\ODBC\ODBC.INI\heatnet" /v "LastUser" /f
    
    REG ADD "HKLM\SOFTWARE\ODBC\ODBC.INI\heatnet" /v "LastUser" /t "REG_SZ" /d "sa" /f
    
    
    bcp  GPOSDB.dbo.SystemPara  in SystemPara.txt  -c  -q -Usa  -Ptest132456

    Station.sql

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CT_DelOilCan]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[CT_DelOilCan]
    GO
    
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CT_DelTLSCubage]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[CT_DelTLSCubage]
    GO
    
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CT_GetCardByNo]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[CT_GetCardByNo]
    GO
    
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CT_GetGrayList]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[CT_GetGrayList]
    GO
    
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CT_GetOilCan]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[CT_GetOilCan]
    GO



    Love SQL


    2015年3月10日 5:53