Search code examples
vb.netcomcomadmin

Component services. programmatically add component with specific user credentials. vb.net


I am trying to add components to com services in a vb.net app. I have gotten everything working as it should apart from assigning a user role to the component. The component cant be accessed without this specified role.

Below is my code for adding the object, I keep getting a "value does not fall within the expected range" error.

Any help with this would be greatly appreciated.

 Public Function InstallComPlusComponent(ByVal applicationName As String, _
        ByVal componentAddress As String, ByVal serverName As String) As Boolean

            Dim catalog As New COMAdmin.COMAdminCatalog
            Dim componentName, localAddress As String
            Dim componentClass() As String

            Try
                catalog.Connect(serverName)
            Catch COMEx As COMException
                catalog.Connect(My.Computer.Name)
                'Return False
            End Try

            If Not CheckComPlusAppExists(serverName, applicationName) Then
                Try
                    AddComPlusApplication(applicationName, serverName)
                Catch Ex As COMException
                    Debug.WriteLine(Ex.Message.ToString)
                    Return False
                    Exit Function
                End Try
            End If

            Try
                localAddress = GENERATE_LocalPath(componentAddress)
                catalog.InstallComponent(applicationName, localAddress, "", "")

                'componentName = Microsoft.VisualBasic.Right(componentAddress, 26)
                'componentName = Microsoft.VisualBasic.Left(componentName, 22)
                'componentClass = Microsoft.VisualBasic.Split(Microsoft.VisualBasic.Right(componentName, 11), ".")
                'componentName = componentName & "." & componentClass(0)

                componentName = My.Settings.ComName

                Dim apps As COMAdmin.COMAdminCatalogCollection = CType _
                (catalog.GetCollection("Applications"),  _
                COMAdmin.COMAdminCatalogCollection)

                apps.Populate()

                Dim app As COMAdmin.COMAdminCatalogObject

                For Each app In apps
                    If applicationName = app.Name.ToString Then
                        'GET Component Collection of Application and Populate
                        'FINDS ALL COMS in INTEGRATION OBJECTS
                        Dim Comps As COMAdmin.COMAdminCatalogCollection = CType _
                        (apps.GetCollection("Components", app.Key),  _
                            COMAdmin.COMAdminCatalogCollection)
                        Comps.Populate()

                        'Transaction Option Enum Setting
                        Dim TransactionOption As COMAdminTransactionOptions = _
                                                 COMAdminTransactionOptions.COMAdminTransactionNone

                        Dim iCounter As Integer
                        'looks through the components to find component
                        For iCounter = Comps.Count - 1 To 0 Step -1
                            Dim str As String = Comps.Item(iCounter).Name
                            Console.WriteLine(str)
                            Console.WriteLine(componentName)
                            Console.WriteLine("---------------------")
                            'If Comps.RemoveEnabled Then
                            If Comps.Item(iCounter).Name = componentName Then
                                Dim Comp As COMAdmin.COMAdminCatalogObject
                                Comp = Comps.Item(iCounter)
                                'Comp.Value("Transaction") = CType(TransactionOption, Object)
                                'Comp.Value("Authentication") = CType(COMAdminAuthenticationLevelOptions.COMAdminAuthenticationConnect, Object)
                                Comp.Value("Identity") = CType(frmLogin.strUser.ToString, Object)
                                Comp.Value("Password") = CType(frmLogin.strpassword.ToString, Object)

                                Comps.SaveChanges()
                            End If
                            'End If
                        Next iCounter
                        Exit For
                    End If
                Next 'appOnj In apps
            Catch COMEx As Exception
                Debug.Print("Cannot Install COM+ DLL to Server")
                MessageBox.Show("Cannot Install COM+ DLL to Server" + vbNewLine + COMEx.ToString)
                Return False
            End Try

                Return True
        End Function

Solution

  • Just for reference if anyone has the same issue.

    I had been looking at it wrong. Basically when the component was deployed it deployed it with the windows explorer path "\machinename\c$...." (it should just be "C:\filepath.....)This meant that if the local machine did not have access to "remote access" itself then it could not access the component.

    I am able to access the property that contains the componenets "DLL" path. But since its readonly it cant be changed.

    Still trying different things to see if I can deploy it with the machines local path but just thought i'd post an update for anyone else with this issue.