Как получить учетные данные (NetworkCredential) зарегистрированного пользователя? - PullRequest
31 голосов
/ 23 февраля 2010

Я пишу некоторый код для использования стороннего компонента, и мне нужно предоставить объект, который реализует ICredentials, когда я начинаю его использовать.

Если я напишу следующее ...

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

... и передать "учетные данные", все в порядке. Но я хотел бы передать учетные данные текущего пользователя (это служба Windows, поэтому он работает как указанный пользователь) .

Я пробовал оба следующих варианта, но ни один из них не работает (или ничего не возвращает) :

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

Кто-нибудь может подсказать, как получить объект approriate, который представляет учетные данные имени пользователя, под которым работает служба?

Спасибо, Росс

Ответы [ 6 ]

2 голосов
/ 10 апреля 2010

вы пробовали WindowsIdentity.GetCurrent ()?

, вы также можете посмотреть этот пример ... http://www.codeproject.com/KB/vb/Windows_Service.aspx

0 голосов
/ 22 июня 2012

Вы пытались установить главную политику для домена приложения в начале приложения?

AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);

Установка этого значения перед обращением к текущему основному объекту через поток гарантирует, что идентификатор Windows используется в этом объекте.

edit - я почти уверен, что это работает для DefaultNetworkCredentials. Я использовал его для доступа к веб-сервису с аутентификацией Windows из приложения Windows Forms.

0 голосов
/ 09 июня 2012

К сожалению, вам нужно взаимодействовать с WMI следующим образом:

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

Значение, которое вы хотите запросить, - это StartName, которое оценивается как что-то вроде "NT Authority \ NetworkService" (или что бы вы ни использовали) Если вы разбираете вторую часть этой статьи с первой частью, получится довольно просто.

0 голосов
/ 22 апреля 2012

, если вы просто хотите запустить процесс, поскольку текущий пользователь добавляет глагол: "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

0 голосов
/ 03 апреля 2012

Идеальная ситуация безопасности заключается в том, что пароль вошедшего в систему пользователя не сохраняется нигде в памяти. Он также нигде не хранится на диске. Он существует только как хеш-значение для сравнения со строкой, введенной человеком. Хранение пароля в открытом виде по своей сути является угрозой безопасности, и его следует по возможности избегать.

Принимая во внимание этот принцип, НЕТ части операционной системы, в которой даже есть пароль вашего пользователя в открытом виде, и тем более вы не готовы дать его вам.

0 голосов
/ 12 марта 2010

Вам необходимо выполнить олицетворение, например:

    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" />
...