65.9K
CodeProject 正在变化。 阅读更多。
Home

NUKEleus - DotNetNuke 安装程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.57/5 (14投票s)

2005年3月10日

6分钟阅读

viewsIcon

111774

downloadIcon

275

适用于流行的 DotNetNuke ASP.NET 门户的安装程序。

Sample Image - NUKEleus.gif

引言

我是一名 DotNetNuke (DNN) 的布道者。我花费了许多个深夜编写新模块、构建皮肤,并且焦急地等待下一个版本的到来。如果我对 DNN 有什么抱怨,那就是 DNN 的门上总是挂着“施工中”的牌子。它从未真正完成,因为一旦一个版本发布,一些更新、更酷的技术就会出现,核心团队就会去集成它,并把它带给感激的爪牙们。所以我真的能抱怨什么吗?

这种持续开发周期的缺点是,“打磨”有时会被忽略。这是一个由开发者为开发者制作的产品,所以当需要时,我们就会亲自动手,弄得满手泥。但如果有些事情对新手来说能更简单一些,那就更好了。

DNN 一个明显缺乏的功能是安装程序。要安装门户,您需要解压文件、设置权限、创建虚拟目录、创建数据库以及编辑配置文件。对于 CodeProject 的大多数访问者来说,这都不是问题。但对于新手程序员或不熟悉 ASP.NET、IIS 或 MS SQL 的人来说,这可能有点吃力。

我没有多余的几百美元来购买 InstallShield 或 Wise 的副本并创建一个“漂亮”的安装程序,所以我自己动手做了。NUKEleus 就是最终成果。希望您喜欢它。

特点

NUKEleus 在各方面都是一个典型的向导。界面看起来不错,而且易于创建,这很大程度上归功于 DivElements 的 Wizard Framework。NUKEleus 将引导您完成以下步骤,为您处理所有棘手的工作。

  • 允许您安装 **任何** 版本的 DotNetNuke。
  • 创建一个安装文件夹(您可以选择安装 DNN 的位置)。
  • 解压缩文件。
  • 为计算机的 ASP.NET 帐户授予适当的文件夹权限。
  • 创建一个虚拟目录(您可以选择 VDir 名称)。
  • 在 SQL Server 中创建一个空白数据库(您可以选择数据库名称)。
  • 编辑 Web.Config 文件以包含您的自定义信息。
  • 编辑 DotNetNuke.slnDotNetNuke.vbproj.webinfo 文件,以便您能够打开解决方案。

此外,NUKEleus 是开源的,遵循标准的 GNU 许可证,因此它可以根据需要进行扩展并获得社区的支持。

绊脚石

编写这个安装程序对我来说是一个真正的学习过程。我不知道如何执行几个必要的动作,例如创建虚拟目录和分配 NTFS 权限。而且我仍然不完全满意事物的实现方式。但程序正在运行,这是第一步。我希望社区能加入进来,为使这个产品比现在更完善。

分配 NTFS 文件夹权限

也许,要开始解决这个问题最困难的部分是弄清楚如何用 Google 搜索。搜索“Give <machinename>\ASPNET rights to a folder”没有得到任何结果。经过数小时和几粒 Advil 的搜索,我开始遇到一些非常有趣的缩写,例如安全描述符 (SDs)、访问控制列表 (ACLs) 和访问控制条目 (ACEs)。所有这些都与设置安全权限有关——不仅是对文件夹,而是对几乎所有东西。坏消息是 .NET 似乎没有内置处理这些的库(至少据我所知)。大多数可用的源代码示例都是 C++ 的,这在 VB.NET 环境中对我没有帮助。其他示例是旧代码,例如 MSDN 上的这个例子的高级例程。经过大量的尝试和错误,我仍然没有得到我想要的结果,所以我退而求其次,使用了一个我找到的命令行实用程序来完成这项工作。一旦我发布这篇文章,我打算进一步研究这个问题。

创建虚拟目录

