管理远程服务

问题描述:

- 原贴 -管理远程服务

我想管理(启动/停止),一个窗口服务使用备用凭据的远程机器上。我知道我可以使用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 

进行远程登录,你应该使用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会话。如果您已经与用户的凭证之一进行了这样的会话,它将被使用。功能WNetAddConnection2,NetUseAdd可以用作“净使用”的替换。如果您永久想要使用其他用户的凭据访问远程计算机,则可以使用CredWrite,CredWriteDomainCredentialsCredUIPromptForCredentials/CredUIPromptForWindowsCredentials。 Cred函数对我来说似乎不是最好的办法。

+0

您能否提供更好的示例/更多信息?像:我将如何使用这些API之一来停止并在名为“xyz”的远程计算机上启动服务? – Peter 2010-07-28 17:10:36

+0

感谢您的帮助。我已经将我的代码发布在我的问题帖子中,因为您的代码没有包含任何代码。 – Peter 2010-07-29 14:17:22