32

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

如果我写以下...

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

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

我已经尝试了以下两种方法,但似乎都不起作用(或返回任何东西)

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

任何人都可以建议如何获取一个适当的对象,该对象代表服务正在运行的用户名的凭据?

谢谢

4

6 回答 6

2

你试过 WindowsIdentity.GetCurrent() 吗?

你也可以看看这个例子...... http://www.codeproject.com/KB/vb/Windows_Service.aspx

于 2010-04-10T00:49:58.783 回答
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" />
于 2010-03-12T00:36:41.873 回答
0

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

考虑到这个原则,操作系统中没有任何部分甚至有你的用户密码是明文的,更不用说愿意把它给你了。

于 2012-04-03T03:31:13.993 回答
0

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

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

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

于 2012-06-08T22:15:05.847 回答
0

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

AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);

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

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

于 2012-06-22T07:38:04.693 回答
-2

如果您只想在当前用户添加动词时运行进程: "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

于 2012-04-21T20:15:21.253 回答