ADSI
От: moon  
Дата: 24.03.05 13:54
Оценка:
Нужно написать программное управление(создание сайтов, виртуальных директорий) IIS. Как я понял это можно сделать с помощью ADSI. Только вот все примеры, которые я нашел написаны на скриптах(VBScript, JScript). Каким образом можно переделать эти скрипты в сишный код или просто писать на С, используя ADSI?
Помогите, очень нужно!
Re: ADSI
От: LioLick  
Дата: 24.03.05 13:57
Оценка:
Здравствуйте, moon, Вы писали:

M>Нужно написать программное управление(создание сайтов, виртуальных директорий) IIS. Как я понял это можно сделать с помощью ADSI. Только вот все примеры, которые я нашел написаны на скриптах(VBScript, JScript). Каким образом можно переделать эти скрипты в сишный код или просто писать на С, используя ADSI?

M>Помогите, очень нужно!

http://www.rsdn.ru/Forum/Message.aspx?mid=1062083&only=1
Автор: LioLick
Дата: 09.03.05
GL!
Re[2]: ADSI
От: moon  
Дата: 24.03.05 14:08
Оценка:
Здравствуйте, LioLick, Вы писали:

LL>http://www.rsdn.ru/Forum/Message.aspx?mid=1062083&only=1
Автор: LioLick
Дата: 09.03.05


Да, я помню этот пример. Но он использует чисто COM, а мне нужно ADSI.
Re[3]: ADSI
От: LioLick  
Дата: 24.03.05 14:17
Оценка:
Здравствуйте, moon, Вы писали:

M>Да, я помню этот пример. Но он использует чисто COM, а мне нужно ADSI.

В InnoSetup еще есть.
Там скрипт а-ля Дельфи.
Там, по моему как раз ADSI используется
GL!
Re: ADSI
От: __zve Россия  
Дата: 24.03.05 14:56
Оценка:
Здравствуйте, moon, Вы писали:

M>Нужно написать программное управление(создание сайтов, виртуальных директорий) IIS. Как я понял это можно сделать с помощью ADSI. Только вот все примеры, которые я нашел написаны на скриптах(VBScript, JScript). Каким образом можно переделать эти скрипты в сишный код или просто писать на С, используя ADSI?

M>Помогите, очень нужно!

Вот небольшой пример (VC 7.1):

// ADSITest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <comdef.h>
#include <activeds.h>

_COM_SMARTPTR_TYPEDEF(IADs, IID_IADs);

int _tmain(int argc, _TCHAR* argv[])
{

CoInitialize(0);
try
{
_tprintf(_T("Updating default web site ...\n"));

IADsPtr pObj = NULL;
HRESULT hr = ADsOpenObject(L"IIS://localhost/W3SVC/1/ROOT",NULL,NULL,0,IID_IADs,(void**)&pObj);
if(FAILED(hr))
{
_tprintf(_T("Error: hr = 0x%x\n"),hr);
}

_tprintf(_T("Getting DefaultDoc ...\n"),hr);

_variant_t defDoc;
hr = pObj->Get(_bstr_t("DefaultDoc"), &defDoc);
if(FAILED(hr))
{
_tprintf(_T("Error: hr = 0x%x\n"),hr);
}

_bstr_t bsDefDoc = (_bstr_t)defDoc;
_tprintf(_T("DefaultDoc = %s\n"),(LPCTSTR)bsDefDoc);

_tprintf(_T("Adding document ...\n"));
bsDefDoc += L",MySuperDocument.htm";
hr = pObj->Put(_bstr_t("DefaultDoc"), _variant_t(bsDefDoc));
if(FAILED(hr))
{
_tprintf(_T("Error: hr = 0x%x\n"),hr);
}

_tprintf(_T("Finishing transaction ...\n"));
hr = pObj->SetInfo();
if(FAILED(hr))
{
_tprintf(_T("Error: hr = 0x%x\n"),hr);
}

}
catch(_com_error& e)
{
_tprintf(_T("Error: hr = 0x%x"),e.Error());
}
CoUninitialize();

return 0;
}
Re[2]: ADSI
От: moon  
Дата: 24.03.05 15:18
Оценка:
Здравствуйте, __zve, Вы писали:

___>Вот небольшой пример (VC 7.1):


