Иконка из DirectoryEntry по типу объекта

247
08 июля 2017, 07:16

Реально ли получить иконку из ресурсов Windows по типу объекта из DirectoryEntry?

Answer 1

В dsuiext.dll есть функция DsGetIcon, которая по имени класса объекта LDAP вернет иконку для него. Для DirectoryEntry класс объекта находится в свойстве objectclass:

[Flags]
enum IconType : uint
{
    DSGIF_ISNORMAL = 0x0000000,
    DSGIF_ISOPEN = 0x0000001,
    DSGIF_ISDISABLED = 0x0000002,
    DSGIF_ISMASK = 0x000000f,
    DSGIF_GETDEFAULTICON = 0x0000010,
    DSGIF_DEFAULTISCONTAINER = 0x0000020 
}
[DllImport("dsuiext.dll", CharSet = CharSet.Unicode)]
static extern IntPtr DsGetIcon(IconType dwFlags, string pszObjectClass, int cxImage, int cyImage);
[DllImport("user32.dll")]
static extern bool DestroyIcon(IntPtr hIcon);
private void Form1_Load(object sender, EventArgs e)
{
    var entry = new DirectoryEntry("LDAP://DC=mydomain,DC=local");
    var searcher = new DirectorySearcher(entry)
    {
        PageSize = int.MaxValue,
        Filter = "<какой-то фильтр>"
    };
    var result = searcher.FindOne();
    var objectClass = result.Properties["objectclass"][0].ToString();
    var icon = DsGetIcon(IconType.DSGIF_ISNORMAL, objectClass, 32, 32);
    if (icon != IntPtr.Zero) {
        using (var img = Icon.FromHandle(icon)) {
            pictureBox1.Image = img.ToBitmap();
        }
        DestroyIcon(icon);
    }
}

Не для всех значений свойства objectclass функция что-то возвращает. Однако, в dsuiext.dll можно найти строки, которые работают (без учета регистра):

builtInDomain
computer
configuration
rpcContainer
contact
container
domainDNS
domainPolicy
group
localGroup
localPolicy
nTDSConnection
nTDSDSA
nTDSSettings
organizationalPerson
organizationalUnit
person
printQueue
remoteMailRecipient
server
serverConnection
site
sitesContainer
storage
subnet
subnetContainer
user
volume
workStationAccount
licensingSiteSettings
nTDSSiteSettings
siteLink
siteLinkBridge
nTFRSSettings
nTFRSReplicaSet
nTFRSSubscriptions
nTFRSSubscriber
nTFRSMember
foreignSecurityPrincipal
interSiteTransport
interSiteTransportContainer
serversContainer
inetOrgPerson
msDS-ManagedServiceAccount
msDS-GroupManagedServiceAccount
READ ALSO
Как в Unity3d использовать возможности C# 5/6/7?

Как в Unity3d использовать возможности C# 5/6/7?

Захотел я идти в ногу со временем, посмотрел новые фишки и плюшки C#6/7, воодушевилсяТам так всё вкусно и круто, что грех не пользоваться

403
Обработка исключения Format Exception

Обработка исключения Format Exception

Как корректно обработать исключение Format Exception на проверку введенных значений в TextBox?

233
Json запрос с массивом

Json запрос с массивом

Здравствуйте!

331