„Sandboxed Solutions” i „Farm solutions”

By RSS on Lipiec 30th, 2010
Jedną z potężniejszych nowości dostępnych w SharePoint 2010 są tzw.: "Sandboxed Solutions". Pod dźwięczną nazwą kryje się miedzy innymi nowy styl pisania rozwiązań pod SharePointa.

Continue Reading

CRM 4.0 – Znikające terminy w Outlook

By Tomasz Filipowicz on Lipiec 27th, 2010

W większości firm Outlook jest strategicznym narzędziem pracy handlowców. To tam rejestrowane jest to co handlowiec robi, z kim się spotyka, itd.

Po wdrożeniu CRM w organizacji zazwyczaj instalowany jest na większości komputerów dodatek do programu Outlook, który pozwala na pracę w CRM w oknie outlook, śledzenie elementów outlookowych bezpośrednio w CRM. Wśród takich elementów jest oczywiście zaproszenie na spotkanie. Jednakże z tym elementem jest bardzo dużo problemów, gdyż w CRM 4.0 nie ma czegoś takiego jak zaproszenie na spotkanie. Prześledźmy następujący scenariusz:

  1. Użytkownik CRM (nazwijmy go Organizator 1) tworzy zaproszenie na spotkanie i wysyła go do użytkownika (nazwijmy go Handlowiec 1). Zaproszenie to nie jest śledzone w CRM.
  2. Handlowiec 1 dostaje zaproszenie, wybiera opcję “Śledź w programie CRM”. Powoduje to powstanie w CRM rekordu Termin, gdzie Właścicielem jest Handlowiec 1, natomiast Organizatorem jest Organizator 1.
  1. Jeśli w CRM Handlowiec 1 miał ustawiony adres email to po otwarciu terminu w CRM w polu wymagani uczestnicy zostanie zaprezentowane wskazanie na użytkownika. W tym przypadku po przeprowadzeniu synchronizacji w programie Outlook (CRM –> Synchronizuj z CRM) termin nie zniknie z kalendarza użytkownika w Outlook
  2. Jeśli w CRM Handlowiec 1 nie miał ustawionego adresu email to po otwarciu terminu w CRM w polu wymaganie uczestniczy widoczny będzie czerwony adres email z informację, że system CRM nie był w stanie rozpoznać uczestnika. W tym przypadku po przeprowadzeniu synchronizacji termin w kalendarzu w Outlook zostanie usunięty. Jedyna możliwość przywrócenia tego terminu do kalendarza Outlook jest wykonanie operacji:
  1. Otwarcie rekordu użytkownika i uzupełnienie mu adresu email
  2. Otwarcie terminu w CRM i wskazanie jaki użytkownik krył się pod tym adresem email
  3. Przeprowadzenie ponownej synchronizacji w Outlook.

Zachęcam do przeprowadzenia testów kiedy zaproszenie jest wysyłane do większej liczby użytkowników niż jeden :). Kilka scenariuszy przeprowadził Kuba i opisał to na swoim blogu: http://crmblog.pl/2009/09/17/co-dzieje-sie-z-rekordami-po-synchronizacji-crm-outlook/

CRM 4.0 – Znikające terminy w Outlook

By Tomasz Filipowicz on Lipiec 27th, 2010

W większości firm Outlook jest strategicznym narzędziem pracy handlowców. To tam rejestrowane jest to co handlowiec robi, z kim się spotyka, itd.

