我正在编写一些代码来使用第三方组件,当我开始使用它时,我需要提供一个实现ICredentials的对象。
如果我写下以下内容......
var credential = new NetworkCredential("MyUsername", "MyPassword");
...并通过“凭证”,没关系。但我想传递当前用户的凭据(它是Windows服务,因此以指定用户身份运行)。
我尝试了以下两种方法,但似乎都没有(或返回任何内容):
NetworkCredential credential = System.Net.CredentialCache.DefaultCredentials;
NetworkCredential credential = CredentialCache.DefaultNetworkCredentials;
有人可以建议如何获取approriate对象,该对象代表运行该服务的用户名的凭据吗?
谢谢, 罗斯
答案 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