0

C# を使用して、リモート サーバー上のユーザー プロファイルを削除しようとしています。私は自分自身としてプログラムを実行しています。自分として \\server\c$\Users\ を参照すると、ディレクトリ "User" を削除できます。エラーは発生しません。以下のコードで C# で記述されたプログラムを使用して同じディレクトリを削除しようとすると、この例外が返されます。

パス 'appsFolder.itemdata-ms' へのアクセスが拒否されました。

削除に何か問題がありますか?

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

2 に答える 2

5

レジストリを適切にクリーニングせずにユーザー プロファイル フォルダーを削除すると、一時的なプロファイルの作成など、いくつかの望ましくない副作用が発生する可能性があります。userenv.dll にある DeleteProfile 関数を使用することをお勧めします。

私のコードは次のとおりです。

    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

于 2015-11-12T12:21:59.713 に答える
1

こんにちは、私は同じことをしようとしていましたが、ファイルが非表示またはシステムファイルの場合、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);
  }

}

これを呼び出すには

Deletes("c:\Users\"); // ローカル システムでこれを行いました。

ネットワークの場所を試したことはありませんが、これでうまくいくと思います。

注: userProfile を完全に削除するには、レジストリも削除する必要があります。

于 2015-10-16T20:05:31.337 に答える