Konto usługi SQL Server: WMI Provider error

A dokładniej: „WMI Provider error: This parameter is incorrect. [0x80070057]”. Błąd pojawił się w momencie zmiany konta serwisowego dla usługi SQL Server Agent za pomocą narzędzia Sql Server Configuration Manager.

sqlserversqlagentserviceerror

Pierwsza myśl – coś się stało z WMI i może trzeba będzie przebudować repozytorium (np. jak tu: https://blogs.technet.microsoft.com/askperf/2009/04/13/wmi-rebuilding-the-wmi-repository/) . Ale zmiana innego konta zadziałała bez zarzutu.

Problem pojawiał się tylko dla tego jednego konta – bez względu na to czy chciałem ustawić dla usługi konto domenowe, czy wirtualne zawsze pojawiał się ten sam błąd. Szukając więcej na temat błędu trafiłem na stronę WMI Error Constants w MSDN, gdzie napisano że to wcale nie błąd WMI tylko systemowy:

0x8007xxxx
Errors originating in the core operating system. WMI may return this type of error because of an external failure, for example, DCOM security failure.

Zatem przebudowa repozytorium WMI odpada, bo zupełnie nic nie da w tym przypadku. Ten sam numer błędu występuje także przy innych sytuacjach, np kopiach zapasowych, czy np. zdalnym wywołaniu sesji WMI na innym komputerze.

W kilku linkach przy wyszukiwaniu rozwiązania znalazłem sugestię, żeby zmienić ustawienia konta nie za pomocą Sql Server Configuration Managera, tylko standardowo przez konfigurację z poziomu Panel sterowania > Narzędzia administracyjne > Usługi.

I mimo że zawsze podkreśla się, żeby do zmian ustawień usług korzystać tylko z programu Sql Server Configuration Manager – zmiana konta w standardowym oknie konfiguracyjnym usługi zadziałała – mogłem bez problemu ustawić konto domenowe dla usługi.

Okazało się, że konto Local System zostało wcześniej ustawione właśnie przez zwykłą edycję usługi w narzędziach administracyjnych i próba zmiany z poziomu konfiguratora usług SQL Server nie dawała rezultatu.

Wniosek: czym się strułeś, tym się lecz. Jeśli zmieniasz parametry usługi nie tak jak trzeba, to odwróć potem sytuację też nie tak jak trzeba.

Reklamy

Wywołaj sqlcmd z PowerShell

Zadanie jest proste: mamy skrypt z poleceniami SQL, który chcemy wywołać przez sqlcmd. Ale – w skrypcie wykorzystujemy zmienną, która na dodatek zawiera ścieżkę do katalogu. Jako przykład niech posłuży taki fragment zapisany w pliku SELECT.sql:

SELECT Imie = 'Bartek', Zmienna = '$(ScriptPath)'

Wywołanie z poziomu cmd nie stwarza problemów:

C:\> cd tmp
C:\tmp> sqlcmd -r1 -v ScriptPath="C:\tmp" -i SELECT.sql -S Serwer-f 1250
Bartek Zmienna
------ -------
Bartek C:\tmp

Poszczególne przełączniki oznaczają:

  • -r1 – chcę zobaczyć błędy na ekranie
  • -v – przekazuję zmienną o nazwie ScriptPath z wartością zawierającą jakąś ścieżkę
  • -i – nazwa skryptu wejściowego
  • -S – mój serwer
  • -f – strona kodowa

I super, a jeśli potrzebujemy uruchomić w PowerShell?

PS C:\tmp> sqlcmd -r1 -v ScriptPath="C:\tmp" -i SELECT.sql -S Serwer -f 1250
Sqlcmd: ':\tmp': Invalid argument. Enter '-?' for help.PS C:\tmp>

Czemu tak?
Czytaj dalej

SSRS 2008 – dzień drugi

Walka trwa. Już sporo udało się uruchomić, ale pojawiają się kolejne ciekawostki do ogarnięcia. Dzień drugi jest tu potraktowany dość dowolnie, bo w rzeczywistości rozciągnął się na kilka. Razem z wujkiem Googlem rozwiązujemy kolejne problemy.

Problem 1. Nie działa wysyłka maili subskrybowanych raportów.

Błąd „Failure sending mail: The transport lost its connection to the server.”

Najprawdopodobniej próba wysłania za dużego załącznika Excela. Przy czym „za duży” może być różnie interpretowane. Znalezione rozwiązanie: „zwiększyć dopuszczalny rozmiar wiadomości na serwerze SMTP”. Pierwsza myśl – raczej tu nie ma zastosowania – w moim przypadku maksymalny rozmiar wiadomości to 25MB, załącznik ma 8MB.

Okazało się, że było blisko, ale trzeba szukać gdzie indziej. Akurat serwer SMTP, przez który wysyłamy pocztę jest tylko przekaźnikiem (relay) do właściwego serwera SMTP. Ustawienia rozmiarów wiadomości były bardzo niskie. Zwiększenie do rozmiaru dozwolonego przez główny serwer SMTP oraz zrestartowanie IISa na serwerze-przekaźniku rozwiązało problem.

Błąd „Failure sending mail: At least one of the From or Sender fields is required, and neither was found. Mail will not be resent.”

Wprowadzono alias (np. nazwę użytkownika domenowego) zamiast adresu e-mail: http://support.microsoft.com/kb/945601/pl. Sprawdź zarówno ustawienia subskrypcji jak i konta wysyłającego maile w Reporting Services Configuration Manager, sekcja E-mail settings.

Błąd „The transport error code was 0x800ccc6d. The server response was 552 4.3.1 Message size exceeds fixed maximum message size”

Rozmiar załącznika typu CSV przekracza dozwolony rozmiar ustawiony na serwerze SMTP. Co ciekawe ten błąd wystąpił tylko dla załącznika CSV – dla pozostałych zgłaszał „transport lost”.

Problem 2. Jak przychodzę do pracy i uruchamiam stronę z raportami, to strasznie długo się wczytuje. Potem już jest dobrze. No, prawie dobrze.

W SSRS istnieje pojęcie czasu recyklingu raportów (domyślnie 720 minut). Jest to związane z ogólnym pojęciem appdomain recycling w .NET, ale nie będę teraz tego zgłębiał. Generalnie objawia się to przez wyczyszczenie z pamięci wszystkich ustawień aplikacji. A po restarcie pierwsze uruchomienie wymaga ponownego ich załadowania, co powoduje dłuższy czas oczekiwania.

Rozwiązanie 1: wydłużyć czas recyklingu oraz automat odpalany w nocy, który za nas będzie udawał pierwszego użytkownika: http://www.pawlowski.cz/2011/07/solving-issue-long-starting-report-ssrs-2008/

Rozwiązanie 2: przygotować prosty raport, którego głównym zadaniem będzie uruchamianie się w krótkich odstępach czasu co pozwoli zapobiec restartowi. Patrz: http://social.msdn.microsoft.com/Forums/is/sqlreportingservices/thread/bbaafd07-2897-4b9a-920a-7dbb03047635

Problem 3. Mam w raporcie parametr, który jest listą rozwijaną wielokrotnego wyboru. Chcę, żeby domyślnie były zaznaczone wszystkie wartości (wybranie „Select All”).

Jako wartość domyślną ustaw te same wartości jakie są dostępne w liście wyboru.

Problem 4. Jak tworzę wykres, to jako wartości na nim od razu mi wrzuca albo SUM(), albo COUNT(). Ja nie chcę żadnego agregatu, tylko żeby pokazał mi to, co daję na osi Y.

Obok pola agregatu nacisnąć strzałkę (trójkąt), żeby pokazała się lista rozwijana. Wybrać Expression. Zamiast wartości agregowanej, np. =Count(Fields!Pole.Value) daj samo =Fields!Pole.Value

Problem 5. Eksport do CSV robi to co powinien, czyli oddziela przecinkami. A ja chcę średniki (jak w Excelu), albo nawet tabulator.

W pliku rsreportserver.config odszukaj sekcję Render. Zawiera ona serię wpisów dotyczących renderowania raportów. Zostawiamy istniejący wpis dotyczący CSV i dodajemy drugi, własny:

<Extension Name="CSV 2" Type="Microsoft.ReportingServices.Rendering.DataRenderer.CsvReport,Microsoft.ReportingServices.DataRendering">
    <OverrideNames>
        <Name Language="en-US">CSV (oddzielany srednikiem)</Name>
    </OverrideNames>
    <Configuration>
        <DeviceInfo>
            <FieldDelimiter>;</FieldDelimiter>
        </DeviceInfo>
    </Configuration>
</Extension>

Po kolei:

  • Extension[@Name] – bo każde musi mieć swoją nazwę
  • Type – taki sam jak dla CSV
  • OverrideNames/Name[@language] – chcemy własny opis rozszerzenia renderującego; w moim przypadku język en-US, bo podajemy język systemu operacyjnego
  • Configuration/DeviceInfo/FieldDelimiter – jaki ma być separator

Więcej na temat własnego rozszerzenia renderującego w BOL: Customizing Rendering Extension Parameters in RSReportServer.Config oraz parametry bezpośrednio dla CSV: CSV Device Information Settings.

W przykładzie nie ma polskich liter. Jeśli chcesz ich użyć pamiętaj, żeby zapisać plik jako UTF-8, inaczej będą krzaki.

SSRS 2008 na W2K8. R2.

Piękny tytuł. Ogólnie chodzi o walkę z konfiguracją i spowodowanie działania SQL Server Reporting Services 2008 (R2) na Windows Server 2008 (również R2). Rozpoznanie bojem – uczymy się usługi i kierujemy się zasadą, że ma najpierw działać, a potem będziemy robić żeby było lepiej. Będzie nadal strzelanie skrótami.

Atak 1. Raport stworzony i działający w BIDS nie chce się osadzić (tak będzie po polsku „deploy”?) na serwerze.

„Nie chce się osadzić” może przyjmować różne znaczenia. U mnie to były:

1) Error „The permissions granted to user ‚…’ are insufficient for performing this operation”.
Czytaj dalej

