C# 使用DirectoryServices创建虚拟目录时出现未知名称异常

C# 使用DirectoryServices创建虚拟目录时出现未知名称异常,c#,iis,directoryservices,C#,Iis,Directoryservices,我试图通过克隆另一个虚拟目录的设置,使用DirectoryServices在远程服务器上创建一个虚拟目录,但我得到了一个COMException:未知名称。(调用AppCreate时,HRESULT:0x80020006(DISP_E_UNKNOWNNAME)的异常 这是我编写的代码(简化了大部分测试): 我尝试了一些变体(请参见代码中的注释),使用AppCreate2而不是AppCreate,或者在AppCreate之前调用CommitChanges和/或调用SetInfo,但都会导致相同的异

我试图通过克隆另一个虚拟目录的设置,使用DirectoryServices在远程服务器上创建一个虚拟目录,但我得到了一个COMException:未知名称。(调用AppCreate时,HRESULT:0x80020006(DISP_E_UNKNOWNNAME)的异常

这是我编写的代码(简化了大部分测试):

我尝试了一些变体(请参见代码中的注释),使用AppCreate2而不是AppCreate,或者在AppCreate之前调用CommitChanges和/或调用SetInfo,但都会导致相同的异常

我正在使用的用户凭据在远程服务器上具有管理员权限。事实上,如果我将程序复制到远程服务器并使用相同的凭据在那里运行它(我使用远程服务器上的同一用户登录),使用“localhost”作为servername,并且用户变量=null,那么它将在不引发异常的情况下工作,因此它一定与远程执行有关

远程服务器是Windows server 2003 R2 SP2(32位),运行此程序的计算机是Windows 7 Professional(64位)

有人有什么想法吗

public bool CreateVirtualDirectory(string serverName, string primaryVirtualDirectoryName, string virtualDirectoryName, MyUser user)
{
  try
  {
    DirectoryEntry directoryEntry = null;
    if (user != null)
      directoryEntry = new DirectoryEntry("IIS://" + serverName + "/W3SVC/1/Root", user.UserName, user.Password, AuthenticationTypes.Secure | AuthenticationTypes.Sealing);
    else
      directoryEntry = new DirectoryEntry("IIS://" + serverName + "/W3SVC/1/Root");

    DirectoryEntry primaryVirtualDirectory = directoryEntry.Children.Find(primaryVirtualDirectoryName, directoryEntry.SchemaClassName);

    DirectoryEntry virtualDirectory = directoryEntry.Children.Add(virtualDirectoryName, directoryEntry.SchemaClassName);
    virtualDirectory.CommitChanges();

    virtualDirectory.Properties["Path"].Value = primaryVirtualDirectory.Properties["Path"].Value;
    virtualDirectory.Properties["AppFriendlyName"][0] = virtualDirectoryName;
    if (primaryVirtualDirectory.Properties["UNCUserName"] != null && primaryVirtualDirectory.Properties["UNCUserName"].Value != null && primaryVirtualDirectory.Properties["UNCUserName"].Value.ToString().Length > 0)
    {
      // IIS6 of IIS7
      virtualDirectory.Properties["AuthNTLM"][0] = true;
      virtualDirectory.Properties["UNCUserName"].Value = primaryVirtualDirectory.Properties["UNCUserName"].Value;
      virtualDirectory.Properties["UNCPassword"].Value = primaryVirtualDirectory.Properties["UNCPassword"].Value;
    }
    else
    {
      // Older versions
      virtualDirectory.Properties["AuthFlags"][0] = 5; // MD_AUTH_ANONYMOUS | MD_AUTH_NT
      virtualDirectory.Properties["AnonymousUserName"].Value = primaryVirtualDirectory.Properties["AnonymousUserName"].Value;
      virtualDirectory.Properties["AnonymousUserPass"].Value = primaryVirtualDirectory.Properties["AnonymousUserPass"].Value;
    }
    virtualDirectory.Properties["AccessRead"][0] = true;
    virtualDirectory.Properties["AccessExecute"][0] = true;
    virtualDirectory.Properties["AccessWrite"][0] = false;
    virtualDirectory.Properties["AccessScript"][0] = true;
    virtualDirectory.Properties["EnableDefaultDoc"][0] = true;
    virtualDirectory.Properties["EnableDirBrowsing"][0] = false;
    if (primaryVirtualDirectory.Properties["AppPoolId"] != null && primaryVirtualDirectory.Properties["AppPoolId"].Value != null && primaryVirtualDirectory.Properties["AppPoolId"].Value.ToString().Length > 0)
      virtualDirectory.Properties["AppPoolId"].Value = primaryVirtualDirectory.Properties["AppPoolId"].Value;
    virtualDirectory.Properties["ScriptMaps"].Value = primaryVirtualDirectory.Properties["ScriptMaps"].Value;

    // I Tried adding these 3 lines but I keeo getting the same exception
    // virtualDirectory.CommitChanges();
    // virtualDirectory.Invoke("SetInfo");
    // virtualDirectory.CommitChanges();

    virtualDirectory.Invoke("AppCreate", true);
    // I tried this instead but I still get the same exception
    // virtualDirectory.Invoke("AppCreate2", 0);
    virtualDirectory.CommitChanges();

    return true;
  }
  catch (Exception exception)
  {
    return false;
  }
}