質問

私は質問の数日前アクセスにはSQL Server2005年からドメインの機械を用いWindows認証 ることもわかった興味深いが、使えないたします。私の問題が明確に私の制約について:

私はWindowsドメイン内にあるマシンが実行SQL Server2005年には設定のみでのWindows認証を行います。たいと思い、C#のクライアントアプリケーションマシンのネットワークがない、ドメインのアクセスデータベースのSQL Server2005年のインスタンス.

できませんの作成または変更のOSまたはSQLサーバーのユーザーには機させることができません任意の変更を行う権限は、偽装させることができませんのrunas.

私書Perl、Javaアプリケーションのシームレス接続できる、まさにSQLサーバーを使用してデータベースにのみこれらのパラメータ:サーバの名前、データベース名、ユーザー名(ドメインユーザー)およびパスワードを入力します。

クライアントまで、フルのC#てみました身の回りのさまざまなもの:

string connectionString = "Data Source=server;Initial Catalog=database;User Id=domain\user;Password=password";
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();

この設定に統合されたセキュリティをtrueおよびfalseであるようです。てうれしかったような単純なクライアントまで、フルのC#?

感謝の手で、マーチン

役に立ちましたか?

解決

あなたは正しく言うように、JDBCまたはPerlのLinuxマシンでWindows認証を現在ログオンしているユーザーと異なる資格情報を使用しての SQL Serverに接続することができ、両方に。 は、Windows CEデバイスは仕方によって、の真実です。

私は、これは、これはC#のが、SQL ServerのOLE DBドライバの問題ではないということだと思います。私は上記の方法を推測するネットワークレベルの「いくつかの特定の資格情報を使用してWindowsマシンをふりをします」。 SQL ServerのOLE DBドライバが不足している機能、。このように、私の提案は、代替を探すために(多分、商業?)になるSQL ServerデータベースにアクセスすることができますOLE DBドライバ。そのようなことはしかし、存在する場合、私はわからない。

他のヒント

私は信頼関係接続を使用して別のドメイン上のSQLサーバと1つのドメインおよび認証にマシン上で実行するために必要なツールを書いていた。ここで、私は同様の問題がありました。私は、件名に見つけることができるすべては、それを行うことができなかったと述べました。代わりに、ドメイン、使用SQL認証に参加している必要があり、ケルベロスと呼ばれるいくつかのやつに巻き込ま、またはいくつかの選択肢に名前を付けるために、セットアップへの信頼関係をネットワークの連中を取得します。

事は、私はSSMSでそれを証明のだので、私は、私はそれがRUNASを使用して、いくつかの方法で作業を得ることができる知っています。

C:\WINDOWS\system32\runas.exe /netonly /savecred /user:megacorp\joe.bloggs "C:\Program Files\Microsoft SQL Server\90\Tools\Binn\VSShell\Common7\IDE\SqlWb.exe"

/ netonlyフラグは私がローカルの資格情報とアクセスリモート資格情報を使用してネットワークでexeファイルを実行することができ、私はとにかく私はリモートサーバから期待される結果セットを得た、と思います。 runasコマンドは、それが非常に困難なアプリケーションをデバッグするために作られた、そしてそれは良い匂いしませんでした。

問題命じるました

