скопируйте файл, используя UNC и олицетворение - PullRequest
0 голосов
/ 26 октября 2010

Я хочу использовать FileInfo и CopyTo для перемещения некоторых файлов по сети. Я должен переместить файлы в общий ресурс на сервере, доступ к которому осуществляется с использованием определенной учетной записи пользователя. Как мне это сделать - нужно ли выдавать себя за этого пользователя, а затем делать копию?

Я использую .net 4, и мне было интересно, как лучше всего выполнить олицетворение. Я читал об использовании pInvoke и advapi32.dll, но я надеялся, что кто-то может порекомендовать лучший способ сделать это.

Спасибо за любые мысли.

EDIT Спасибо за ответы. Это не служба, это консольное приложение, но оно будет запускаться с нескольких компьютеров. Есть ли какое-то преимущество в использовании сопоставления по сравнению с использованием олицетворения или наоборот? Каков рекомендуемый подход?
Я также рассмотрел возможность использования пакетного файла для создания сопоставлений и копирования, но я не был уверен, насколько легко это будет сделать, поскольку папки для копирования не всегда будут одинаковыми - они всегда будут в одном каталоге , но имя подкаталога меняется.

Ответы [ 2 ]

0 голосов
/ 26 октября 2010

Если вы работаете как сервис, возможно, вам придется выдать себя за другого Это не полный код, а суть:

     [DllImport("advapi32.dll", SetLastError = true)]
    private static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    private static extern unsafe int FormatMessage(int dwFlags, ref IntPtr lpSource, int dwMessageId, int dwLanguageId, ref string lpBuffer, int nSize, IntPtr* arguments);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool CloseHandle(IntPtr handle);


IntPtr token = IntPtr.Zero;

            bool isSuccess = LogonUser(username, domain, password, impersonationType, Logon32ProviderDefault, ref token);
            if (!isSuccess)
            {
                RaiseLastError();
            }

            WindowsIdentity newIdentity = new WindowsIdentity(token);
            WindowsImpersonationContext impersonatedUser = newIdentity.Impersonate();

Сохраните токен и затем

CloseHandle(token);
0 голосов
/ 26 октября 2010

Вам не требуется олицетворение, все, что вам нужно сделать, это установить сопоставление файлов с использованием учетных данных, которые вы хотите использовать. Вы можете сделать это, используя net use в качестве команды оболочки или WNetAddConnection2

...