2

これを行うC#プログラムがあります:

Directory.Exists(@"\\PcName\SomeDir");

そのパスにアクセスできる (存在する) かどうかを出力します。

Task Schedulerこれが問題です。 「ログイン時」トリガーを使用して、ログイン直後(自動ログインユーザー)からこのアプリを実行するとfalse、そのパスにアクセスできますが、 が返されます。(アプリが起動する数秒前に、explorer.exe を使用してそのパスを開くことができます)。次のようにマークされています。

Run with highest privileges

手動で実行すると、タスクを右クリックして「実行」を選択しても問題なく実行されますTask Scheduler

  • 「最上位の権限で実行」の選択を解除しても問題はありませんが、最上位の権限で実行する必要があります (レジストリやその他の多くのものにアクセスします)。

  • タスクスケジューラで手動または自動で実行すると、同じユーザーで実行されます-プロセスエクスプローラーを使用して確認しました

  • 特定のマシン (Win8x64、パスワードなしの admin-privileges-user、自動ログイン、ワークグループ マシン、ドメインではない) では発生しますが、別のマシン (同じ: Win8x64、パスワードなしの admin-privileges-user、auto-ログイン、ワークグループ マシン、ドメインではありません)。

  • (タスク スケジューラで) タスクに 1 分の遅延を挿入Thread.Sleep(TimeSpan.FromMinutes(1));または入力しても、このパスは存在しないと表示されます

4

1 に答える 1

0

問題が解決しました。理由はよくわかりませんが、「偽装」する必要がありました。スケジューラを再起動せずに使用すると、リモート共有にアクセスします。まったく同じ設定で、1 対 1 でアクセスします。再起動後のみ、共有へのアクセスに失敗します (しばらくすると、同じ設定でアクセスできるようになります)。

再起動直後に実行する場合の唯一の違いは、app-process の親が通常services.exeと異なることです。explorer.exe私の推測では、再起動後すぐにログインする必要があるため、使用する必要がありますservices.exe(explorer.exe私が間違っていなければ、その段階では存在しないはずです)。

以下はC#、大まかに、関係する可能性のある の解決策です。

// LogonUser is a "P/Invoked" API:
// http://www.pinvoke.net/default.aspx/advapi32/LogonUser.html
// this solution works only with the LOGON32_LOGON_NEW_CREDENTIALS as the 4th parameter:
using (var h = LogonUser(username, domain, password, 
    LogonType.LOGON32_LOGON_NEW_CREDENTIALS, 
    LogonProvider.LOGON32_PROVIDER_DEFAULT))
{
    using (var winImperson8Ctx = WindowsIdentity.Impersonate(h.DangerousGetHandle())) {
        return Directory.Exists(path); // now works fine...    
    }
}
于 2013-09-30T18:16:21.597 に答える