12

背景:ネットワークドライブ上のファイルから読み取る必要のあるアプリケーションがあります(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の方法です。この質問に終わった。

4

2 に答える 2

7

いくつかの考え:

  • コードからネットワークリソースにアクセスするために論理ドライブパスを使用しないでください。常にUNCパスを使用します(例\\SERVER\Share\Filename.ext)。
  • ローカルセキュリティポリシーからのログオン/ログオフイベントの監査を有効にして、Impersonateメソッドを呼び出したときに、失敗/成功を詳細に追跡できるようにします。
  • 他のドメインのアカウントと同じユーザー名とパスワードを持つ自分のドメインにアカウントを作成するのが最善です。ドメインを認証すると、パススルー認証により、他のドメインのネットワーク共有にアクセスできるようになります。
于 2010-03-23T21:52:51.077 に答える
0

これはばかげているように聞こえるかもしれませんが、ドライブへのアクセス方法を変更しようとしましたか?たぶん、ドライブ上の情報を表示できる何らかの形式の仮想ハンドラーをインストールします。たとえばSSH?

于 2010-03-23T22:44:27.910 に答える