您如何获得当前登录用户的凭据(NetworkCredential)?

时间:2010-02-23 16:08:52

标签: .net defaultnetworkcredentials

我正在编写一些代码来使用第三方组件,当我开始使用它时,我需要提供一个实现ICredentials的对象。

如果我写下以下内容......

var credential = new NetworkCredential("MyUsername", "MyPassword");

...并通过“凭证”,没关系。但我想传递当前用户的凭据(它是Windows服务,因此以指定用户身份运行)

我尝试了以下两种方法,但似乎都没有(或返回任何内容)

NetworkCredential credential = System.Net.CredentialCache.DefaultCredentials;
NetworkCredential credential = CredentialCache.DefaultNetworkCredentials;

有人可以建议如何获取approriate对象,该对象代表运行该服务的用户名的凭据吗?

谢谢, 罗斯

6 个答案:

答案 0 :(得分:2)

你试过WindowsIdentity.GetCurrent()吗?

您还可以查看此示例... http://www.codeproject.com/KB/vb/Windows_Service.aspx

答案 1 :(得分:0)

您需要进行模拟,例如:

    System.Security.Principal.WindowsImpersonationContext impersonationContext;
impersonationContext = 
    ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();

//Insert your code that runs under the security context of the authenticating user here.

impersonationContext.Undo();

http://support.microsoft.com/kb/306158

或者您可以使用web.config:

<identity impersonate="true" />

答案 2 :(得分:0)

理想的安全状况是登录用户的密码不会存储在内存中的任何位置。它也不存储在磁盘上的任何位置。它仅作为哈希值存在,以与人类输入的字符串进行比较。明确存储密码本身就存在安全风险,应尽可能避免使用。

鉴于这一原则,操作系统中没有任何部分可以清楚地显示您的用户密码,更不愿意将其提供给您。

答案 3 :(得分:0)

不幸的是,你必须像这样与WMI互操作:

http://www.codeproject.com/Articles/28161/Using-WMI-to-manipulate-services-Install-Uninstall

您要查询的值是StartName,它将评估为“NT Authority \ NetworkService”(或您正在使用的任何内容)。如果你将本文的第二部分与第一部分进行混搭,那么它应该非常简单。

答案 4 :(得分:0)

您是否尝试过在应用程序启动时为appdomain设置principalpolicy?

AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);

在通过线程访问当前主体对象之前设置此值可确保在此对象中使用Windows标识。

编辑 - 我很确定这适用于DefaultNetworkCredentials。我使用它从Windows窗体应用程序访问带有Windows身份验证的Web服务。

答案 5 :(得分:-1)

如果您只想在当前用户添加动词时运行进程:  "runas " & Environment.UserName

如果您想以管理员刚编写"runas"

的方式运行该流程

在vb.net中

Dim ps As New System.Diagnostics.ProcessStartInfo("filepath", "arguments")

ps.Verb = "runas" 'run as admin

'ps.Verb = "runas " & Environment.UserName'run as current user, by default

Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(ps)

如果你想获得当前的用户密码,你不能,实际上这是一种不安全的做法。 您的服务需要什么权利和目的才能使我的Windows密码保密? 例如,就像把手机的密码给whatsapp