結局、私は認証話していたコードプロジェクトの上で、この記事を見つけましたActive Directoryを操作するために、ここで偽装を行い、メインクラスがあります:

    using System;
    using System.Runtime.InteropServices;  // DllImport
    using System.Security.Principal; // WindowsImpersonationContext

    namespace TestApp
    {
        class Impersonator
        {
            // group type enum
            enum SECURITY_IMPERSONATION_LEVEL : int
            {
                SecurityAnonymous = 0,
                SecurityIdentification = 1,
                SecurityImpersonation = 2,
                SecurityDelegation = 3
            }

            // obtains user token
            [DllImport("advapi32.dll", SetLastError = true)]
            static extern bool LogonUser(string pszUsername, string pszDomain, string pszPassword,
                int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

            // closes open handes returned by LogonUser
            [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
            extern static bool CloseHandle(IntPtr handle);

            // creates duplicate token handle
            [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            extern static bool DuplicateToken(IntPtr ExistingTokenHandle,
                int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);

            WindowsImpersonationContext newUser;

            /// 
            /// Attempts to impersonate a user.  If successful, returns 
            /// a WindowsImpersonationContext of the new users identity.
            /// 
            /// Username you want to impersonate
            /// Logon domain
            /// User's password to logon with
            /// 
            public Impersonator(string sUsername, string sDomain, string sPassword)
            {
                // initialize tokens
                IntPtr pExistingTokenHandle = new IntPtr(0);
                IntPtr pDuplicateTokenHandle = new IntPtr(0);
                pExistingTokenHandle = IntPtr.Zero;
                pDuplicateTokenHandle = IntPtr.Zero;

                // if domain name was blank, assume local machine
                if (sDomain == "")
                    sDomain = System.Environment.MachineName;

                try
                {
                    const int LOGON32_PROVIDER_DEFAULT = 0;

                    // create token
                    // const int LOGON32_LOGON_INTERACTIVE = 2;
                    const int LOGON32_LOGON_NEW_CREDENTIALS = 9;
                    //const int SecurityImpersonation = 2;

                    // get handle to token
                    bool bImpersonated = LogonUser(sUsername, sDomain, sPassword,
                        LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_DEFAULT, ref pExistingTokenHandle);

                    // did impersonation fail?
                    if (false == bImpersonated)
                    {
                        int nErrorCode = Marshal.GetLastWin32Error();

                        // show the reason why LogonUser failed
                        throw new ApplicationException("LogonUser() failed with error code: " + nErrorCode);
                    }

                    bool bRetVal = DuplicateToken(pExistingTokenHandle, (int)SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation, ref pDuplicateTokenHandle);

                    // did DuplicateToken fail?
                    if (false == bRetVal)
                    {
                        int nErrorCode = Marshal.GetLastWin32Error();
                        CloseHandle(pExistingTokenHandle); // close existing handle

                        // show the reason why DuplicateToken failed
                        throw new ApplicationException("DuplicateToken() failed with error code: " + nErrorCode);
                    }
                    else
                    {
                        // create new identity using new primary token
                        WindowsIdentity newId = new WindowsIdentity(pDuplicateTokenHandle);
                        WindowsImpersonationContext impersonatedUser = newId.Impersonate();

                        newUser = impersonatedUser;
                    }
                }
                finally
                {
                    // close handle(s)
                    if (pExistingTokenHandle != IntPtr.Zero)
                        CloseHandle(pExistingTokenHandle);
                    if (pDuplicateTokenHandle != IntPtr.Zero)
                        CloseHandle(pDuplicateTokenHandle);
                }
            }

            public void Undo()
            {
                newUser.Undo();
            }
        }
    }

これを使用するにはちょうどます:

Impersonator impersonator = new Impersonator("username", "domain", "password");

//Connect to and use SQL server

impersonator.Undo();

私は、そうでなければ偽装オブジェクトがガベージコレクションを取得する傾向元に戻す方法で添加しました。私はまた、使用LOGON32_LOGON_NEW_CREDENTIALSにコードを変更されたが、これはそれを動作させるために突くと、実行されました。私はまだそれは、私がrunasコマンドに/ netonlyフラグとしてその同じことを感じていないものを完全に理解する必要があります。私はまた、コンストラクタを少し打破するつもりです。

無駄な指定のユーザー名とパスワードの接続文字列ではなSQL認証、指定されているSQL Serverのみ受け付けWindows認証を行います。

場合はサーバーなSQLの認証を のみ 可能性への接続はWindows認証が打ち出されている。- IntegratedSecurity=true.このクライアントまで認証しても資格はプロセス(又は現在impersonated).

ためには、Windows認証作業は、次の中からひとつ選択します:

  • 参加のドメイン参加の機械へのドメインマップを得ることができるで自分のドメイン!) る信託のサーバのドメインを作成し、そこには、お客様の工程としてのドメインのユーザー資格になります。
  • 利用NTLM鏡座ペアのローカルユーザーへのftpプロトコルを用いたファイルと同一の氏名およびパスワードを
  • 助成金として匿名のアクセスにSQLサーバーです。

できない場合は、クライアントホストの信頼サーバのドメインも追加できまNTLM鏡勘定のSQLサーバ管理者は、saneにおける匿名化していきます。

あなたはのconfigure SQL Serverに持っているが、SQL Server認証を許可するようにをすなわち、認証ユーザ名とパスワードを使用します。

あなたは、サーバー認証「のような」ドメインのユーザー名/パスワードによる認証を行うことができない、すなわち、直接ドメインのユーザー名/パスワードを指定します。

私はもちろん間違っている可能性がありますが、私は確かにこれは、C#や.NETの問題ではないことです。どのようにあなたのPerlやJavaアプリケーション??

でSQL Serverでログインすることができます
私は上記の四つのパラメータを持つのjTDS JDBCドライバを使用します。私はあなたに私がより精通していたJavaの答えを与えるでしょう。 Perlアプリケーションは、私はあまり程度知っているが、Linuxマシン上で実行され、そして同じパラメータで接続することができます。私は、SQL認証をサポートするために、SQL Serverのを変更することはできません。

レムスの提案に答えるために、私は彼が提案するこれらの3つのもののいずれかを実行することはできませんし、まだJavaやPerlのアプリケーションは、接続することができます。他のアイデア?

おかげで、マーティン

それは、資格情報のプロンプトがするためのオプションですP>

ここで私はのjTDS JDBCドライバを使用して、非ドメインマシンからの接続に使用するサンプルコードは次のとおりです。

にClass.forName( "net.sourceforge.jtds.jdbc.Driver")のnewInstance()。 文字列のURL = "はjdbc:JTDS:のSQLServer://サーバー/データベース;ドメイン=ドメイン"。 CONN =したDriverManager.getConnection(urlには、 "ユーザー"、 "パスワード");

scroll top