偽装がトリッキーであると私はIEがWatiNを持つ別のユーザーのコンテキストで実行するように取得することができたことはありません:
同様の問題がでました。以前は、基本認証を有効にしてテストしている別のバージョンのサイトを展開し、ダイアログを使用してログインしました。
は、詳細情報およびサンプルコードについては、次のブログを見てください:
http://blogs.msdn.com/jimmytr/archive/2007/04/14/writing-test-code-with-impersonation.aspx
http://blogs.msdn.com/shawnfa/archive/2005/03/21/400088.aspx
編集:私は今日、この作業を得ました。 IEの起動とIEの自動化を分離する必要があるということは、あなたが1つのヒットで両方を行うだけではできないということです。
最初に起動します。つまり、System.Diagnostics.Processを使用します。あなたがIEを立ち上げたら、あなたは、コード
[TestMethod]
public void TestMethod()
{
SecureString password = new SecureString();
password.AppendChar('p');
password.AppendChar('a');
password.AppendChar('s');
password.AppendChar('s');
password.AppendChar('w');
password.AppendChar('o');
password.AppendChar('r');
password.AppendChar('d');
ProcessStartInfo psi = new ProcessStartInfo();
psi.UserName = "localtest";
psi.Password = password;
psi.UseShellExecute = false;
psi.LoadUserProfile = true;
psi.FileName = "c:\\Program Files\\Internet Explorer\\iexplore.exe";
psi.Arguments = "about:blank";
Process proc = new Process();
proc.StartInfo = psi;
proc.Start();
t.Join();
proc.Kill();
}
private static void DoWorkAs(object o)
{
User u = o as User;
IntPtr hToken = IntPtr.Zero;
IntPtr hTokenDuplicate = IntPtr.Zero;
if (Win32.LogonUser(u.UserName, u.Domain, u.Password, 2 /*LOGON32_LOGON_INTERACTIVE*/, 0 /*LOGON32_PROVIDER_DEFAULT*/, out hToken))
{
if (Win32.DuplicateToken(hToken, 2, out hTokenDuplicate))
{
WindowsIdentity windowsIdentity = new WindowsIdentity(hTokenDuplicate);
WindowsImpersonationContext impersonationContext = windowsIdentity.Impersonate();
// domain\username
Console.WriteLine(" Thread 2 : " + WindowsIdentity.GetCurrent().Name);
IE ie = IE.AttachToIE(Find.ByUrl("about:blank"));
ie.GoTo(@"http://www.google.com/");
ie.TextField(Find.ByName("q")).TypeText("WatiN");
ie.Button(Find.ByName("btnG")).Click();
Assert.IsTrue(ie.ContainsText("WatiN"));
ie.GoTo("about:blank");
//revert
impersonationContext.Undo();
Console.WriteLine(WindowsIdentity.GetCurrent().Name);
}
}
if (hToken != IntPtr.Zero) Win32.CloseHandle(hToken);
if (hTokenDuplicate != IntPtr.Zero) Win32.CloseHandle(hTokenDuplicate);
}
public class User
{
public User(string u, string d, string p)
{
Domain = d;
UserName = u;
Password = p;
}
public string UserName;
public string Domain;
public string Password;
}
public class Win32
{
// P/Invoke snask
[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool LogonUser(
string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
out IntPtr phToken);
[DllImport("advapi32.dll", SetLastError = true)]
public extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int
SECURITY_IMPERSONATION_LEVEL, out IntPtr DuplicateTokenHandle);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool CloseHandle(IntPtr hHandle);
}
は、このコードは、リファクタリングを必要とし、IE7とVista上won'workで添付して、ここでimpersionation
を使用してIEに話をhereからコードを使用することができますIE8で修正されたIEのバグが原因です。
ありがとうBruce。これにより私たちは前進できる解決策を与えました。私はWatiNが将来、偽装サポートを追加するのを見たいと思っています。 –
ここにいくつかのコードがありますか?どこに 't'が定義されていますか、どこでDoWorkAs()を呼びますか? –
@Derek私は、コードには再因子が必要だと言いました。ソースは私のオープンソースフレームワークのhttp://testingstax.codeplex.com/SourceControl/changeset/view/6390#73028に含まれています。 –