背景:ネットワークドライブ上のファイルから読み取る必要のあるアプリケーションがあります(Z :)
これは私のオフィスドメインではうまく機能しますが、サイト(別のドメイン)では機能しません。ドメインユーザーとネットワークドライブが同じように設定されていることがわかる限り、顧客ドメインのユーザーなどにアクセスできません。
ネットワークドライブにアクセスできなかったとき、ユーザー用のトークンが必要だと思いました。これは私がユーザーを強制する方法です:
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
..。
const string userName = "USER";
const string pass = "PASS";
const string domainName = "VALIDDOMAIN.local" //tried with valid domain name and with null, same result
const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_LOGON_INTERACTIVE = 2;
IntPtr tokenHandle = new IntPtr(0);
bool returnValue = LogonUser(userName, domainName, pass,
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
ref tokenHandle);
if (!returnValue)
throw new Exception("Logon failed.");
WindowsImpersonationContext impersonatedUser = null;
try
{
WindowsIdentity wid = new WindowsIdentity(tokenHandle);
impersonatedUser = wid.Impersonate();
}
finally
{
if (impersonatedUser != null) impersonatedUser.Undo();
}
ここに興味深い/奇妙な部分があります。私のネットワークでは、アプリケーションはすでにネットワークドライブにアクセスできます。アクティブなユーザー(同じドメインを含むまったく同じユーザー)になりすまそうとすると、ネットワークドライブにアクセスできなくなります。
何が機能し、何が機能しないのかわからないので、これは私を無力にします。さらに言えば、それは現場で機能しますか?
私は何が欠けていますか?
編集:最初に質問をしているときにこれを書くのを忘れました:有効なドメイン名を入力しようとしましたが、機能しませんでした。その後、nullを入力して、このコードがない場合と同じユーザー名を取得しようとしました(機能するため)デフォルトでは、ドメイン内にあります)。これは役に立ちませんでした、そしてそれがdomain=nullの方法です。この質問に終わった。