代码之家  ›  专栏  ›  技术社区  ›  Tom Kidd

在.NET1.1中,如何将用户凭据从一个进程传递到另一个进程以进行模拟?

  •  0
  • Tom Kidd  · 技术社区  · 14 年前

    我有一个运行在特定用户帐户下的Windows服务(用.NET1.1编写)和运行在多个服务器上的服务实例。

    我想从WinForms应用程序向服务传递用户凭据(用户名、密码、域),并让服务在服务器的本地文件系统中模拟传入的凭据读/写文件。

    作为容器对象,System.Net.NetworkCredential未标记为可序列化,因此传递三个单独的参数似乎是合乎逻辑的。我基本上是在使用 KB306158 .

    3 回复  |  直到 14 年前
        1
  •  4
  •   Chris Dickson    14 年前

    简单的回答是:根本不要通过证书。这种做法是不安全的。

    如果您能够将服务升级到使用.NET3.5,则可以使用WCF来执行IPC,并且经过适当配置,它将负责SSPI握手的细节,并直接启用模拟。

    如果您仍然坚持使用.NET1.1,那么请查看提供的文章和示例代码 here here ,它显示了如何从托管代码调用SSPI并使用它来保护.NET远程处理通道。

        2
  •  1
  •   FlyingStreudel    14 年前

    我不知道这与您的需求有多直接的关系,但这是我在一个应用程序中使用的模拟代码片段,该应用程序在给定有效凭据的情况下访问远程计算机的注册表和文件系统。LogonUser方法将username、password和servername作为参数,您可以通过winform应用程序传递这些参数。

    您必须在winform应用程序和在不同计算机上运行的服务之间设置一种进程间通信形式。很抱歉,我认为这是一个关于如何模仿的问题,而不是如何向您的流程发送信息的问题。至于IPC的方法,有很多选择。看一看 this site ,它将提供比我所能提供的更多的信息。最好的办法是使用命名管道。

    [DllImport("advapi32.dll",EntryPoint = "LogonUser", SetLastError = true)]
        public static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword,
        int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
    
    IntPtr admin_token = IntPtr.Zero;
    WindowsIdentity wid = WindowsIdentity.GetCurrent();
    WindowsIdentity wid_admin;  
    WindowsImpersonationContext wic;
    
    if (LogonUser(user, servername, pass, 9, 0, ref admin_token))
    {
        wid_admin = new WindowsIdentity(admin_token);
        wic = wid_admin.Impersonate();
        //do stuff with new creds here
    }
    
        3
  •  1
  •   CodingGorilla    14 年前

    如果可能的话,我会采用您提到的方法,将登录凭据(user/pass)传递给服务,并让它使用这些凭据进行模拟。

    推荐文章