Как вы получаете учетные данные (NetworkCredential) в настоящее время вошли в систему пользователя?
Я пишу некоторый код для использования стороннего компонента, и мне нужно предоставить объект, который реализует ICredentials, когда я начинаю его использовать.
Если я напишу следующее...
var credential = new NetworkCredential("MyUsername", "MyPassword");
... и передать "учетные данные", это нормально. Но я хотел бы передать учетные данные текущего пользователя (это служба Windows, поэтому запускается как указанный пользователь).
Я пробовал оба следующих варианта, но ни один из них не работает (или ничего не возвращает):
NetworkCredential credential = System.Net.CredentialCache.DefaultCredentials;
NetworkCredential credential = CredentialCache.DefaultNetworkCredentials;
Может кто-нибудь предложить, как получить объект approriate, который представляет учетные данные имени пользователя, под которым работает служба?
Спасибо росс
6 ответов
Вы пробовали WindowsIdentity.GetCurrent()?
Вы также можете посмотреть на этот пример... http://www.codeproject.com/KB/vb/Windows_Service.aspx
К сожалению, вы должны взаимодействовать с WMI следующим образом:
http://www.codeproject.com/Articles/28161/Using-WMI-to-manipulate-services-Install-Uninstall
Значение, которое вы ищете для запроса, - StartName, которое оценивается как что-то вроде "NT Authority\NetworkService" (или что вы используете). Если вы разбираете вторую часть этой статьи с первой частью, это будет довольно просто.
Вы пытались установить принципальную политику для домена приложения в начале приложения?
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
Установка этого значения перед доступом к текущему основному объекту через поток гарантирует, что идентификатор Windows используется в этом объекте.
редактировать - я уверен, что это работает для DefaultNetworkCredentials. Я использовал его для доступа к веб-сервису с аутентификацией Windows из приложения форм Windows.
Идеальная ситуация с безопасностью заключается в том, что пароль вошедшего в систему пользователя нигде не сохраняется в памяти. Он также нигде не хранится на диске. Он существует только как хеш-значение для сравнения со строкой, введенной человеком. Хранение пароля в открытом виде по своей сути является угрозой безопасности, и его следует по возможности избегать.
Принимая во внимание этот принцип, НЕТ части операционной системы, в которой даже есть пароль вашего пользователя в открытом виде, и тем более вы не захотите дать его вам.
Вы должны сделать олицетворение, например:
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" />
Если вы просто хотите запустить процесс, поскольку текущий пользователь добавляет глагол: "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