Po wdrożeniu CRM w organizacji zazwyczaj instalowany jest na większości komputerów dodatek do programu Outlook, który pozwala na pracę w CRM w oknie outlook, śledzenie elementów outlookowych bezpośrednio w CRM. Wśród takich elementów jest oczywiście zaproszenie na spotkanie. Jednakże z tym elementem jest bardzo dużo problemów, gdyż w CRM 4.0 nie ma czegoś takiego jak zaproszenie na spotkanie. Prześledźmy następujący scenariusz:

  1. Użytkownik CRM (nazwijmy go Organizator 1) tworzy zaproszenie na spotkanie i wysyła go do użytkownika (nazwijmy go Handlowiec 1). Zaproszenie to nie jest śledzone w CRM.
  2. Handlowiec 1 dostaje zaproszenie, wybiera opcję “Śledź w programie CRM”. Powoduje to powstanie w CRM rekordu Termin, gdzie Właścicielem jest Handlowiec 1, natomiast Organizatorem jest Organizator 1.
  1. Jeśli w CRM Handlowiec 1 miał ustawiony adres email to po otwarciu terminu w CRM w polu wymagani uczestnicy zostanie zaprezentowane wskazanie na użytkownika. W tym przypadku po przeprowadzeniu synchronizacji w programie Outlook (CRM –> Synchronizuj z CRM) termin nie zniknie z kalendarza użytkownika w Outlook
  2. Jeśli w CRM Handlowiec 1 nie miał ustawionego adresu email to po otwarciu terminu w CRM w polu wymaganie uczestniczy widoczny będzie czerwony adres email z informację, że system CRM nie był w stanie rozpoznać uczestnika. W tym przypadku po przeprowadzeniu synchronizacji termin w kalendarzu w Outlook zostanie usunięty. Jedyna możliwość przywrócenia tego terminu do kalendarza Outlook jest wykonanie operacji:
  1. Otwarcie rekordu użytkownika i uzupełnienie mu adresu email
  2. Otwarcie terminu w CRM i wskazanie jaki użytkownik krył się pod tym adresem email
  3. Przeprowadzenie ponownej synchronizacji w Outlook.

Zachęcam do przeprowadzenia testów kiedy zaproszenie jest wysyłane do większej liczby użytkowników niż jeden :). Kilka scenariuszy przeprowadził Kuba i opisał to na swoim blogu: http://crmblog.pl/2009/09/17/co-dzieje-sie-z-rekordami-po-synchronizacji-crm-outlook/

OpenOffice.org – wiele instalacji równoczesnie (Linux, rpm)

By Jarosław Jan Pyszny on Lipiec 27th, 2010

W celu zapoznania się z tym, co będzie w kolejnej wersji OpenOffice.org możemy sięgnąć po wersje testowe (Developer Snapshot). Jeśli nie tworzymy specjalnego środowiska testowego, to na ogół nie chcemy pozbywać się stabilnej wersji a testową zainstalować obok. Pod Linuksem możemy mieć równocześnie zainstalowaną wersje stabilną oraz testową z linii ooo-dev. Czasem jednak przydaje się możliwość dostępu do większej liczby alternatywnych instalacji. Za radą kolegi Quest-88 odwiedziłem stronę Wiki OpenOffice.org: How to run different OpenOffice.org versions in parallel, gdzie jest opisane jak sobie z tym problemem poradzić. Na podstawie tego opisu przygotowałem prosty skrypt w bashu, automatyzujący instalację. Dla pewności należy go jeszcze uzupełnić o testy nieprawidłowych wartości parametrów czy też obsługę sytuacji wyjątkowych.

Skrypt wymaga trzech parametrów:

  1. katalog docelowy instalacji
  2. nazwa bazowa:
    • ooo-dev – dla wersji developer snapshot
    • openoffice.org – dla wersji stabilnych
  3. plik *.tgz

Przykład dla DEV300m84 (OOo-Dev_DEV300m84_Linux_x86-64_install-rpm_en-US.tar.gz):

 insoo.sh /opt/oo33 ooo-dev /tmp/OOo-Dev_DEV300m84_Linux_x86-64_install-rpm_en-US.tar.gz 

Zawartość skryptu insoo.sh:

#!/bin/bash

# ustawienia
OOBASEDIR="$1"
OOBASENAME="$2"
OOTGZ="$3"
if [ ! -e "${OOTGZ}" ]
  then
    echo "Brak pliku tarball"
    exit -1
fi

OOFONTDIR=${OOBASENAME}/basis3.3/share/fonts
BOOTSTRAP=${OOBASENAME}3/program/bootstraprc
OOVERDIR=` tar tzf "${OOTGZ}"| head -n 1` 

# informacje
echo Instalacja OpenOffice.org
echo =========================
echo "Plik instalacyjny: ${OOTGZ}"
echo "Nazwa katalogu w tarball: ${OOVERDIR}"
echo "Katalog docelowy: ${OOBASEDIR}"
echo "Nazwa OpenOffice.org: ${OOBASENAME}"
echo ""