Жаль, что не на VC 6.0, т.к. именно ее я использую. В VC 7 все по-другому((
Re[3]: ADSI
От: __zve Россия  
Дата: 24.03.05 15:31
Оценка:
Здравствуйте, moon, Вы писали:

M>Здравствуйте, __zve, Вы писали:


___>>Вот небольшой пример (VC 7.1):


M> Жаль, что не на VC 6.0, т.к. именно ее я использую. В VC 7 все по-другому((


// ADSITestVC6.cpp : Defines the entry point for the console application.
//


Вот это я скомпилировал и запустил на VC 6.0:
BTW: Чтобы собралось надо добавить в Project->Settings->Link->Object Library/Modules
дополнительно две либы: adsiid.lib activeds.lib

#include "stdafx.h"

#include <comdef.h>
#include <activeds.h>

#include <tchar.h>

_COM_SMARTPTR_TYPEDEF(IADs, IID_IADs);

int main(int argc, char* argv[])
{
CoInitialize(0);
try
{
_tprintf(_T("Updating default web site ...\n"));

IADsPtr pObj = NULL;
HRESULT hr = ADsOpenObject(L"IIS://localhost/W3SVC/1/ROOT",NULL,NULL,0,IID_IADs,(void**)&pObj);
if(FAILED(hr))
{
_tprintf(_T("Error: hr = 0x%x\n"),hr);
}

_tprintf(_T("Getting DefaultDoc ...\n"),hr);

_variant_t defDoc;
hr = pObj->Get(_bstr_t("DefaultDoc"), &defDoc);
if(FAILED(hr))
{
_tprintf(_T("Error: hr = 0x%x\n"),hr);
}

_bstr_t bsDefDoc = (_bstr_t)defDoc;
_tprintf(_T("DefaultDoc = %s\n"),(LPCTSTR)bsDefDoc);

_tprintf(_T("Adding document ...\n"));
bsDefDoc += L",MySuperDocument.htm";
hr = pObj->Put(_bstr_t("DefaultDoc"), _variant_t(bsDefDoc));
if(FAILED(hr))
{
_tprintf(_T("Error: hr = 0x%x\n"),hr);
}

_tprintf(_T("Finishing transaction ...\n"));
hr = pObj->SetInfo();
if(FAILED(hr))
{
_tprintf(_T("Error: hr = 0x%x\n"),hr);
}

}
catch(_com_error& e)
{
_tprintf(_T("Error: hr = 0x%x"),e.Error());
}
CoUninitialize();

return 0;
}
Re[4]: ADSI
От: moon  
Дата: 24.03.05 15:48
Оценка:
Здравствуйте, __zve, Вы писали:

__>Вот это я скомпилировал и запустил на VC 6.0:


Да, работает... а есть еще подобные примеры?
Re[5]: ADSI
От: __zve Россия  
Дата: 24.03.05 16:18
Оценка:
Здравствуйте, moon, Вы писали:

M>Здравствуйте, __zve, Вы писали:


__>>Вот это я скомпилировал и запустил на VC 6.0:


M>Да, работает... а есть еще подобные примеры?


А какие конкретно действия через ADSI Вас интересуют?
Дело в том что я написал этот пример не зная что Вы собственно собираетесь делать.

С ADSI для IIS — а все просто, В нем сайты и виртуальные директории лежат в виде дерева.
У каждого элемента дерева есть тип (objectClass) и набор аттрибутов.

Для доступа к элементу дерева служит интерфейс IADs
при помощи него можно менять значения аттрибутов.

Пример как это делать приведен в моей программе выше.

Для создания/удаления/перчисления дочерних элементов используется интерфейс IADsContainer
который можно получить у обьекта IADs через QueryInterface.

Описание элементов и их аттрибутов должно лежать в где-то в MSDN
в принципе Вы сами можете посмотреть на это дерево используюя программу ADsVw.exe. Она должна поставляться с Platform SDK.
Re[6]: ADSI
От: moon  
Дата: 24.03.05 16:48
Оценка:
Здравствуйте, __zve, Вы писали:

__>А какие конкретно действия через ADSI Вас интересуют?


Мне нужно создать FTP сайт и несколько виртуальных директорий в нем. Также, помимо IIS, хотелось бы создать парочку пользоваетлей и групп на серваке... что-то похожее я нашел в msdn, но дело в том, что там работа осуществляется с доменом, а мне нужна рабочая группа... Собственно, в этом состоит еще одна проблема: мне нужно определить, доменная структура или групповая и далее уже кодить соответственно. У Вас есть какие-то соображения на эту тему?
Re[7]: ADSI
От: __zve Россия  
Дата: 24.03.05 17:37
Оценка: 2 (1)
Здравствуйте, moon, Вы писали:

M>Здравствуйте, __zve, Вы писали:


__>>А какие конкретно действия через ADSI Вас интересуют?


M>Мне нужно создать FTP сайт и несколько виртуальных директорий в нем. Также, помимо IIS, хотелось бы создать парочку пользоваетлей и групп на серваке... что-то похожее я нашел в msdn, но дело в том, что там работа осуществляется с доменом, а мне нужна рабочая группа... Собственно, в этом состоит еще одна проблема: мне нужно определить, доменная структура или групповая и далее уже кодить соответственно. У Вас есть какие-то соображения на эту тему?




Создавать пользователей в рабочей группе тоже можно через ADSI.
Для этого используеся так называемый WinNT провайдер.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ad/ad/creating_users_on_member_servers_and_windows_2000_professional.asp

По поводу FTP

1. В цикле пытаетесь открыть через ADsOpenObject
IIS://localhost/MSFTPSVC/1
IIS://localhost/MSFTPSVC/2
IIS://localhost/MSFTPSVC/3
.....


Пока оно не выдаст ошибку
После этого открываете
IIS://localhost/MSFTPSVC

и создаете в нем обьект с именем с соответствующей цифрой
и типом IIsFtpServer

в нем создаете обьект с именем ROOT и типом IIsFtpVirtualDir
После этого у вас готов FTP сайт

далее создаете там обьекты типа IIsFtpVirtualDir
это и будут ваши виртуальные директории.
Re[8]: ADSI
От: moon  
Дата: 28.03.05 14:28
Оценка:
Здравствуйте, __zve, Вы писали:

__>Создавать пользователей в рабочей группе тоже можно через ADSI.

__>Для этого используеся так называемый WinNT провайдер.

Спасибо за помощь! Правда возникли еще некоторые проблемы... Теперь мне не удается поменять аттрибуты пользователя, которого я создаю, в рабочей группе.
Re[8]: ADSI
От: moon  
Дата: 28.03.05 14:33
Оценка:
Вопрос теперь в том, как мне править свойства пользователя. Есть подозрения, что этого не позволяет делать WinNT provider. У Вас есть какие-лиюо идеи?
Заранее благодарен!
Re[9]: ADSI
От: __zve Россия  
Дата: 28.03.05 17:10
Оценка:
Здравствуйте, moon, Вы писали:

M> Вопрос теперь в том, как мне править свойства пользователя. Есть подозрения, что этого не позволяет делать WinNT provider. У Вас есть какие-лиюо идеи?

M>Заранее благодарен!

Какие конкретно атрибуты вас интересуют?
Какую ошибку возвращает ADSI?
Re[10]: ADSI
От: moon  
Дата: 31.03.05 14:15
Оценка:
Здравствуйте, __zve, Вы писали:

__>Какие конкретно атрибуты вас интересуют?

__>Какую ошибку возвращает ADSI?

С той проблемой я кое-как разобрался... Теперь появилась другая: как определить доменная или групповая структура у локалки? В приниципе, можно просто прверять при доступе к объектам, вернул ли ошибку метод или нет... и далее использовать др. провайдер, но хотелось бы нормальное решение этой задачи.
Re[11]: ADSI
От: __zve Россия  
Дата: 01.04.05 09:29
Оценка: 3 (1)
Здравствуйте, moon, Вы писали:

M>Здравствуйте, __zve, Вы писали:


__>>Какие конкретно атрибуты вас интересуют?

__>>Какую ошибку возвращает ADSI?

M> С той проблемой я кое-как разобрался... Теперь появилась другая: как определить доменная или групповая структура у локалки? В приниципе, можно просто прверять при доступе к объектам, вернул ли ошибку метод или нет... и далее использовать др. провайдер, но хотелось бы нормальное решение этой задачи.



Вот, может помочь.
http://support.microsoft.com/default.aspx?scid=kb;en-us;179891
Re[12]: ADSI
От: moon  
Дата: 01.04.05 14:11
Оценка:
Здравствуйте, __zve, Вы писали:

__>Вот, может помочь.

__>http://support.microsoft.com/default.aspx?scid=kb;en-us;179891

Спасибо, разбираемся...
Еще тут возник вопросец
Нужно создать пользователя и группу на локальной машине с AD. Т.е проблема в том, что надо получить dn контейнера users(при этом до этого получив домен, имя компа и т.д. для adspath) и groups. Это я не знаю как сделать... ТОчнее знаю, но не уверен, что правильно(я делаю это через rootDSE, получая configurationNamingContext) Дальше возникаю проблемы: к какому контейнеру обращаться при создании групп и пользователей и где находятся польз "Адмнистратор" и его группа и т.д.
Заранеее спасибо!!!
Re[13]: ADSI
От: __zve Россия  
Дата: 01.04.05 18:09
Оценка: 3 (1)
Здравствуйте, moon, Вы писали:

M>Здравствуйте, __zve, Вы писали:


__>>Вот, может помочь.

__>>http://support.microsoft.com/default.aspx?scid=kb;en-us;179891

M>Спасибо, разбираемся...

M>Еще тут возник вопросец
M>Нужно создать пользователя и группу на локальной машине с AD. Т.е проблема в том, что надо получить dn контейнера users(при этом до этого получив домен, имя компа и т.д. для adspath) и groups. Это я не знаю как сделать... ТОчнее знаю, но не уверен, что правильно(я делаю это через rootDSE, получая configurationNamingContext) Дальше возникаю проблемы: к какому контейнеру обращаться при создании групп и пользователей и где находятся польз "Адмнистратор" и его группа и т.д.
M> Заранеее спасибо!!!

Правильный способ обращения к подобным контейнерам описа здесь:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ad/ad/binding_to_well-known_objects_using_wkguid.asp
В частности к контейнеру "Users"

Администратор обычно находится в контейнере Users группа "Administrators" в контейнете Builin
Domain Admins в "Users" Но суть в том что эти пользоваетли или группы могут быть легко перенесены администратором куда угодно.

Я думаю вам либо надо давать пользователям выбирать самим где создать Ваши обьекты при помощи функции DSBrowseForContainer или
всегда создавать в "Users"
Re[14]: ADSI
От: moon  
Дата: 04.04.05 11:24
Оценка:
Здравствуйте, __zve, Вы писали:

__>Администратор обычно находится в контейнере Users группа "Administrators" в контейнете Builin

__>Domain Admins в "Users" Но суть в том что эти пользоваетли или группы могут быть легко перенесены администратором куда угодно.

__>Я думаю вам либо надо давать пользователям выбирать самим где создать Ваши обьекты при помощи функции DSBrowseForContainer или

__>всегда создавать в "Users"

Да, своих пользователей и группы я буду создавать в заранее определенном контейнере(Users). Просто мне нужно также добавлять своего пользователя к группе "Administrators", а в свою группу вносить пользователя "Administrator". Т.к. они (обьекты) могут быть перемещены куда-угодно, то тогда должна быть какая-то функция или const, определяющая путь к ним(что-то типа wellknownobjects). Вы случайно ее не знаете?
Re[15]: ADSI
От: __zve Россия  
Дата: 04.04.05 12:40
Оценка:
Здравствуйте, moon, Вы писали:

M>Здравствуйте, __zve, Вы писали:


__>>Администратор обычно находится в контейнере Users группа "Administrators" в контейнете Builin

__>>Domain Admins в "Users" Но суть в том что эти пользоваетли или группы могут быть легко перенесены администратором куда угодно.

__>>Я думаю вам либо надо давать пользователям выбирать самим где создать Ваши обьекты при помощи функции DSBrowseForContainer или

__>>всегда создавать в "Users"

M> Да, своих пользователей и группы я буду создавать в заранее определенном контейнере(Users). Просто мне нужно также добавлять своего пользователя к группе "Administrators", а в свою группу вносить пользователя "Administrator". Т.к. они (обьекты) могут быть перемещены куда-угодно, то тогда должна быть какая-то функция или const, определяющая путь к ним(что-то типа wellknownobjects). Вы случайно ее не знаете?


Насколько я помню обьект Administrators имеет welll-known SID не зависящий от домена:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthz/security/well_known_sids.asp

и соответственно к нему можно прибиндиться при помощи метода описанного здесь:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ad/ad/binding_to_an_object_using_a_sid.asp

SID Администратора, по моему, зависит от домена но его тоже можно сконструировать используя сид этого самого домена.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.