Ошибка «Недопустимый класс» при запуске сайта FTp в IIS 7.0 с использованием WMI и ASP.Net C # (windows Server 2008) - PullRequest
0 голосов
/ 13 февраля 2010

Я работаю над программным обеспечением ASP.Net для веб-сайтов, используя WMI (System.Managment) и C #.

Я пытаюсь создать FTP-сайт на моем «Целевом сервере», расположенном где-то в локальной сети, во время выполнения кода на моем хост-компьютере. У меня проблемы с запуском FTP-сайта после его создания.

Сообщение об ошибке: «Недопустимый класс» в следующей строке:

ManagementObject site = new ManagementObject(
          new ManagementPath(string.Format(@"IIsFtpServer.Name='MSFTPSVC/{0}'", siteId)), null);
        **site.InvokeMethod("Start", null);**

Вот моя полная функция.

public static String CreateFtpsite(String serverName,
    String ip,String ServerComment,int AccessFlags,
    String pathToRoot, String hostName, String domainName, int port)
{
    //ConnectionOptions options = new ConnectionOptions();
    //options.Authentication = AuthenticationLevel.Connect;
    //options.EnablePrivileges = true;
    //options.Impersonation = ImpersonationLevel.Impersonate;
    ConnectionOptions options = SetUpAuthorization();
    ManagementScope scope =
       new ManagementScope(string.Format(@"\\{0}\root\MicrosoftIISv2", serverName), options);
    scope.Connect();
    ManagementObject oW3SVC = new ManagementObject(scope,
    new ManagementPath(@"IIsFtpService='MSFTPSVC'"), null);

    ManagementBaseObject[] serverBindings = new ManagementBaseObject[3];
    /*serverBindings[0] = CreateServerBinding(scope, 
                        string.Format("{0}.{1}", hostName, domainName), ip, port);
    */
    serverBindings[0] = CreateServerBinding(scope,
                        string.Format("{0}", hostName, domainName), ip, port);
    serverBindings[1] = CreateServerBinding(scope,
                        string.Format(ip, hostName, domainName), ip, port);
    serverBindings[2] = CreateServerBinding(scope,
                        string.Format("127.0.0.1", hostName, domainName), ip, port);

    ManagementBaseObject inputParameters = oW3SVC.GetMethodParameters("CreateNewSite");

    inputParameters["ServerBindings"] = serverBindings;
    inputParameters["ServerComment"] = ServerComment;
    inputParameters["PathOfRootVirtualDir"] = pathToRoot;

    ManagementBaseObject outParameter =
      oW3SVC.InvokeMethod("CreateNewSite", inputParameters, null);

    string siteId = Convert.ToString(
     outParameter.Properties["ReturnValue"].Value).Replace(
     "IIsFtpServer='MSFTPSVC/", "").Replace("'", "");
    ManagementObject oFtpVirtDir = new ManagementObject(scope,
    new ManagementPath(string.Format(
        @"IIsFtpVirtualDirSetting.Name='MSFTPSVC/{0}/root'", siteId)), null);
    oFtpVirtDir.Properties["AccessFlags"].Value = AccessFlags ;
    oFtpVirtDir.Properties["Path"].Value = pathToRoot;

    ManagementObject oFtpVirtDirProperties = new ManagementObject(scope,
    new ManagementPath(string.Format(@"IIsFtpServerSetting.Name='MSFTPSVC/{0}'", siteId)), null);
    oFtpVirtDirProperties.Properties["AllowAnonymous"].Value  = true;
    oFtpVirtDirProperties.Properties["AnonymousOnly"].Value = true;
    oFtpVirtDirProperties.Properties["AnonymousUserName"].Value = @"DevIIS\Administrator";
    oFtpVirtDirProperties.Properties["AnonymousUserPass"].Value = "Passw0rd";
    oFtpVirtDirProperties.Properties["MaxConnections"].Value = 555;
    oFtpVirtDirProperties.Properties["ServerAutoStart"].Value = true;
    oFtpVirtDirProperties.Properties["UserIsolationMode"].Value = 1;
    oFtpVirtDirProperties.Properties["ConnectionTimeout"].Value = 1234 ;
    oFtpVirtDirProperties.Properties["LogFileTruncateSize"].Value = 54321;
    oFtpVirtDirProperties.Put();

    ManagementObject site = new ManagementObject(
      new ManagementPath(string.Format(@"IIsFtpServer.Name='MSFTPSVC/{0}'", siteId)), null);
    site.InvokeMethod("Start", null); //Error occurs Here (Invalid Class)
    return siteId;
}

public static ConnectionOptions SetUpAuthorization()
    {
        ConnectionOptions options = new ConnectionOptions();

        options.Authentication = AuthenticationLevel.PacketPrivacy;
        options.EnablePrivileges = true;
        options.Impersonation = ImpersonationLevel.Impersonate;
        options.Username = @"DevIIS\Administrator";
        options.Password = "Passw0rd";
        return options;
    }

При анализе кода я обнаружил, что объект "site" выдает исключение "Invalid Class" в "site.ClassPath".

Я также пытался использовать следующую строку, но там есть та же ошибка.

ManagementObject site = new ManagementObject(scope, 
      new ManagementPath(Convert.ToString(
      outParameter.Properties["ReturnValue"].Value)), null);

        site.InvokeMethod("Start", null);

Но FTP-сайт создан и все его свойства установлены, но он не запускается с помощью кода. Запустить его можно вручную, зайдя в IIS Manager.

Код отлично работает на IIS 6.0 и (так как я использую WMI), я ожидаю, что он должен нормально работать на IIS 7.0 или более поздней версии. Я делаю что-то не так, но не могу догадаться, где. Пожалуйста, помогите. Спасибо.

Спасибо

Ответы [ 2 ]

1 голос
/ 15 февраля 2010

в iis7 не создает папку «MSFTPSVC» в метабазе. он помещает ftpsite в контейнер веб-сайта в базе данных. поэтому ответ будет: используйте @ "IIsWebService = 'W3SVC'" в качестве пути управления вместо того, что вы используете.

0 голосов
/ 26 февраля 2010

Я сам решил проблему, когда вызывал функцию в неправильном классе. Метод «Пуск» должен вызываться на сервере класса. т.е. IIsWebServer.Start () или IIsFtpServer.Start ()

...