C#: Попросите у Пользователя Пароля, который тогда хранится в SecureString

Вы можете использовать этот контейнер ScalarCollection, который ограничивает массив и предоставляет некоторые параметры манипуляции ( Gist ):

Использование:

public class Person
{
    public int Id { get; set; }
    //will be stored in database as single string.
    public SaclarStringCollection Phones { get; set; } = new ScalarStringCollection();
}

Код:

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;

namespace System.Collections.Specialized
{
#if NET462
  [ComplexType]
#endif
  public abstract class ScalarCollectionBase :
#if NET462
    Collection,
#else
    ObservableCollection
#endif
  {
    public virtual string Separator { get; } = "\n";
    public virtual string ReplacementChar { get; } = " ";
    public ScalarCollectionBase(params T[] values)
    {
      if (values != null)
        foreach (var item in Items)
          Items.Add(item);
    }

#if NET462
    [Browsable(false)]
#endif
    [EditorBrowsable(EditorBrowsableState.Never)]
    [Obsolete("Not to be used directly by user, use Items property instead.")]
    public string Data
    {
      get
      {
        var data = Items.Select(item => Serialize(item)
          .Replace(Separator, ReplacementChar.ToString()));
        return string.Join(Separator, data.Where(s => s?.Length > 0));
      }
      set
      {
        Items.Clear();
        if (string.IsNullOrWhiteSpace(value))
          return;

        foreach (var item in value
            .Split(new[] { Separator }, 
              StringSplitOptions.RemoveEmptyEntries).Select(item => Deserialize(item)))
          Items.Add(item);
      }
    }

    public void AddRange(params T[] items)
    {
      if (items != null)
        foreach (var item in items)
          Add(item);
    }

    protected abstract string Serialize(T item);
    protected abstract T Deserialize(string item);
  }

  public class ScalarStringCollection : ScalarCollectionBase
  {
    protected override string Deserialize(string item) => item;
    protected override string Serialize(string item) => item;
  }

  public class ScalarCollection : ScalarCollectionBase
    where T : IConvertible
  {
    protected override T Deserialize(string item) =>
      (T)Convert.ChangeType(item, typeof(T));
    protected override string Serialize(T item) => Convert.ToString(item);
  }
}

7
задан BlaM 26 November 2008 в 01:10
поделиться

2 ответа

Попытайтесь смотреть пользовательский элемент управления SecurePasswordTextBox . Вы пытаетесь сделать что-то подобное "Выполненный Как" команда типа, где Вы пытаетесь выполнить процесс как различный пользователь, чем тот в настоящее время входил в систему? В противном случае необходимо быть в состоянии только к обработке вызовов. Запустите и позвольте ему взять текущие пользовательские учетные данные.

кроме того, смотрите на следующие ресурсы также:

наилучший вариант состоял бы в том, чтобы, вероятно, использовать некоторый interop p/inovke код для вызова CredUIPromptForCredentials, чтобы отобразить стандартное диалоговое окно Windows и затем использовать ту информацию для любой обработки вызовов. Запустите, или, более вероятно, вызовите функцию CreateProcessAsUser.

7
ответ дан 7 December 2019 в 01:28
поделиться

Причина SecureString хочет принять один символ за один раз, состоит в том, что иначе Вы имели бы всю строку перед этим и заставили бы строку быть в памяти. Таким образом, с помощью SecureString в этом виде сценария поражений цель.

3
ответ дан 7 December 2019 в 01:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: