Hi guys, I try use windows impersonate in asmx web service to read sql database.
- I make new account in windows.
- Set permission to full control on database file ORLDatabase.mdf.
Now I call method GetDataSet, but it finish on client side with this error:
System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Exception: CREATE DATABASE permission denied in database 'master'. An attempt to attach an auto-named database for file D:\work\WebService\App_Data\ORLDatabase.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.
I check windows impersonate in code with WindowsIdentity.GetCurrent(), the current identity is good.The Account have full control on databse file,but it finisch with error. Can somebody help me, I dont't work with sql. I try first google, but don't find solution which solve my problem. Thank
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;
}
}