неопределенная ссылка на WinMain@16
или аналогичную «необычную» main()
ссылку на точку входа (особенно для visual-studio ).
Вы возможно, пропустили, чтобы выбрать правильный тип проекта с вашей реальной IDE. IDE может захотеть связать, например. Проекты приложений Windows для такой функции точки входа (как указано в недостающей ссылке выше) вместо обычной int main(int argc, char** argv);
.
Если ваша среда IDE поддерживает Plain Console Projects , вы может захотеть выбрать этот тип проекта вместо проекта приложения Windows.
Здесь case1 и case2 обрабатываются более подробно из реальный мир проблема.
Я как раз собирался добавить свой собственный вопрос в StackOverflow с моим решением, чтобы помочь другим с этой проблемой, когда я увидел ваш существующий вопрос. Похоже, это будет очень распространено, но информация о том, как это сделать, распространяется только между несколькими источниками и трудно отслеживать. Существует не только один полный ресурс, поэтому, надеюсь, это поможет вам и другим.
Лучший способ сделать это - использовать расширение UserPrincipal. В принципе, вы подклассифицируете UserPrincipal
из System.DirectoryServices.AccountManagement
и добавляете свои собственные дополнительные свойства. Это активируется с помощью методов ExtensionGet
и ExtensionSet
(несколько магических).
[DirectoryRdnPrefix("CN")]
[DirectoryObjectClass("user")]
public class UserPrincipalExtended : UserPrincipal
{
public UserPrincipalExtended(PrincipalContext context) : base(context)
{
}
public UserPrincipalExtended(PrincipalContext context, string samAccountName, string password, bool enabled)
: base(context, samAccountName, password, enabled)
{
}
[DirectoryProperty("title")]
public string Title
{
get
{
if (ExtensionGet("title").Length != 1)
return null;
return (string)ExtensionGet("title")[0];
}
set
{
ExtensionSet( "title", value );
}
}
[DirectoryProperty("department")]
public string Department
{
get
{
if (ExtensionGet("department").Length != 1)
return null;
return (string)ExtensionGet("department")[0];
}
set
{
ExtensionSet("department", value);
}
}
public static new UserPrincipalExtended FindByIdentity(PrincipalContext context, string identityValue)
{
return (UserPrincipalExtended)FindByIdentityWithType(context, typeof(UserPrincipalExtended), identityValue);
}
public static new UserPrincipalExtended FindByIdentity(PrincipalContext context, IdentityType identityType, string identityValue)
{
return (UserPrincipalExtended)FindByIdentityWithType(context, typeof(UserPrincipalExtended), identityType, identityValue);
}
}
Два атрибута класса должны быть настроены для вашего экземпляра AD. Значение для DirectoryRdnPrefix
должно быть RDN (относительное различающееся имя) в AD, а значение для DirectoryObjectClass
должно быть именем типа объекта каталога в AD для класса userObject. Для типичной настройки доменных служб AD оба они должны использоваться в коде, представленном выше, но для настройки LDS они могут отличаться . Я добавил два новых свойства, которые использует моя организация: «title» и «department». Из этого вы можете получить представление о том, как добавить любое другое свойство, которое вам нравится: в основном вы просто создаете свойство, используя шаблон, который я здесь предоставил. Свойству можно назвать все, что вам нравится, но строковое значение, переданное в DirectoryProperty
и внутри блока кода, должно совпадать с именем свойства из AD. Используя это, вы можете использовать PrincipalContext
с вашим подклассом вместо UserPrincipal
, чтобы вернуть пользовательский объект со свойствами, которые вам нужно добавить.
UserPrincipalExtended user = UserPrincipalExtended.FindByIdentity(
new PrincipalContext(ContextType.Domain), User.Identity.Name);
И получить доступ к своей собственности, как и любой другой экземпляр UserPrincipal
:
// User's title
user.Title
Если вы не знакомы с System.DirectoryServices.AccountManagement.UserPrincipal
, есть несколько свойств пользователя, испеченных в: GivenName
, Surname
, DisplayName
и т. д. В частности к вашим обстоятельствам, поскольку вы специально указали телефон и электронную почту, есть VoiceTelephoneNumber
и EmailAddress
. Полный список можно просмотреть в документах MSDN . Если вам нужна только встроенная информация, вам не нужно расширять UserPrincipal
, как я показал выше. Вы просто сделали бы:
UserPrincipal user = UserPrincipal.FindByIdentity(
new PrincipalContext(ContextType.Domain), User.Identity.Name);
Но, в 9 раз из 10, встроенных модулей будет недостаточно, так что хорошо знать, как легко добраться.
Наконец, я не хотел добавлять строки @using
в любое представление, которое использует это, поэтому я пошел дальше и добавил пространства имен в web.config папки Views
. Эта часть важна, ее необходимо добавить в папку web.config папки Views
, а не в папку проекта (и отдельную папку Views
для каждого региона, если вы используете области).
<system.web.webPages.razor>
...
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
...
<add namespace="System.DirectoryServices.AccountManagement" />
<add namespace="Namespace.For.Your.Extension" />
</namespaces>
</pages>
</system.web.webPages.razor>