Windows олицетворяет [SQL, ASP.NET, C #] - PullRequest
0 голосов
/ 30 октября 2009

Я пытаюсь использовать олицетворение windows в веб-службе asmx для чтения базы данных sql.

  1. Я создаю новую учетную запись в Windows.
  2. Установить разрешение на полный контроль над файлом базы данных ORLDatabase.mdf.

Теперь я вызываю метод GetDataSet, но он завершается на стороне клиента с этой ошибкой:

System.Web.Services.Protocols.SoapException: серверу не удалось обработать запрос. ---> System.Exception: разрешение CREATE DATABASE отклонено в базе данных «master». Попытка присоединить базу данных с автоматическим именем для файла D: \ work \ WebService \ App_Data \ ORLDatabase.mdf не удалась. База данных с таким именем существует, или указанный файл не может быть открыт, или он находится на общем ресурсе UNC.

Я проверяю, что окна олицетворяют в коде с помощью WindowsIdentity.GetCurrent () , текущая идентификация хороша. Учетная запись имеет полный контроль над файлом базы данных, но она завершается с ошибкой. Может ли кто-нибудь помочь мне, я не работаю с SQL. Я пытаюсь сначала Google, но не могу найти решение, которое решает мою проблему. Спасибо

public class Service : System.Web.Services.WebService
{
    public TicketHeader Ticket;
    public DataSet ds;

    private string machine = "pcName";
    public string userName = "********";
    public string password = "*********";
    public IntPtr token; 
    public WindowsImpersonationContext impersonationContext;

    [DllImport(@"D:\Windows\System32\advapi32.dll")]
    public static extern bool LogonUser
    (string lpszUserName, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out int phToken);
    public void Login()
    {
        int returnedToken;
        if (LogonUser(userName, machine, password, 3, 0, out returnedToken))
        {
            token = new IntPtr(returnedToken);
        }

    }

    [WebMethod]
    public DataSet GetDataSet(string id)
    {
        DataSet ds = null;

        Login();
        impersonationContext = WindowsIdentity.Impersonate(token);

        SqlConnection conn = null;
        SqlDataAdapter da = null;
        try
        {
            string sql = "Select * from Table";
            conn = new SqlConnection(@"Data Source=.\SQLEXPRESS; Integrated Security=True;" +
                    @"AttachDbFilename=|DataDirectory|\ORLDatabase.mdf;");
            conn.Open();
            da = new SqlDataAdapter(sql, conn);
            ds = new DataSet();
            da.Fill(ds, "Table");
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);

        }
        finally
        {
            if (conn != null)
                conn.Dispose();
        }

        impersonationContext.Undo();
        return ds;
    }
}

Ответы [ 2 ]

2 голосов
/ 30 октября 2009

Учетная запись Windows, которую вы создали, также должна быть именем входа в ядро ​​базы данных. В SQL Server Management Studio: имя сервера -> Безопасность -> Вход | Щелкните правой кнопкой мыши -> Новый логин. Я сомневаюсь, что права доступа к файлу достаточны.

1 голос
/ 25 января 2014

У меня были проблемы с вышеуказанным решением, но с некоторыми изменениями оно работает.

  1. Переменная машина это не имя машины в API, а домен. В моем случае мне пришлось изменить его на домен для успешного вызова LogonUser функция WinAPI.
  2. Также в моем случае мне пришлось изменить третий параметр функции LogonUser с 3 [LOGON32_LOGON_NETWORK] на 2 [LOGON32_LOGON_INTERACTIVE].

После этого изменения мой локальный пользователь, на котором мой сайт успешно работает, может подключаться к базе данных с учетными данными моего домена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...