# instalacja
mkdir -p "${OOBASEDIR}"
pushd "${OOBASEDIR}" > /dev/null
tar xzf "${OOTGZ}"

for i in ${OOVERDIR}/RPMS/o*.rpm; do rpm2cpio "$i" | cpio -id; done

mv opt/* . 
rm -r opt   "${OOVERDIR}"

# przeniesienie katalogu z ustawieniami użytkownika
# do ${OOBASEDIR}/users
perl -pi -e 's|(UserInstallation=).*|\1\$ORIGIN/../..|' ${BOOTSTRAP}

# konfiguracja fontów, brakujące wpisy OO.org 3.3.x
mkdir -p "${OOFONTDIR}/type1"
mkdir -p user/fonts

cat > "${OOFONTDIR}/type1/fc_local.conf" << FONTCFG
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "/etc/fonts/conf.d/fonts.dtd">
<fontconfig>
</fontconfig>
FONTCFG

cat > user/fonts/fc_local.conf << FONTCFG
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "/etc/fonts/conf.d/fonts.dtd">
<fontconfig>
</fontconfig>
FONTCFG

popd > /dev/null
echo ""
echo "Wywołanie programu: ${OOBASEDIR}/${OOBASENAME}3/program/soffice"
# pierwszy start
${OOBASEDIR}/${OOBASENAME}3/program/soffice

SetParent – czyli jak napisać plugin do tej wiadomości

By Tomasz Filipowicz on Lipiec 26th, 2010

Przy okazji rozbudowania funkcjonalności CRM4.0 potrzebowałem napisać plugin, którego zadaniem będzie wykonanie pewnej operacji w trakcie kiedy zmieni się Menedżer użytkownika.

Dla przypomnienia: Pole Menedżer jest widoczne na formatce użytkownika jednakże ustawienie jego wartości jest możliwe tylko i wyłączenie poprzez skorzystanie z funkcjonalności ukrytej w menu Akcje lub też wykonanie kodu związane z klasą SetParentSystemUserRequest:

Okazuje się, że narzędzie Plugin Registration Tool (PRT) nie udostępnia nam możliwości podłączenia się pod zdarzenie związane ze zmianą interesującego nas pola. Interesujące nas wiadomości nazywa się SetParent.

Nie ma jednak tego ukrytego co by odkryte może zostać i okazuje się, że w bazie danych CRM taką wiadomość można odkryć. Jak ?

Wszystkie wiadomości jakie CRM może przetwarzać są zapisane w tabeli SdkMessageBase. Jak wykonamy sobie następujące zapytanie SQL:

select * from SdkMessageBase where Name = ‚SetParent’

Zobaczymy, że tabela zwróci nam jeden rekord. To co jest dla nas z tego wyniku najważniejsze to SdkMessageId. W kolejnym kroku musimy zaktualizować jedną kolumnę w tabeli SdkMessageFilterBase, aby wiadomość nam się pokazała. Całe zapytanie, które to wykonuje jest następujące:

update SdkMessageFilterBase set IsCustomProcessingStepAllowed =1 where SdkMessageId = ‚1ABEBB1B-EA3E-DB11-86A7-000A3A5473E8’

Jak już to będziemy mieli wykonane nie pozostaje nam nic innego jak przeładować PRT i ponownie spróbować stworzyć Step, które będzie powiązany z tą wiadomością:

Jak wygląda kod obsługi tej wiadomości  ? Oto przykład:


public class PreSetParent : IPlugin
{
public void Execute(IPluginExecutionContext context)
{
if (context.MessageName == "SetParent" && context.InputParameters.Properties.Contains(Attributes.UserId) && context.InputParameters.Properties.Contains(Attributes.ParentId))
{
Guid _userId = (Guid)context.InputParameters[Attributes.UserId];
Guid _parentId = (Guid)context.InputParameters[Attributes.ParentId];
}
}
}

InputParameters w IPluginExecutionContext zawiera w tym przypadku 4 właściwości. UserId oraz ParentId są odpowiednią identyfikatorem użytkownika oraz identyfikatorem Menedżera. Inne atrybuty można sobie podejrzeć debugując kod pluginu.

Rozwiązanie, które zaproponowałem jest w 100% niewspierane i korzystacie z niego na własną odpowiedzialność.

SetParent – czyli jak napisać plugin do tej wiadomości

By Tomasz Filipowicz on Lipiec 26th, 2010

Przy okazji rozbudowania funkcjonalności CRM4.0 potrzebowałem napisać plugin, którego zadaniem będzie wykonanie pewnej operacji w trakcie kiedy zmieni się Menedżer użytkownika.

Dla przypomnienia: Pole Menedżer jest widoczne na formatce użytkownika jednakże ustawienie jego wartości jest możliwe tylko i wyłączenie poprzez skorzystanie z funkcjonalności ukrytej w menu Akcje lub też wykonanie kodu związane z klasą SetParentSystemUserRequest:

Okazuje się, że narzędzie Plugin Registration Tool (PRT) nie udostępnia nam możliwości podłączenia się pod zdarzenie związane ze zmianą interesującego nas pola. Interesujące nas wiadomości nazywa się SetParent.

Nie ma jednak tego ukrytego co by odkryte może zostać i okazuje się, że w bazie danych CRM taką wiadomość można odkryć. Jak ?

Wszystkie wiadomości jakie CRM może przetwarzać są zapisane w tabeli SdkMessageBase. Jak wykonamy sobie następujące zapytanie SQL:

select * from SdkMessageBase where Name = ‚SetParent’

Zobaczymy, że tabela zwróci nam jeden rekord. To co jest dla nas z tego wyniku najważniejsze to SdkMessageId. W kolejnym kroku musimy zaktualizować jedną kolumnę w tabeli SdkMessageFilterBase, aby wiadomość nam się pokazała. Całe zapytanie, które to wykonuje jest następujące:

update SdkMessageFilterBase set IsCustomProcessingStepAllowed =1 where SdkMessageId = ‚1ABEBB1B-EA3E-DB11-86A7-000A3A5473E8’

Jak już to będziemy mieli wykonane nie pozostaje nam nic innego jak przeładować PRT i ponownie spróbować stworzyć Step, które będzie powiązany z tą wiadomością:

Jak wygląda kod obsługi tej wiadomości  ? Oto przykład:


public class PreSetParent : IPlugin
{
public void Execute(IPluginExecutionContext context)
{
if (context.MessageName == "SetParent" && context.InputParameters.Properties.Contains(Attributes.UserId) && context.InputParameters.Properties.Contains(Attributes.ParentId))
{
Guid _userId = (Guid)context.InputParameters[Attributes.UserId];
Guid _parentId = (Guid)context.InputParameters[Attributes.ParentId];
}
}
}

InputParameters w IPluginExecutionContext zawiera w tym przypadku 4 właściwości. UserId oraz ParentId są odpowiednią identyfikatorem użytkownika oraz identyfikatorem Menedżera. Inne atrybuty można sobie podejrzeć debugując kod pluginu.

Rozwiązanie, które zaproponowałem jest w 100% niewspierane i korzystacie z niego na własną odpowiedzialność.

RadControls for ASP.NET z SharePoint 3.0 i 2007

By RSS on Lipiec 25th, 2010
Od dłuższego czasu mam już do czynienia z kontrolkami RadControls firmy Telerik. Ostatnio wykorzystałem je w tworzeniu dużego portalu pod SharePointem. Na początku miałem problemy z konfiguracją pliku web.

Continue Reading

Proste masowe utworzenie kont użytkownikow w Active Directory CSV excel

By Przemek Kuczyński on Lipiec 23rd, 2010

1. Tworzymy plik excel w postaci jak poniżej



Plik przykladowy do pobrania http://www.przemekkuczynski.pl/Createuser.xlsm

2. Zapisujemy C:\Book1.xls
3.  Tworzymy plik vbs o zawartosci

' UserSpreadsheet .vbs
' Sample VBScript to create User accounts from a spreadsheet
' Author Guy Thomas http://computerperformance.co.uk/
' Version 4.6 - June 2005
' ------------------------------------------------------' 
Option Explicit
Dim objRootLDAP, objContainer, objUser, objShell
Dim objExcel, objSpread, intRow
Dim strUser, strOU, strSheet
Dim strCN, strSam, strFirst, strLast, strPWD, strUPN, strDN, strEA2
 
' -------------------------------------------------------------'
' Important change OU= and strSheet to reflect your domain
' -------------------------------------------------------------'

strOU = "OU=PracownicyBezKomputera,OU=TESTOWE ," ' Note the comma
strSheet = "C:\Book1.xls"
 
' Bind to Active Directory, Users container.
Set objRootLDAP = GetObject("LDAP://rootDSE")
Set objContainer = GetObject("LDAP://" & strOU & _
objRootLDAP.Get("defaultNamingContext")) 
 
' Open the Excel spreadsheet
Set objExcel = CreateObject("Excel.Application")
Set objSpread = objExcel.Workbooks.Open(strSheet)
intRow = 3 'Row 1 often contains headings

' Here is the 'DO...Loop' that cycles through the cells
' Note intRow, x must correspond to the column in strSheet
Do Until objExcel.Cells(intRow,1).Value = ""
   strSam = Trim(objExcel.Cells(intRow, 1).Value)
   strCN = Trim(objExcel.Cells(intRow, 2).Value)
   strUPN = Trim(objExcel.Cells(intRow, 3).Value)
   strFirst = Trim(objExcel.Cells(intRow, 4).Value)
   strLast = Trim(objExcel.Cells(intRow, 5).Value)
   strPWD = Trim(objExcel.Cells(intRow, 6).Value)
   strDN = Trim(objExcel.Cells(intRow, 7).Value)
   strEA2 = Trim(objExcel.Cells(intRow, 8).Value)
on error resume next 
   ' Build the actual User from data in strSheet.
   Set objUser = objContainer.Create("User", "cn=" & strCN)
   objUser.sAMAccountName = strSam
   objUser.userPrincipalName = strUPN
   objUser.givenName = strFirst
   objUser.sn = strLast
   objUser.displayName = strDN
   objUser.extensionAttribute2 = strEA2
   objUser.SetInfo
 
   ' Separate section to enable account with its password
   objUser.userAccountControl = 512
   objUser.pwdLastSet = 0
   objUser.SetPassword strPWD
   objUser.SetInfo
 
intRow = intRow + 1
Loop
objExcel.Quit 
 
WScript.Quit 
 
' End of free example UserSpreadsheet VBScript.

SCCM – Bo podczas zakupu powiedzieli …

By kaarol on Lipiec 22nd, 2010

Ostatnimi czasy zdarza mi się doradzać czy też może prowadzić jakieś dłuższe uzasadnienia dlaczego SCCM to jednak przydatne narzędzie. Niestety w przypadku niektórych osób nie jest to łatwe, szczególnie gdy ktoś wydaje sporo na software, przy którym administrator spędza kilka godzin tylko po to by zainstalować jedną paczkę. Niestety jak to zwykle bywa, na konferencjach czy prezentacjach często

Witaj, świecie!

By Audyt Technologiczny on Lipiec 18th, 2010

Witaj w WordPressie. To jest Twój pierwszy wpis. Zmodyfikuj go lub usuń, a następnie rozpocznij blogowanie! Continue Reading

Wersjonowanie w SharePoint 3.0, 2007

By RSS on Lipiec 13th, 2010

Wersjonowanie elementów (dokumentów) w SharePoint jest jednym z głównych opcji tej platformy nawet w bezpłatnej wersji – SharePoint Services 3.0. Prosta w obsłudze funkcja z poziomu UI może jednak dostarczyć paru problemów jeśli chcemy dostać się do niej z poziomu API.

Continue Reading

Zaległości fotograficzne

By Kamil Skalski on Lipiec 10th, 2010

Opinia Opinie o firmie mm-notebooks M&M Notebooks

By Przemek Kuczyński on Lipiec 4th, 2010

Jesli ktokolwiek to przeczyta radze się zastanowić 2 razy zanim cokolwiek kupicie od tej firmy. Na allegro sprzedają pod nickiem copymax http://allegro.pl/show_user.php?uid=614568

Więcej info na: http://www.niekupuje.pl/?p=312