Ошибка Some or all identity references could not be translated
означает, что используемая вами личность / учетная запись не найдена. Взглянув глубже, мы видим, что
у вас проблема с этой строкой:
FileSystemAccessRule accRule = new FileSystemAccessRule(originalDocumentFolderPath, FileSystemRights.FullControl, AccessControlType.Allow);
Посмотрите на конструктор FileSystemAccessRule
, который вы используете. Вот подпись:
public FileSystemAccessRule (string identity, System.Security.AccessControl.FileSystemRights fileSystemRights, System.Security.AccessControl.AccessControlType type);
Первый аргумент, который должен быть отправлен - это идентификатор, взятый из документации:
Имя учетной записи пользователя.
Я не уверен, что вы отправляете туда в originalDocumentFolderPath
.
Предполагая, что username
содержит личность, которую вы олицетворяете, эту строку следует изменить на:
FileSystemAccessRule accRule = new FileSystemAccessRule(username, FileSystemRights.FullControl, AccessControlType.Allow);
Две другие вещи, о которых вы должны знать:
Прежде всего, вы работаете с общей папкой в сети, поэтому вам нужно исправить эту строку:
string sharedFolderPath = "\\" + Path.Combine(Environment.MachineName, "Users");
в это:
string sharedFolderPath = "\\\\" + Path.Combine(Environment.MachineName, "Users");
Когда вы работаете с сетевой папкой, вам нужно в начале использовать двойную косую черту, а поскольку в C#
обратная косая черта экранирует символы, вам нужно записать ее как \\\\
.
Во-вторых, вы также должны заметить, что вы пытаетесь скопировать файл и присваивает ему имя папки в качестве места назначения. Чтобы это исправить, вы должны добавить в конце объединения путь к общей папке:
sharedFolderPath = Path.Combine(sharedFolderPath, "file.extension");
В конце вот ваш полный код, который должен работать как задумано:
if (!System.IO.File.Exists(fullPath))
{
using (WindowsIdentity.GetCurrent().Impersonate())
{
try
{
image.Save(fullPath);
System.Security.AccessControl.DirectorySecurity sec = System.IO.Directory.GetAccessControl(originalDocumentFolderPath);
FileSystemAccessRule accRule = new FileSystemAccessRule(username, FileSystemRights.FullControl, AccessControlType.Allow);
sec.AddAccessRule(accRule);
string sharedFolderPath = "\\\\" + Path.Combine(Environment.MachineName, "Users");
sharedFolderPath = Path.Combine(sharedFolderPath, username);
sharedFolderPath = Path.Combine(sharedFolderPath, "Desktop");
sharedFolderPath = Path.Combine(sharedFolderPath, "SharedFolder");
sharedFolderPath = Path.Combine(sharedFolderPath, "file.extension");
System.IO.File.Copy(originalDocumentFolderPath, sharedFolderPath);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}