C# удалить профиль пользователя

Я пытаюсь использовать C# для удаления профиля пользователя на удаленном сервере. Я запускаю программу как я. Если я захожу в папку \\ server \ c $ \ Users \ от своего имени, я могу удалить каталог "User". Это не дает ошибки. Если я использую свою программу, написанную на C#, с кодом ниже, чтобы попытаться удалить тот же каталог, я получу это исключение.

Доступ к пути 'appsFolder.itemdata-ms' запрещен.

Что-то не так с моим удалением?

Directory.Delete("\\\\server\\c$\\Users\\User\\",true);

2 ответа

Решение

Привет, я пытался сделать то же самое и обнаружил, что Directory.Delete() не может удалить файлы, если файл скрыт или системный файл.

Вместо этого используйте cmd для удаления папки.

   public static FileAttributes RemoveAttribute (FileAttributes att, FileAttributes attToRemove)
   {
        return att &  ~attToRemove;
    }

public void DeleteProfileFolder(string file)
 {
    Process process = new Process();
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.WindowStyle = ProvessWindowsStyle.Hiddenl
    startInfo.FileName = "cmd";
    startInfo.Arguments = "/C rd /S /Q  \"" + file + "\"";
    process.StartInfo = startInfo;
   process.Start();
   process.WaitForExit();
}

public void Deletes(DirectoryInfo baseDir)
{  
     if(! baseDir.Exists)
       return;
   var Dirs = Directory.EnumerateDirectories(baseDir.ToString(),"*.*",SearchOption.TopDirectoryOnly);
   var files = Directory.EnumerateFiles(baseDir.ToString(),"*.*",SearchOption.TopDirectoryOnly);

   foreach(var dir in Dirs)
   {
         DeleteProfileFolder(dir);
    } 
  foreach(var file in files)
 {
      FileAttributes att = File.GetAttributes(f);
      if((att & FileAttributes.Hidden) == FileAttribute.Hidden)
      {  
            att = RemoveAttribute(att, FileAttributes.Hidden);
            File.SetAttributes(file , att);
            File.SetAttributes(File, FileAttributes.Normal)
        }
   File.Delete(file);
  }

}

Чтобы позвонить

Удаления ("C:\Users\"); // сделал это в локальной системе.

Я не пробовал в сети, но думаю, это сработает.

Примечание. Чтобы полностью удалить userProfile, нам также необходимо удалить реестр.

Удаление папки профиля пользователя без соответствующей очистки реестра может привести к нескольким нежелательным побочным эффектам, таким как создание временного профиля и т. Д. Я рекомендую использовать функцию DeleteProfile, которую можно найти в файле userenv.dll.

мой код выглядит следующим образом:

    internal class Program
{
    [DllImport("userenv.dll", CharSet = CharSet.Unicode, ExactSpelling = false, SetLastError = true)]
    public static extern bool DeleteProfile(string sidString, string profilePath, string omputerName);

    private static void Main(string[] args)
    {
        try
        {
            var username = args[0];
            var principalContext = new PrincipalContext(ContextType.Domain); // Domain => to support local user this should be changed probably, didn't test yet
            var userPrincipal = UserPrincipal.FindByIdentity(principalContext, username);
            if (userPrincipal != null)
            {
                Console.WriteLine("User found");
                var userSid = userPrincipal.Sid;
                Console.WriteLine("User {0} has SID: {1}", username, userSid);
                Console.WriteLine("Will try to DeleteProfile next..");
                DeleteProfile(userSid.ToString(), null, null);
                Console.WriteLine("Done - bye!");
            }
            else
            {
                Console.WriteLine("ERROR! User: {0} not found!", username);
            }
        }
        catch (Exception exception)
        {
            Console.WriteLine(exception);   
        }
    }
}

Считайте, что этот код только для демонстрационных целей и должен быть стабилизирован для производства..

веселит,

-Крис

Кстати, здесь больше на MSDN https://msdn.microsoft.com/en-us/library/windows/desktop/bb762273(v=vs.85).aspx

Другие вопросы по тегам