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

C# 在.NET 1.1中,如何将用户凭据从一个进程传递到另一个进程以进行模拟?,c#,.net,windows-services,impersonation,.net-1.1,C#,.net,Windows Services,Impersonation,.net 1.1,我有一个在特定用户帐户下运行的Windows服务(用.NET 1.1编写),该服务的实例在多台服务器上运行 我想从WinForms应用程序向服务传递用户凭据(用户名、密码、域),并让服务在服务器本地文件系统中读取/写入文件,模拟传入的凭据 传递用户名、域和密码并让Windows服务执行模拟是否更好?我不知道如何序列化WindowsIdentity并将其作为参数传递给服务,然后围绕I/O执行模拟()和撤消() 作为容器对象,System.Net.NetworkCredential未标记为可序列化,

我有一个在特定用户帐户下运行的Windows服务(用.NET 1.1编写),该服务的实例在多台服务器上运行

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

传递用户名、域和密码并让Windows服务执行模拟是否更好?我不知道如何序列化WindowsIdentity并将其作为参数传递给服务,然后围绕I/O执行模拟()和撤消()


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

我不知道这与您的需求有多直接关联,但这是我在一个应用程序中使用的模拟代码片段,该应用程序访问远程计算机的注册表和文件系统,并提供有效凭据。LogonUser方法将用户名、密码和服务器名作为参数,您可以通过winform应用程序传递这些参数

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

[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
}

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

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

[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
}

我不认为可以将网络凭证对象直接传递给另一个进程,它基于一个底层的windows api,我猜在让进程传递其身份验证令牌时会涉及各种各样的错误juju


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

我认为您不能将网络凭据对象直接传递给另一个进程,它基于一个底层的windows api,我猜在让进程传递其身份验证令牌时会涉及到各种各样的糟糕的juju


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

简单的回答是:根本不传递凭据。这种做法是不安全的

相反,您应该考虑利用操作系统提供的安全机制来实现您想要做的事情。它被称为SSPI(安全支持提供者接口)。使用此方法,进程交换操作系统级安全提供程序生成的一系列令牌,以设置安全上下文,而无需在用户模式代码中传递凭据

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


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

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

相反,您应该考虑利用操作系统提供的安全机制来实现您想要做的事情。它被称为SSPI(安全支持提供者接口)。使用此方法,进程交换操作系统级安全提供程序生成的一系列令牌,以设置安全上下文,而无需在用户模式代码中传递凭据

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


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

这不回答问题,代码基本上来自我提供的链接。这不回答问题,代码基本上来自我提供的链接。