PHP + Apache + Imagick na Windows 7

Zadanie – zainstalować obsługę Image Magick na maszynie deweloperskiej z Windows7 64-bit. Integracja z PHP 5.3.8 jako moduł Apache 2.2.x.

PHP 5.3.8 musi być w w wersji Thread Safe, bo ona jest przewidziana do integracji jako moduł Apache 2.2 (zawiera bibliotekę php5apache2_2.dll, której jest pozbawiona wersja Non Thread Safe przeznaczona na dostęp CGI). Ponieważ do budowy PHP stosowany jest kompilator VC9, to potrzebne są binaria Apache skompilowane także VC9. Do pobrania z Apache Lounge.

Obsługa rozszerzenia imagick wymaga posiadania zainstalowanego Image Magick. Ściągamy wersję 32-bitową, ponieważ PHP też jest w wersji 32-bit. Najlepiej zastosować się do zaleceń autorów – jeśli nie wiesz co potrzebujesz, to ściągaj wersję Q-16-windows-dll. Podczas instalacji należy zaznaczyć dodanie Image Magick do ścieżki systemowej. Następnie ściągamy php_imagick.dll – nie ma obecnie wersji windows na PECL, więc bierzemy bezpośrednio ze strony autora rozszerzenia (wybieramy wersję Thread Safe). Bibliotekę kopiujemy do podkatalogu ext, zmianiamy nazwę na php_imagick.dll i dodajemy rozszerzenie

