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