【问题标题】:Manage remote service using alternate credentials使用备用凭据管理远程服务
【发布时间】:2010-07-19 16:25:14
【问题描述】:

--原帖--

我正在尝试使用 alternate 凭据管理(启动/停止)远程计算机上的 Windows 服务。我知道我可以使用 ServiceController 类来使用我当前的凭据管理服务:

Dim sc As New ServiceController(ServiceName, ComputerName)

但我想使用不同的凭据。我正在使用的其他类(DirectoryEntry 和 System.Management)都支持使用备用凭据...我们将不胜感激。

--工作代码(基于已接受的答案构建)--

我不得不承认我怀疑它会起作用......但下面是代码。我不得不对你建议的代码做一个小的改动。每当我尝试 IPC$ 时,它都会返回一个 53 结果代码,即使我确定共享存在。所以在另一个网站的建议下,我删除了共享,只删除了计算机名,这很有效。

Imports System.Runtime.InteropServices
Imports System.Net
Imports System.IO
Imports System.ServiceProcess

Module Module1

    Sub Main()
        Dim Computername As String = "SomeComputer"
        'Create connection to remote computer'
        Using nc As New NetworkConnection("\\" + Computername, New NetworkCredential("Domain\User", "Password"))
            Dim sc As New ServiceController("Windows Firewall/Internet Connection Sharing (ICS)", Computername)
            'now we can start/stop/whatever we want here'
        End Using
        Console.ReadLine()
    End Sub

    Public Class NetworkConnection
        Implements IDisposable


        Private _networkName As String

        Public Sub New(ByVal networkName As String, ByVal credentials As NetworkCredential)
            _networkName = networkName

            Dim netResource = New NetResource() With { _
             .Scope = ResourceScope.GlobalNetwork, _
             .ResourceType = ResourceType.Disk, _
             .DisplayType = ResourceDisplaytype.Share, _
             .RemoteName = networkName _
            }

            Dim result = WNetAddConnection2(netResource, credentials.Password, credentials.UserName, 0)

            If result <> 0 Then
                Throw New IOException("Error connecting to remote share", result)
            End If
        End Sub

        Protected Overrides Sub Finalize()
            Try
                Dispose(False)
            Finally
                MyBase.Finalize()
            End Try
        End Sub

        Public Sub Dispose() Implements System.IDisposable.Dispose
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub

        Protected Sub Dispose(ByVal disposing As Boolean)
            WNetCancelConnection2(_networkName, 0, True)
        End Sub

        <DllImport("mpr.dll")> _
        Private Shared Function WNetAddConnection2(ByVal netResource As NetResource, ByVal password As String, ByVal username As String, ByVal flags As Integer) As Integer
        End Function

        <DllImport("mpr.dll")> _
        Private Shared Function WNetCancelConnection2(ByVal name As String, ByVal flags As Integer, ByVal force As Boolean) As Integer
        End Function
    End Class

    <StructLayout(LayoutKind.Sequential)> _
    Public Class NetResource
        Public Scope As ResourceScope
        Public ResourceType As ResourceType
        Public DisplayType As ResourceDisplaytype
        Public Usage As Integer
        Public LocalName As String
        Public RemoteName As String
        Public Comment As String
        Public Provider As String
    End Class

    Public Enum ResourceScope As Integer
        Connected = 1
        GlobalNetwork
        Remembered
        Recent
        Context
    End Enum

    Public Enum ResourceType As Integer
        Any = 0
        Disk = 1
        Print = 2
        Reserved = 8
    End Enum

    Public Enum ResourceDisplaytype As Integer
        Generic = &H0
        Domain = &H1
        Server = &H2
        Share = &H3
        File = &H4
        Group = &H5
        Network = &H6
        Root = &H7
        Shareadmin = &H8
        Directory = &H9
        Tree = &HA
        Ndscontainer = &HB
    End Enum
End Module

【问题讨论】:

    标签: vb.net windows-services credentials


    【解决方案1】:

    要进行远程登录,您应该使用WNetAddConnection2(请参阅http://msdn.microsoft.com/en-us/library/aa385413.aspx)或NetUseAdd(请参阅http://msdn.microsoft.com/en-us/library/aa370645.aspx)API。您可以使用\\RemoteComputer\IPC$ 作为目标资源。

    更新基于评论中的问题:关于 IPC$ 会话的解释可能很长。只是主要信息。

    如果您想在远程计算机上做某事,首先要做的就是与远程计算机建立经过身份验证的“连接”。远程计算机上的网络登录远程登录)将完成,这与本地登录完全不同。网络登录会话保持保持状态,如果您连接到例如\\RemoteComputer\share1 和您计算机上的另一个程序尝试访问例如\\RemoteComputer\share2,将使用相同的会话。

    您可以使用net.exe 模拟这种情况。只需启动 cmd.exe 并输入

    net use \\RemoteComputer\IPC$ /u:Domain\User password
    

    net use \\RemoteComputer\IPC$ /u:RemoteComputer\LocalRemoteUser password
    

    然后您将连接到目标计算机。然后您可以在资源管理器中输入\\RemoteComputer\AnyShare 并访问用户的Domain\UserRemoteComputer\LocalRemoteUser 凭据下的文件系统。断开使用

    net use \\RemoteComputer\IPC /d
    

    如果您尝试在远程计算机上启动/停止服务,将尝试建立相同的 IPC 会话。如果您已经与用户的凭据之一进行了此类会话,则将使用该会话。函数WNetAddConnection2NetUseAdd 可用作“网络使用”的替代。如果您永久想要使用其他用户的凭据访问远程计算机,您可以使用CredWriteCredWriteDomainCredentialsCredUIPromptForCredentials / CredUIPromptForWindowsCredentials。 Cred 函数似乎不是你的情况的最佳方法。

    【讨论】:

    • 你能提供一个更好的例子/更多信息吗?比如:我将如何使用其中一个 API 来停止然后在名为“xyz”的远程计算机上启动服务?
    • 感谢您的帮助。我已经在我的问题帖子中发布了我的代码,因为您的代码没有包含任何代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多