extension=php_imagick.dll

I gotowe.

EDIT: Nie do końca gotowe. Jeśli zatrzymamy się w tym punkcie biblioteka będzie się podłączała i zobaczymy ją w phpinfo(), ale każdorazowe wywołanie funkcji Imagick() będzie powodowało restart Apache. Żeby działało poprawnie należy zainstalować wersję Image Magick nie nowszą niż 6.6.4.0. Patrz też: odpowiedź na stackoverflow

Open file – security warning na Windows 2008

Jak wyłączyć konieczność potwierdzania uruchamiania/pobierania plików zewnętrznych w W2K8, kiedy wyskakuje okno ‚open file – security warning’? Porada znaleziona na experts-exchange.com:

  1. Otwórz konsolę Local Group Policy Edito wpisując w konsoli gpedit.msc
  2. Przejdź do User Configuration > Administrative Templates > Windows Components > Attachment Manager
  3. Wybierz Inclusion list for low file types i wprowadź swoje rozszerzenia oddzielane średnikiem (w moim przypadku wystarcza .bat)

Gotowe

Przez proxy z konsoli

Czasem zachodzi potrzeba połączenia się ze stroną internetową z poziomu konsoli windows (np. przy aktualizacji gemów w Ruby). Co zrobić, jeśli jesteśmy zmuszeni korzystać z proxy? Sposobów jest kilka, najprostszy chyba ten: ustawić zmienną środowiskową http_proxy:

set http_proxy=http://user:haslo@adres.serwera.proxy:port

Wyłącza się to poprzez

set http_proxy=

Można też rozbić wpis na kilka:

set http_proxy=http://adres.serwera.proxy:port
set http_proxy_user=user
set http_proxy_pass=haslo