In this section, you will begin the first of several exercises throughout Part III "Exploring the ADSI Service Providers: IIS," that will ultimately yield the creation of the IISAdmin.DLL COM server.
Tip
You can download the Visual Basic 6.0 project or pre-compiled version of IISAdmin.DLL from http://www.newriders.com/adsi.
Open a new ActiveX DLL Visual Basic project.
Set a reference to the Active DS Type Library by clicking the Project menu, References , and placing a check mark next to the Active DS Type Library entry. Click the OK command button to exit the References “Project1 dialog box.
Rename the project Project1 as IIsAdmin .
Rename the Class1 class module as IIsSiteManagement .
Enter the following code into the General Declarations section of the class module:
Public Function BackupOperations(ByVal TargetComputer As String, ByVal Action As String, Optional ByVal BackupName As String) As Variant On Error Resume Next Dim IIsComputer As IADs Set IIsComputer = GetObject("IIS://" & TargetComputer) Select Case UCase(Action) Case "BACKUP" Dim Flags As Long Flags = (MD_BACKUP_SAVE_FIRST Or MD_BACKUP_FORCE_BACKUP) IIsComputer.Backup BackupName, MD_BACKUP_NEXT_VERSION, Flags If Err.Number = 0 Then BackupOperations = True Case "ENUMERATE" Dim Version, Index, TermCond As Integer Dim Location As Variant Dim UTCDate As Variant Dim NewElement() As Variant Dim i As Long Do While TermCond <> 1 IIsComputer.EnumBackups ", Index, Version, Location, UTCDate If Err.Number <> 0 Then Exit Do End If i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = Location & vbTab & Version & vbTab & UTCDate Index = Index + 1 Err.Number = 0 Loop BackupOperations = NewElement Case "RESTORE" Call IIsComputer.Restore(BackupName, MD_BACKUP_HIGHEST_VERSION, 0) If Err.Number = 0 Then BackupOperations = True Case "DELETE" Call IIsComputer.DeleteBackup(BackupName, MD_BACKUP_HIGHEST_VERSION) If Err.Number = 0 Then BackupOperations = True End Select End Function Public Function MaxBandwidth(ByVal TargetComputer As String, ByVal Action As String, Optional ByVal NewThrottleValue As Long) As Variant Dim IIsComputer As IADs Set IIsComputer = GetObject("IIS://" & TargetComputer) Select Case UCase(Action) Case "QUERY" MaxBandwidth = IIsComputer.MaxBandwidth Case "SET" IIsComputer.MaxBandwidth = NewThrottleValue IIsComputer.SetInfo If Err.Number = 0 Then MaxBandwidth = True End Select End Function Public Function MIMETypeManagement(ByVal TargetComputer As String, ByVal Action As String, Optional ByVal MIMEExtension As String, Optional ByVal MIMEType As String) As Variant On Error Resume Next Dim IIsComputer As IADs Set IIsComputer = GetObject("IIS://" & TargetComputer & "/MimeMap") Select Case UCase(Action) Case "ENUMERATE" Dim MimeMapping As Variant Dim NewElement() As Variant Dim i As Long For Each MimeMapping In IIsComputer.MimeMap i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = MimeMapping.Extension & vbTab & MimeMapping.MIMEType Next MIMETypeManagement = NewElement Case "ADD" If MIMEType <> " And MIMEExtension <> " Then Dim NewMimeMapping As Variant NewMimeMapping = IIsComputer.GetEx("MimeMap") i = UBound(NewMimeMapping) + 1 ReDim Preserve NewMimeMapping(i) Set NewMimeMapping(i) = CreateObject("MimeMap") NewMimeMapping(i).MIMEType = MIMEType NewMimeMapping(i).Extension = MIMEExtension IIsComputer.PutEx ADS_PROPERTY_UPDATE, "MimeMap", NewMimeMapping Err.Number = 0 IIsComputer.SetInfo If Err.Number = 0 Then MIMETypeManagement = True Else MIMETypeManagement = False End If Case "REMOVE" If MIMEExtension <> " Then Dim MapToDelete As String Dim MimeItem As Variant NewMimeMapping = IIsComputer.MimeMap For Each MimeMapping In IIsComputer.MimeMap If MimeMapping.Extension <> MIMEExtension Then ReDim Preserve NewMimeMapping(i) Set NewMimeMapping(i) = CreateObject("MimeMap") NewMimeMapping(i).MIMEType = MimeMapping.MIMEType NewMimeMapping(i).Extension = MimeMapping.Extension i = i + 1 End If Next IIsComputer.PutEx ADS_PROPERTY_UPDATE, "MimeMap", NewMimeMapping Err.Number = 0 IIsComputer.SetInfo If Err.Number = 0 Then MIMETypeManagement = True Else MIMETypeManagement = False End If End Select End Function Public Function SiteLogging(ByVal TargetComputer As String, ByVal IIsService As String, ByVal SiteIndex As Integer, ByVal Action As String, ByVal LoggingProperty As String, Optional ByVal NewValue) As Variant Dim Site As IADs Dim Item As Variant Select Case UCase(IIsService) Case "WWW" Set Site = GetObject("IIS://" & TargetComputer & "/W3SVC/" & SiteIndex) Case "FTP" Set Site = GetObject("IIS://" & TargetComputer & "/MSFTPSVC/" & SiteIndex) Case "SMTP" Set Site = GetObject("IIS://" & TargetComputer & "/SMTPSVC/" & SiteIndex) Case "NNTP" Set Site = GetObject("IIS://" & TargetComputer & "/NNTPSVC/" & SiteIndex) End Select Select Case UCase(Action) Case "QUERY" Select Case UCase(LoggingProperty) Case "LOGGINGENABLED" SiteLogging = Site.LogType Case "LOGTYPE" Dim Log As IADs Set Log = GetObject("IIS://" & TargetComputer & "/logging") For Each Item In Log If Site.LogPluginCLSID = Item.LogModuleID Then SiteLogging = Item.Name End If Next Case "LOGFILEPERIOD" SiteLogging = Site.LogFilePeriod Case "TRUNCATESIZE" SiteLogging = Site.LogFileTruncateSize End Select Case "SET" Select Case UCase(LoggingProperty) Case "LOGGINGENABLED" Site.LogType = NewValue Site.SetInfo Case "LOGTYPE" Set Log = GetObject("IIS://" & TargetComputer & "/logging") Dim NewLogFormatName As String Select Case UCase(NewValue) Case "NCSA" NewValue = "NCSA Common Log File Format" Case "ODBC" NewValue = "ODBC Logging" Case "IIS" NewValue = "Microsoft IIS Log File Format" Case "W3C" NewValue = "W3C Extended Log File Format" End Select For Each Item In Log If Item.Name = NewValue Then Site.LogPluginCLSID = Item.LogModuleID Site.SetInfo End If Next Case "LOGFILEPERIOD" Site.LogFilePeriod = NewValue Site.SetInfo Case "TRUNCATESIZE" Site.LogFilePeriod = 0 Site.LogFileTruncateSize = NewValue Site.SetInfo End Select If Err.Number = 0 Then SiteLogging = True End Select End Function Public Function ExtendedLogProperty(ByVal TargetComputer As String, ByVal IIsService As String, ByVal SiteIndex As Integer, ByVal Action As String, ByVal LoggingProperty As String, Optional ByVal NewValue) As Variant Dim Site As IADs Select Case UCase(IIsService) Case "WWW" Set Site = GetObject("IIS://" & TargetComputer & "/W3SVC/" & SiteIndex) Case "FTP" Set Site = GetObject("IIS://" & TargetComputer & "/MSFTPSVC/" & SiteIndex) Case "SMTP" Set Site = GetObject("IIS://" & TargetComputer & "/SMTPSVC/" & SiteIndex) Case "NNTP" Set Site = GetObject("IIS://" & TargetComputer & "/NNTPSVC/" & SiteIndex) End Select Select Case UCase(Action) Case "QUERY" Select Case UCase(LoggingProperty) Case "DATE" ExtendedLogProperty = Site.LogExtFileDate Case "TIME" ExtendedLogProperty = Site.LogExtFileTime Case "CLIENTIP" ExtendedLogProperty = Site.LogExtFileClientIp Case "USERNAME" ExtendedLogProperty = Site.LogExtFileUserName Case "SERVICENAME" ExtendedLogProperty = Site.LogExtFileSiteName Case "SERVERNAME" ExtendedLogProperty = Site.LogExtFileComputerName Case "SERVERIP" ExtendedLogProperty = Site.LogExtFileServerIp Case "SERVERPORT" ExtendedLogProperty = Site.LogExtFileServerPort Case "METHOD" ExtendedLogProperty = Site.LogExtFileMethod Case "URISTEM" ExtendedLogProperty = Site.LogExtFileUriStem Case "URIQUERY" ExtendedLogProperty = Site.LogExtFileUriQuery Case "HTTPSTATUS" ExtendedLogProperty = Site.LogExtFileHttpStatus Case "WIN32STATUS" ExtendedLogProperty = Site.LogExtFileWin32Status Case "BYTESSENT" ExtendedLogProperty = Site.LogExtFileBytesSent Case "BYTESRECEIVED" ExtendedLogProperty = Site.LogExtFileBytesRecv Case "TIMETAKEN" ExtendedLogProperty = Site.LogExtFileTimeTaken Case "PROTOCOLVERSION" ExtendedLogProperty = Site.LogExtFileProtocolVersion Case "USERAGENT" ExtendedLogProperty = Site.LogExtFileUserAgent Case "COOKIE" ExtendedLogProperty = Site.LogExtFileCookie Case "REFERRER" ExtendedLogProperty = Site.LogExtFileReferer End Select Case "SET" Select Case UCase(LoggingProperty) Case "DATE" Site.LogExtFileDate = NewValue Site.SetInfo Case "TIME" Site.LogExtFileTime = NewValue Site.SetInfo Case "CLIENTIP" Site.LogExtFileClientIp = NewValue Site.SetInfo Case "USERNAME" Site.LogExtFileUserName = NewValue Site.SetInfo Case "SERVICENAME" Site.LogExtFileSiteName = NewValue Site.SetInfo Case "SERVERNAME" Site.LogExtFileComputerName = NewValue Site.SetInfo Case "SERVERIP" Site.LogExtFileServerIp = NewValue Site.SetInfo Case "SERVERPORT" Site.LogExtFileServerPort = NewValue Site.SetInfo Case "METHOD" Site.LogExtFileMethod = NewValue Site.SetInfo Case "URISTEM" Site.LogExtFileUriStem = NewValue Site.SetInfo Case "URIQUERY" Site.LogExtFileUriQuery = NewValue Site.SetInfo Case "HTTPSTATUS" Site.LogExtFileHttpStatus = NewValue Site.SetInfo Case "WIN32STATUS" Site.LogExtFileWin32Status = NewValue Site.SetInfo Case "BYTESSENT" Site.LogExtFileBytesSent = NewValue Site.SetInfo Case "BYTESRECEIVED" Site.LogExtFileBytesRecv = NewValue Site.SetInfo Case "TIMETAKEN" Site.LogExtFileTimeTaken = NewValue Site.SetInfo Case "PROTOCOLVERSION" Site.LogExtFileProtocolVersion = NewValue Site.SetInfo Case "USERAGENT" Site.LogExtFileUserAgent = NewValue Site.SetInfo Case "COOKIE" Site.LogExtFileCookie = NewValue Site.SetInfo Case "REFERRER" Site.LogExtFileReferer = NewValue Site.SetInfo End Select If Err.Number = 0 Then ExtendedLogProperty = True End Select End Function Public Function ODBCLogging(ByVal TargetComputer As String, ByVal IIsService As String, ByVal SiteIndex As Integer, ByVal Action As String, ByVal LoggingProperty As String, Optional ByVal NewValue) As Variant Dim Site As IADs Select Case UCase(IIsService) Case "WWW" Set Site = GetObject("IIS://" & TargetComputer & "/W3SVC/" & SiteIndex) Case "FTP" Set Site = GetObject("IIS://" & TargetComputer & "/MSFTPSVC/"& SiteIndex) Case "SMTP" Set Site = GetObject("IIS://" & TargetComputer & "/SMTPSVC/" & SiteIndex) Case "NNTP" Set Site = GetObject("IIS://" & TargetComputer & "/NNTPSVC/" & SiteIndex) End Select Select Case UCase(Action) Case "QUERY" Select Case UCase(LoggingProperty) Case "DSN" ODBCLogging = Site.LogOdbcDataSource Case "PASSWORD" ODBCLogging = Site.LogOdbcPassword Case "USERNAME" ODBCLogging = Site.LogOdbcTableName Case "TABLENAME" ODBCLogging = Site.LogOdbcUserName End Select Case "SET" Select Case UCase(LoggingProperty) Case "DSN" Site.LogOdbcDataSource = NewValue Site.SetInfo Case "PASSWORD" Site.LogOdbcPassword = NewValue Site.SetInfo Case "USERNAME" Site.LogOdbcTableName = NewValue Site.SetInfo Case "TABLENAME" Site.LogOdbcUserName = NewValue Site.SetInfo End Select If Err.Number = 0 Then ODBCLogging = True End Select End Function Public Function EnumerateSites(ByVal TargetComputer As String, ByVal IIsService As String) As Variant On Error Resume Next Dim Parent As IADs Dim Child As IADs Dim NewElement() As Variant Dim i As Long Select Case UCase(IIsService) Case "WWW" Set Parent = GetObject("IIS://" & TargetComputer & "/W3SVC") Case "FTP" Set Parent = GetObject("IIS://" & TargetComputer & "/MSFTPSVC") Case "SMTP" Set Parent = GetObject("IIS://" & TargetComputer & "/SMTPSVC") Case "NNTP" Set Parent = GetObject("IIS://" & TargetComputer & "/NNTPSVC") End Select For Each Child In Parent If IsNumeric(Child.Name) Then i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = Child.Name & vbTab & Child.ServerComment End If Next EnumerateSites = NewElement End Function Public Function CreateSite(ByVal TargetComputer As String, ByVal IIsService As String, ByVal SiteName As String, ByVal SitePath As String) As Boolean Dim Parent As IADs Dim Child As Variant Dim NewSite As IADs Dim NewRoot As IADs Dim Index As Integer Select Case UCase(IIsService) Case "WWW" Set Parent = GetObject("IIS://" & TargetComputer & "/W3SVC") Case "FTP" Set Parent = GetObject("IIS://" & TargetComputer & "/MSFTPSVC") Case "SMTP" Set Parent = GetObject("IIS://" & TargetComputer & "/SMTPSVC") Case "NNTP" Set Parent = GetObject("IIS://" & TargetComputer & "/NNTPSVC") End Select For Each Child In Parent If IsNumeric(Child.Name) Then If Index < Child.Name Then Index = Child.Name End If End If Next Index = Index + 1 Select Case UCase(IIsService) Case "WWW" Set NewSite = Parent.Create("IIsWebServer", Index) NewSite.ServerComment = SiteName NewSite.SetInfo Set NewRoot = NewSite.Create("IIsWebVirtualDir", "Root") NewRoot.Path = SitePath Err.Number = 0 NewRoot.SetInfo Case "FTP" Set NewSite = Parent.Create("IIsFTPServer", Index) NewSite.ServerComment = SiteName NewSite.SetInfo Set NewRoot = NewSite.Create("IIsFTPVirtualDir", "Root") NewRoot.Path = SitePath Err.Number = 0 NewRoot.SetInfo End Select If Err.Number = 0 Then CreateSite = True End Function Public Function DeleteSite(ByVal TargetComputer As String, ByVal IIsService As String, ByVal SiteName As String) As Boolean Dim Parent As IADs Dim Child As Variant Dim NewSite As IADs Dim Counter As Integer Dim IndexValue As Long Select Case UCase(IIsService) Case "WWW" Set Parent = GetObject("IIS://" & TargetComputer & "/W3SVC") Case "FTP" Set Parent = GetObject("IIS://" & TargetComputer & "/MSFTPSVC") End Select Counter = 0 For Each Child In Parent If IsNumeric(Child.Name) Then If LCase(Child.ServerComment) = LCase(SiteName) Then Counter = Counter + 1 IndexValue = Child.Name End If End If Next If Counter = 1 Then Select Case UCase(IIsService) Case "WWW" Call Parent.Delete("IIsWebServer", IndexValue) Case "FTP" Call Parent.Delete("IIsFTPServer", IndexValue) End Select Set Parent = Nothing End If If Err.Number = 0 Then DeleteSite = True End Function Public Function EnumerateDirectory(ByVal TargetComputer As String, ByVal IIsService As String, ByVal SiteIndex As Integer, ByVal RelativePath As String) As Variant On Error Resume Next Dim Parent As IADs Dim Child As Variant Dim NewElement() As Variant Dim i As Long Select Case UCase(IIsService) Case "WWW" Set Parent = GetObject("IIS://" & TargetComputer & "/W3SVC/" & SiteIndex & "/ROOT" & RelativePath) Case "FTP" Set Parent = GetObject("IIS://" & TargetComputer & "/MSFTPSVC/" & SiteIndex & "/ROOT" & RelativePath) Case "SMTP" Set Parent = GetObject("IIS://" & TargetComputer & "/SMTPSVC/" & SiteIndex & "/ROOT" & RelativePath) Case "NNTP" Set Parent = GetObject("IIS://" & TargetComputer & "/NNTPSVC/" & SiteIndex & "/ROOT" & RelativePath) End Select For Each Child In Parent i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = Child.Name Next EnumerateDirectory = NewElement End Function Public Function CreateVirDir(ByVal TargetComputer As String, ByVal IIsService As String, ByVal SiteIndex As Integer, ByVal VDirName As String, ByVal VDirPath As String) As Boolean Dim Parent As IADs Dim NewVDir As IADs Select Case UCase(IIsService) Case "WWW" Set Parent = GetObject("IIS://" & TargetComputer & "/W3SVC/" & SiteIndex & "/Root") Set NewVDir = Parent.Create("IIsWebVirtualDir", VDirName) Case "FTP" Set Parent = GetObject("IIS://" & TargetComputer & "/MSFTPSVC/"& SiteIndex & "/Root") Set NewVDir = Parent.Create("IIsFTPVirtualDir", VDirName) Case "NNTP" Set Parent = GetObject("IIS://" & TargetComputer & "/NNTPSVC/" & SiteIndex & "/Root") Set NewVDir = Parent.Create("IIsNNTPVirtualDir", VDirName) End Select NewVDir.SetInfo NewVDir.Path = VDirPath Err.Number = 0 NewVDir.SetInfo If Err.Number = 0 Then CreateVirDir = True End Function Public Function DeleteVirDir(ByVal TargetComputer As String, ByVal IIsService As String, ByVal SiteIndex As Integer, ByVal VDirName As String) As Boolean Dim Parent As IADs Select Case UCase(IIsService) Case "WWW" Set Parent = GetObject("IIS://" & TargetComputer & "/W3SVC/" & SiteIndex & "/Root") Call Parent.Delete("IIsWebVirtualDir", VDirName) Case "FTP" Set Parent = GetObject("IIS://" & TargetComputer & "/MSFTPSVC/"& SiteIndex & "/Root") Call Parent.Delete("IIsFTPVirtualDir", VDirName) Case "NNTP" Set Parent = GetObject("IIS://" & TargetComputer & "/NNTPSVC/" & SiteIndex & "/Root") Call Parent.Delete("IIsNntpVirtualDir", VDirName) End Select Set Parent = Nothing If Err.Number = 0 Then DeleteVirDir = True End Function Public Function CreateWebDirEntry(ByVal TargetComputer As String, ByVal SiteIndex As Integer, ByVal RelativePath As String, ByVal NewEntry As String) As Boolean Dim VirtualDirectory As IADs Dim WebDir As IADs Set VirtualDirectory = GetObject("IIS://" & TargetComputer & "/W3SVC/" & SiteIndex & "/ROOT"&RelativePath) Set WebDir = VirtualDirectory.Create("IIsWebDirectory", NewEntry) WebDir.SetInfo If Err.Number = 0 Then CreateWebDirEntry = True End Function Public Function DeleteWebDirEntry(ByVal TargetComputer As String, ByVal SiteIndex As Integer, ByVal RelativePath As String, ByVal EntryToDelete As String) As Boolean Dim VirtualDirectory As IADsContainer Set VirtualDirectory = GetObject("IIS://" & TargetComputer & "/W3SVC/" & SiteIndex & "/ROOT" & RelativePath) Call VirtualDirectory.Delete("IIsWebDirectory", EntryToDelete) If Err.Number = 0 Then DeleteWebDirEntry = True End Function Public Function CreateWebFileEntry(ByVal TargetComputer As String, ByVal SiteIndex As Integer, ByVal RelativePath As String, ByVal NewEntry As String) As Boolean Dim VirtualDirectory As IADs Dim WebFile As IADs Set VirtualDirectory = GetObject("IIS://" & TargetComputer & "/W3SVC/" & SiteIndex & "/ROOT" & RelativePath) Set WebFile = VirtualDirectory.Create("IIsWebFile", NewEntry) WebFile.SetInfo If Err.Number = 0 Then CreateWebFileEntry = True End Function Public Function DeleteWebFileEntry(ByVal TargetComputer As String, ByVal SiteIndex As Integer, ByVal RelativePath As String, ByVal EntryToDelete As String) As Boolean Dim VirtualDirectory As IADs Set VirtualDirectory = GetObject("IIS://" & TargetComputer & "/W3SVC/" & SiteIndex & "/ROOT" & RelativePath) Call VirtualDirectory.Delete("IIsWebFile", EntryToDelete) If Err.Number = 0 Then DeleteWebFileEntry = True End Function Public Function SiteOperations(ByVal TargetComputer As String, ByVal IIsService As String, ByVal SiteIndex As Integer, ByVal Operation As String) As Variant Dim Site As IADs Dim SiteStatus As Integer Select Case UCase(IIsService) Case "WWW" Set Site = GetObject("IIS://" & TargetComputer & "/W3SVC/" & SiteIndex) Case "FTP" Set Site = GetObject("IIS://" & TargetComputer & "/MSFTPSVC/" & SiteIndex) Case "SMTP" Set Site = GetObject("IIS://" & TargetComputer & "/SmtpSvc/" & SiteIndex) Case "NNTP" Set Site = GetObject("IIS://" & TargetComputer & "/NNTPSVC/" & SiteIndex) End Select SiteStatus = Site.Status Select Case UCase(Operation) Case "START" If SiteStatus = 4 Or SiteStatus = 3 Then Site.Start If Err.Number = 0 Then SiteOperations = True End If Case "STOP" If SiteStatus = 2 Or SiteStatus = 1 Then Site.Stop If Err.Number = 0 Then SiteOperations = True End If Case "CONTINUE" If SiteStatus = 6 Or SiteStatus = 5 Then Site.Continue If Err.Number = 0 Then SiteOperations = True End If Case "PAUSE" If SiteStatus = 1 Or SiteStatus = 2 Then Site.Pause If Err.Number = 0 Then SiteOperations = True End If Case "QUERY" Select Case SiteStatus Case 1 SiteOperations = "Starting" Case 2 SiteOperations = "Started" Case 3 SiteOperations = "Stopping" Case 4 SiteOperations = "Stopped" Case 5 SiteOperations = "Pausing" Case 6 SiteOperations = "Paused" Case 7 SiteOperations = "Continuing" End Select End Select End Function
Compile the code as IIsAdmin.DLL.
Save and close the IIsAdmin project.
Tip
If you do not wish to share your code between applications, you can enter the preceding code into a code module in any Visual Basic application.
Top |