以编程方式创建虚拟目录要容易一些,这不仅是因为我找到了一些代码,还因为 .NET 本身支持它。然而,这个过程并不直观。我认为快速浏览 MSDN 库也无法使其清晰。创建 VDir 的关键是 System.DirectoryServices.DirectoryEntry。尽管下面的代码相当冗长,但简而言之,您需要创建一个目录条目,为其分配必要的属性,然后提交更改。在这方面,它有点像向数据库添加记录。总之,这里是代码

 Private Sub CreateVDir(ByVal WebSite As String, ByVal VDirName As String, _
             ByVal Path As String, ByVal RootDir As Boolean)
     Dim IISSchema As System.DirectoryServices.DirectoryEntry
     Dim IISAdmin As System.DirectoryServices.DirectoryEntry
     Dim VDir As System.DirectoryServices.DirectoryEntry
     Dim IISUnderNT As Boolean
     IISSchema = New System.DirectoryServices.DirectoryEntry("IIS://" & _
                                               WebSite & "/Schema/AppIsolated")
     If IISSchema.Properties("Syntax").Value.ToString.ToUpper() = "BOOLEAN" _
     Then
         IISUnderNT = True
     Else
         IISUnderNT = False
         IISSchema.Dispose()
         IISAdmin = New System.DirectoryServices.DirectoryEntry("IIS://" & _
                                                   WebSite & "/W3SVC/1/Root")
         ' If the virtual directory already exists then delete it
         For Each v As DirectoryEntry In IISAdmin.Children
             If v.Name = VDirName Then
                 'Delete the specified virtual directory if it already exists
                 Try
                     IISAdmin.Invoke("Delete", _
                         New String() {v.SchemaClassName, VDirName})
                     IISAdmin.CommitChanges()
                 Catch ex As Exception
                     MsgBox("Error deleting existing VDir:" & ex.Message, _
                             MsgBoxStyle.Critical, "Error Deleting VDir")
                 End Try
            End If
        Next
        If Not RootDir Then
            VDir = IISAdmin.Children.Add(VDirName, "IIsWebVirtualDir")
        Else
            VDir = IISAdmin
        End If
        VDir.Properties("AccessRead")(0) = True
        VDir.Properties("AccessExecute")(0) = True
        VDir.Properties("AccessWrite")(0) = False
        VDir.Properties("AccessScript")(0) = True
        VDir.Properties("AuthNTLM")(0) = True
        VDir.Properties("EnableDefaultDoc")(0) = True
        VDir.Properties("EnableDirBrowsing")(0) = False
        VDir.Properties("DefaultDoc")(0) = _
                                       "default.htm,default.aspx,default.asp"
        VDir.Properties("Path")(0) = Path
        VDir.Properties("AppFriendlyName")(0) = VDirName
        If Not IISUnderNT Then
            VDir.Properties("AspEnableParentPaths")(0) = True
        End If
        VDir.CommitChanges()
        If IISUnderNT Then
            VDir.Invoke("AppCreate", False)
        Else
            VDir.Invoke("AppCreate", 1)
        End If
    End If
    pageVirtualDirectory.AllowMoveNext = True
End Sub

解压 ZIP 文件

同样,我相当惊讶这样一个常见需求没有被 .NET 内部库处理,但它确实没有。幸运的是,社区很快就抓住了这一点,并创建了一个名为 SharpZipLib 的优秀库。使用这个库解压相当直接,网上也有如何做的方法。但我让您注意到的是代码底部的 RaiseEvent 调用。由于解压大文件(所有 DNN 文件都很大)可能需要一段时间,我认为最好在单独的线程中运行此操作。这允许最终用户根据需要暂停或取消解压操作。我对于多线程范例仍然相当陌生,但 VB.NET 获得这项能力的时候到了。

 Private Sub Unzip()
     Dim strmZipInputStream As ZipInputStream = _
                            New ZipInputStream(File.OpenRead(bfFileName.Text))
     Dim objEntry As ZipEntry
     Dim count As Integer = 1
     objEntry = strmZipInputStream.GetNextEntry()
     While IsNothing(objEntry) = False
         Dim nSize As Integer = 2048
         Dim abyData(2048) As Byte
         Dim directoryName As String = bfFolder.Text & _
                                         Path.GetDirectoryName(objEntry.Name)
         Dim fileName As String = Path.GetFileName(objEntry.Name)
         lblFile.Text = "Extracting: " & fileName
         ProgressBar1.Value = count
         Directory.CreateDirectory(directoryName)
         If fileName <> "" Then
             Dim StreamWriter As FileStream = _
                         File.Create(directoryName & "\"    & fileName)
             While True
                 nSize = strmZipInputStream.Read(abyData, 0, abyData.Length)
                 If nSize > 0 Then
                     StreamWriter.Write(abyData, 0, nSize)
                 Else
                     Exit While
                 End If
             End While
             StreamWriter.Close()
         End If
         count += 1
         objEntry = strmZipInputStream.GetNextEntry()
     End While
     strmZipInputStream.Close()
     RaiseEvent ThreadComplete()
 End Sub

赤裸裸的自我推广

我喜欢编写向导和工具。我很快意识到我反复做的一件事就是创建特殊字段来查找文件和文件夹。为此,我创建了 BrowseControls。它们允许您将控件直接放在 WinForm 上,而无需再考虑从硬盘上选择文件或文件夹所需的所有编码。

思考和警告

NUKEleus 目前是一个相对未经测试的产品。请谨慎使用。它仅用于新的 DotNetNuke 安装。可以用于升级,但这样做会覆盖您的 Web.Config 并重新创建您的虚拟目录等。无论如何,在尝试任何类型的 DNN 升级之前,您都应该备份您的文件和数据库。

为了保持该软件的开放和发展,我还将其添加到了 SourceForge

总结

希望您喜欢这个程序,并且一旦了解了 DotNetNuke,您一定会爱上它。如果您有任何意见、建议或修复,请发表您的声音。

© . All rights reserved.