none
SQLSERVERに別ユーザーとしてWINDOWS認証でログイン RRS feed

  • 質問

  • 教えてください。

    当方、VB6プログラムからSQL SERVER2008R2へADO接続するプログラムを開発しております。

    認証方式はWindows認証を使用しておりますが、この際、PCにログインしているユーザーとは

    別のユーザーを指定してSQLSERVERに接続することは可能でlしょうか?

    接続文字列に別ユーザーのID・パスワードを記述すればよいのでしょうか?

    宜しくお願い致します。

    2013年10月3日 7:51

回答

  • Windows認証では、別ユーザーのID・パスワードを記述することは、私の知る限りできません。多少調べてみましたが、やはり出来ている例を見つけることができませんでした。ところ、他のユーザーでWindows認証したいというは、どのような理由からでしょうか? その理由によっては、何か代替案があるかもしれません。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2013年10月9日 1:28
    • 回答としてマーク 星 睦美 2013年10月17日 7:43
    2013年10月7日 2:21
  • プログラム自体をその別ユーザーとして実行するのは?
    なにも変更したくなければrunasで実行する。プログラムを再起動してもいいのならCreateProcessWithLogonWで別ユーザーとして自動で再起動させるとか。

    Option Explicit
    
    Private Const LOGON_WITH_PROFILE as Long= 1
    Private Const LOGON_NETCREDENTIALS_ONLY as Long= 2
    Private Const CREATE_DEFAULT_ERROR_MODE as Long = &H4000000
    
    Private Type PROCESS_INFORMATION
        hProcess As Long
        hThread As Long
        dwProcessId As Long
        dwThreadId As Long
    End Type
    
    Private Type STARTUPINFO
        cb As Long
        lpReserved As Long
        lpDesktop As Long
        lpTitle As Long
        dwX As Long
        dwY As Long
        dwXSize As Long
        dwYSize As Long
        dwXCountChars As Long
        dwYCountChars As Long
        dwFillAttribute As Long
        dwFlags As Long
        wShowWindow As Integer
        cbReserved2 As Integer
        lpReserved2 As Long
        hStdInput As Long
        hStdOutput As Long
        hStdError As Long
    End Type
    
    Private Declare Function CreateProcessWithLogonW Lib "Advapi32" _
        (ByVal lpUsername As Long _
        , ByVal lpDomain As Long _
        , ByVal lpPassword As Long _
        , ByVal dwLogonFlags As Long _
        , ByVal lpApplicationName As Long _
        , ByVal lpCommandLine As Long _
        , ByVal dwCreationFlags As Long _
        , ByVal lpEnvironment As Long _
        , ByVal lpCurrentDirectory As Long _
        , ByRef lpStartupInfo As STARTUPINFO _
        , ByRef lpProcessInfo As PROCESS_INFORMATION) As Long
    
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    
    Private Sub Form_Initialize()
        Me.Label1.Caption = Module1.Get_User_Name()
        Me.Label2.Caption = App.Path
    End Sub
    
    
    
    Private Sub Command1_Click()
        '実行しているこのプログラムをユーザー名とパスワードを指定して再起動する
        If (RunAsMe(Me.Text1.Text, Me.Text2.Text)) Then
            Unload Me
        Else
            MsgBox "ユーザーにログインできませんでした"
        End If
    End Sub
    
    
    
    Private Function RunAsMe(ByVal user As String, ByVal pass As String) As Boolean
        '実行しているこのプログラムをユーザー名とパスワードを指定して起動する
        Dim startInfo As STARTUPINFO
        Dim processInfo As PROCESS_INFORMATION
        Dim result As Long
    
        startInfo.cb = LenB(startInfo)
        startInfo.dwFlags = 0&
        
        result = CreateProcessWithLogonW _
            (StrPtr(user) _
            , StrPtr(vbNullString) _
            , StrPtr(pass) _
            , LOGON_WITH_PROFILE _
            , StrPtr(App.Path & "\" & App.EXEName & ".exe") _
            , StrPtr(vbNullString) _
            , CREATE_DEFAULT_ERROR_MODE _
            , ByVal 0& _
            , StrPtr(vbNullString) _
            , startInfo, processInfo)
            
        CloseHandle processInfo.hThread
        CloseHandle processInfo.hProcess
        RunAsMe = result <> 0
    End Function
    
    Private Sub Command2_Click()
        'SQLサーバーからログインユーザー名を取得する
        Dim con As New ADODB.Connection
        Dim recset As New ADODB.Recordset
        con.Mode = adModeRead
        Err.Clear
        On Error Resume Next
        con.Open "provider=sqloledb;server=(local);Integrated Security=SSPI;"
        If (Err.Number <> 0) Then
            Me.Label3.Caption = Err.Description
        Else
            Set recset = con.Execute("select SYSTEM_USER as NAME")
            recset.MoveFirst
            Me.Label3.Caption = recset("NAME").Value
            con.Close
        End If
    End Sub
    
    


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 星 睦美 2013年10月9日 1:28
    • 回答としてマーク 星 睦美 2013年10月17日 7:43
    2013年10月7日 14:05

すべての返信

  • Windows認証では、別ユーザーのID・パスワードを記述することは、私の知る限りできません。多少調べてみましたが、やはり出来ている例を見つけることができませんでした。ところ、他のユーザーでWindows認証したいというは、どのような理由からでしょうか? その理由によっては、何か代替案があるかもしれません。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2013年10月9日 1:28
    • 回答としてマーク 星 睦美 2013年10月17日 7:43
    2013年10月7日 2:21
  • プログラム自体をその別ユーザーとして実行するのは?
    なにも変更したくなければrunasで実行する。プログラムを再起動してもいいのならCreateProcessWithLogonWで別ユーザーとして自動で再起動させるとか。

    Option Explicit
    
    Private Const LOGON_WITH_PROFILE as Long= 1
    Private Const LOGON_NETCREDENTIALS_ONLY as Long= 2
    Private Const CREATE_DEFAULT_ERROR_MODE as Long = &H4000000
    
    Private Type PROCESS_INFORMATION
        hProcess As Long
        hThread As Long
        dwProcessId As Long
        dwThreadId As Long
    End Type
    
    Private Type STARTUPINFO
        cb As Long
        lpReserved As Long
        lpDesktop As Long
        lpTitle As Long
        dwX As Long
        dwY As Long
        dwXSize As Long
        dwYSize As Long
        dwXCountChars As Long
        dwYCountChars As Long
        dwFillAttribute As Long
        dwFlags As Long
        wShowWindow As Integer
        cbReserved2 As Integer
        lpReserved2 As Long
        hStdInput As Long
        hStdOutput As Long
        hStdError As Long
    End Type
    
    Private Declare Function CreateProcessWithLogonW Lib "Advapi32" _
        (ByVal lpUsername As Long _
        , ByVal lpDomain As Long _
        , ByVal lpPassword As Long _
        , ByVal dwLogonFlags As Long _
        , ByVal lpApplicationName As Long _
        , ByVal lpCommandLine As Long _
        , ByVal dwCreationFlags As Long _
        , ByVal lpEnvironment As Long _
        , ByVal lpCurrentDirectory As Long _
        , ByRef lpStartupInfo As STARTUPINFO _
        , ByRef lpProcessInfo As PROCESS_INFORMATION) As Long
    
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    
    Private Sub Form_Initialize()
        Me.Label1.Caption = Module1.Get_User_Name()
        Me.Label2.Caption = App.Path
    End Sub
    
    
    
    Private Sub Command1_Click()
        '実行しているこのプログラムをユーザー名とパスワードを指定して再起動する
        If (RunAsMe(Me.Text1.Text, Me.Text2.Text)) Then
            Unload Me
        Else
            MsgBox "ユーザーにログインできませんでした"
        End If
    End Sub
    
    
    
    Private Function RunAsMe(ByVal user As String, ByVal pass As String) As Boolean
        '実行しているこのプログラムをユーザー名とパスワードを指定して起動する
        Dim startInfo As STARTUPINFO
        Dim processInfo As PROCESS_INFORMATION
        Dim result As Long
    
        startInfo.cb = LenB(startInfo)
        startInfo.dwFlags = 0&
        
        result = CreateProcessWithLogonW _
            (StrPtr(user) _
            , StrPtr(vbNullString) _
            , StrPtr(pass) _
            , LOGON_WITH_PROFILE _
            , StrPtr(App.Path & "\" & App.EXEName & ".exe") _
            , StrPtr(vbNullString) _
            , CREATE_DEFAULT_ERROR_MODE _
            , ByVal 0& _
            , StrPtr(vbNullString) _
            , startInfo, processInfo)
            
        CloseHandle processInfo.hThread
        CloseHandle processInfo.hProcess
        RunAsMe = result <> 0
    End Function
    
    Private Sub Command2_Click()
        'SQLサーバーからログインユーザー名を取得する
        Dim con As New ADODB.Connection
        Dim recset As New ADODB.Recordset
        con.Mode = adModeRead
        Err.Clear
        On Error Resume Next
        con.Open "provider=sqloledb;server=(local);Integrated Security=SSPI;"
        If (Err.Number <> 0) Then
            Me.Label3.Caption = Err.Description
        Else
            Set recset = con.Execute("select SYSTEM_USER as NAME")
            recset.MoveFirst
            Me.Label3.Caption = recset("NAME").Value
            con.Close
        End If
    End Sub
    
    


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 星 睦美 2013年10月9日 1:28
    • 回答としてマーク 星 睦美 2013年10月17日 7:43
    2013年10月7日 14:05