usuwane danych użytkownika z Office365

niby proste. ale jest 'ale’….

User

po usunięciu użytkownika – zostaje w śmietniq. to proste. czyli należy usunąć usera a potem go usunąć ze śmietnika

remove-MsolUser -UserPrincipalName user@w-files.pl

get-MsolUser -UserPrincipalName user@w-files.pl -ReturnDeletedUsers | Remove-MsolUser -RemoveFromRecycleBin

 

Exchange

teraz nie mogę znaleźć… ale jestem przekonany, że w artyqłach była informacja że po takim usunięciu wszystkie dane są również usuwane… ale tak nie jest! okazuje się, że skrzynka zostaje:

get-recipient user@w-files.pl -IncludeSoftDeletedRecipients

Name RecipientType
---- -------------
User, wufajls   UserMailbox

get-recipient user@w-files.pl -IncludeSoftDeletedRecipients | Remove-Mailbox -PermanentlyDelete

OneDrive

z OneDrive jest jeszcze dziwniej, bo po usunięciu użytkownika site nadal jest widoczny jako aktywny. jako dowód – po wykonaniu tego polecania, OD użytkownika nadal nie będzie na liście:

Get-SPODeletedSite -IncludeOnlyPersonalSite | FT url

natomiast wyświetlenie aktywnego site OD pokaże go:

Get-SPOSite -Identity https://w-files-my.sharepoint.com/personal/user_w-files_pl

Url Owner Storage Quota
--- ----- -------------
https://w-files-my.sharepoint.com/personal/user_wufajls_pl user@w-files.pl 1048576

opis algorytmu dla OD można zleźć w artykule na support.office.com. site jest widoczny i dostępny przez 7 dni po usunięciu użytkownika i dopiero potem trafia do śmietnika.

podsumowując

  • proste operacje 'pod spodem’ wcale niekoniecznie są takie proste.
  • każdy serwis żyje własnym życiem i ma własne zasady – office365 to nie jest pojedyncza usługa!
  • jeśli ktoś ma 'onpremową intuicję’ to należy się jej wyzbyć.
  • to wszystko to niby niuanse, ale bywają istotne – zwłaszcza jeśli trzeba odtworzyć konto w AAD oraz ze względu na aspekty bezpieczeństwa i dostępu do danych.

eN.

 

 

 

 

role AzureAD – jak zacząć pracę z graphAPI

Customized Administrator

czy zauważyliście, że zależnie od interfejsu, widać inne role w AAD? jeśli zajrzymy z Office Admin Center to:

kiedy tworzy się 'Customized Admin’ z portalu Admin, to już ilościowo widać, że jest coś więcej:

a tak na prawdę, jak nie trudno się domyślić, jest ich jeszcze więcej.  scenariusz 'po co?’ zostawię sobie na kiedy indziej a tymczasem – jak sprawdzić te role i jak do nich przydzielić? jakich braqje?

jak sprawdzić wszystkie role

najkrócej: za pomocą Microsoft Graph. zakładam, że używanie tego mechanizmu dla wielu osób nie jest oczywiste, dla tego krótka instrukcja. po wejściu stronę, należy się uwierzytelnić do swojego tenanta [po lewej stronie 'microsoft sign-in’]. w innym przypadq będziemy w testowym tenancie Microsoftu.

w oknie akcji widać trzy podstawowe elementy – okno zapytania, 'request body’ uzupełniające zapytanie oraz 'response body’ gdzie będą się pojawiać wyniki.

dla sportu można sobie kliknąć 'run query’ i zobaczyć wynik w 'response body’. szybko można się zorientować, że wszędzie widzimy legendarnego Dżejsona, a zapytania są w stanie spoczynq [REST]. jak nie rozumiesz – na razie nie szkodzi, ale warto uzupełnić sobie informacje o zapytania REST oraz format JSON. w odpowiedzi dowiemy się paru rzeczy o własnym koncie.

można się również szybko zorientować w dostępnych metodach rozwijając listę 'GET’ gdzie widać jeszcze 'PUT’, 'POST’, PATCH’ oraz 'DELETE’. widać również, że są dwie wersje Microsoft Graph – v1.0 oraz beta.

pierwsza niespodziewajka – czytając i przeglądając artykuły zaczniecie trafiać na wersje 1.5 czy 1.6… a to dla tego że oprócz Microsoft Graph jest jego poprzednia wersja – AzureAD graph. trzeba zatem uważać przy stosowaniu przykładów, do której są wersji.

dostępne role dla Customized Administrator – bo taki jest cel niniejszego zadania – widoczne są w części 'directoryRoles’. i tu widać pełną listę, m.in. niedostępnego z interfejsu 'CRM Service Administrator’, 'Power BI Service Administrator’ i kilka innych.

jak dodać rolę

pomimo, że w naszym świecie rolę przydziela się użytkownikowi, tutaj to roli przydziela się użytkownika. czyli operację trzeba wykonać dla pożądanej roli a nie dla użytkownika. to, co będzie nas interesować to 'ID’ roli. zanim coś przypiszemy najpierw sprawdźmy członków 'Global Admins’. tutaj nazywa się to 'Company Administrator’ … pewnie dla ułatwienia (; spisujemy ID i wykonujemy GET dla https://graph.microsoft.com/v1.0/directoryRoles/<ID Company Amdministrator/members -> Run Query. pojawią się wszyscy GA dla tenanta.

aby kogoś dodać, należy wysłać żądanie [POST] a w treści zamieścić opis obiektu zapisany jako JSON.

polecenie HTTP:

POST v1.0 https://graph.microsoft.com/v1.0/directoryRoles/<ID Company Amdministrator/members/ref$

oraz request body, gdzie zamieszczamy opis obiektu:

{
"@odata.id": "https://graph.microsoft.com/v1.0/users/<userID - może być UPN lub objectID>"
}

wykonujemy request i….

dostajemy błąd o braq uprawnień. pomimo, że jesteśmy adminami?

uprawnienia dla GraphExplorera

Graph Explorer działa jako proxy i standardowo ma tylko uprawnienia odczytu. należy aplikacji nadać uprawnienia, aby mogła wykonać operacje zapisu. zwróć uwagę, że tam, gdzie było 'Sign In’, teraz pod loginem jest 'modify permissions’ oraz 'sign out’. dla nadania roli wymagane są dwa uprawnienia:

  • Directory.AccessAsUser.All
  • Directory.ReadWrite.All

zostaniemy zapytani, czy nadać aplikacji odpowiednie uprawnienia i voila. wykonanie wcześniej opisanego query – doda userowi pożądaną rolę.

eN.

współdzielenie OneDrive – ciekawostki

OneDrive Sharing

na początek oczywiste oczywistości:

  • OneDrive to de facto SharePoint. główne ustawienia współdzielenia [Sharing] dziedziczy z globalnych ustawień SP
  • od jakiegoś czasu dostępny jest OneDrive Admin Center z poziomu Office365. z jego poziomu można pozornie ustawić zabezpieczenie współdzielenia na poziomie niższym, niż jest zdefiniowany w SharePoint. ale nie można [co zresztą jest opisane małym druczkiem na dole].

  • od niedawna rozbudowany został klient OneDrive – w końcu można nadawać uprawnienia 'bezpośrednio’ z Exploratora. co mnie pozytywnie zaskoczyło – okienko uprawnień jest renderowane przez OneDrive.exe a nie, tak jak się spodziewałem, iexplore.exe/edge .

Jak powstaje ACE dla osoby z zewnątrz

i tu się zaczyna robić ciekawie. standardowo, do czego przyzwyczaiły nas systemy operacyjne, flow jest taki:

  • użytkownik wybiera plik i nadaje uprawnienia
  • tworzony jest ACE – Access Control Entry – który staje się nieodłączną częścią pliq… w dużym uogólnieniu.
  • osoba próbuje się dostać
    • uwierzytelnia się
    • token uwierzytelniony porównywany jest z ACL [Access Control List] w poszukiwaniu ACE dla danego usera – rodzaj filtra
  • osoba dostaje dostęp lub nie.

wydaje się tak oczywiste… a jednak dla pliq współdzielonego z osobą z zewnątrz w OneDrive, jest inaczej. czy zastanawiałeś się po co jest poniższa opcja? skoro można uzyskać dostęp przez osobę inną niż zaproszona, to znaczy, że ACE nie może istnieć w momencie dostępu. zakładając, że wyłączone są linki anonimowe, w dużym uogólnieniu wygląda to tak:

  • użytkownik wybiera plik, uprawnienia edit/view i adres osoby z zewnątrz.
  • tworzony jest *link*, URL, zawierający token dostępu. ten link wysyłany jest mailem.
  • osoba, która otrzymała link otwiera go. zakładając, że wymuszone jest uwierzytelnienie, zostanie przekierowana na stronę logowania.
  • po pozytywnym uwierzytelnieniu, na podstawie linka generowane jest ACE, które dopiero teraz dopisywane jest do pliq
  • tworzone jest również konto [jeśli nie było wcześniej] „username_server.name#EXT#@company.onmicrosoft.com” w AAD

czemu tak i jakie to ma konsekwencje

opisywane zachowanie będzie zależne od kilq ustawień bezpieczeństwa na SP – czy włączone są linki anonimowe, oraz czy mogą być otwierane przez osoby inne, niż te, do których się je oryginalnie wysłało. współdzielenie linkiem jest znane od lat, i dość oczywiste, dla osób korzystających z usług chmurowych. po prostu w rozproszonym świecie chmury, gdzie nie ma centralnej bazy użytkowników, token jest przekazywany wraz z linkiem – w dużym skrócie posiadanie linka oznacza posiadanie dostępu. stąd powstały mechanizmy rozszerzające to rozwiązanie – np. o wymaganie uwierzytelnienia. czemu zatem link wysłany przez jedną osobę, standardowo może być otworzony przez inną? ta opcja została stworzona głównie z tego powodu, że ludzie korzystają z masy adresów, i mogą mieć konto MS Account założone z innym adresem niż my znamy – np. wysyłamy do kogoś na x@gmail.com a ktoś ma konto MS Account jako x@outlook.com. dzięki temu osoba nie jest zmuszona zakładać kolejnego konta, co było istotne zwłaszcza jakiś czas temu, kiedy nie istniał uproszony proces zakładania konta, i było to bardzo upierdliwe. ale ze względu na bezpieczeństwo, nie włączenie tej opcji, jest dość niepokojącym scenariuszem i sugerowałbym jednak, aby wymuszać weryfikację odbiorcy. w takim wypadq, nawet jeśli przekaże się linka innej osobie [lub zostanie wykradziony!], nie zostanie on obsłużony. można się przyczepić, że komunikat błędu pokazuje zdekodowany adres email osoby, która oryginalnie była w tokenie, ale nie jest to już tak wielki problem.  załóżmy, że opcja jest na 'default’, czyli może być otwarty przez inną osobę. co się stanie, jeśli roześlę link do stu osób? czy wszystkie będą miały dostęp? NIE. link zawiera 'token jednorazowego dostępu’. pierwsza osoba się dostanie i dla niej utworzony zostanie ACE, pozostałe osoby dostaną acc denied.

ciekawostki (bugs?)

nie może obyć się bez zagadek w-files. trafiłem na dwie. w porywach do trzech q:

  1. jeśli jakiś user ma wpisany alternate email z jakimś adresem zewnętrznym – np. x@gmail.com, i chcemy udostępnić plik tej osoby na tenże adres zewnętrzny… to się nie uda. AAD rozpoznaje użytkownika jako wewnętrznego i co prawda wysyła linka [zależnie od tego z jakiego interfejsu skorzystamy zachowanie może być różne], ale nie ma szansy zalogować się na kontem x@gmail.com .
  2. jak sądzicie, czy usunięcie konta #EXT# z AAD spowoduje, że osoba straci dostęp do pliq? scenariusz:
  • administrator doszedł do wniosq, że posprząta trochę, i *dla bezpieczeństwa* usunie konta #EXT# żeby zabrać dostępy.

no to się zdziwi, ponieważ usunięcie konta, nie powoduje usunięcia ACE – te systemy są rozdzielne, i nie ma 'centralnego repozytorium dostępów’. a ponieważ centrum uwierzytelnienia jest również rozłączne z naszym systemem, user zostanie poprawnie uwierzytelniony [przez Microsoft Account a nie przez nasz tenant AAD], ACE istnieje – ergo dostęp będzie. nie wierzycie – spróbujcie, podzielcie się wrażeniami. właśnie ta część pracy – odpowiedź na pytanie 'kto ma gdzie dostęp’ – jest nadal niełatwym zadaniem. 3. PS. czy zwróciliście uwagę, że w OneDrive for Business jest ’shared with me’ a w OneDrive personal jest ’Shared by me’? i żadne ze środowisk nie udostępnia mechanizmu dla pełnego rozeznania się co komu i dla nas….  

OneDrive for Business OneDrive personal

eN.

Teams i grupy o365

taka drobna ciekawostka… większość aplikacji o365 opiera się na ’Office 365 groups’. ciekawe jest to, że zależnie od aplikacji to nie zawsze jest dokładnie ta sama grupa, a raczej zawartość jest synchronizowana do kopii grupy dla aplikacji. podobnie jak grupa w AD onprem jest synchronizowana do grupy AAD w o365.

efekt jest dość zaskaqjący. jeśli manipuluje się przynależnością do Teamu w Teamsach, z poziomu aplikacji, jako właściciel danego Teamu/grupy, to zamiany są odzwierciedlane natychmiast. ale jeśli dokonuje się manipulacji na grupie od strony office 365 [np. dodanie/usunięcie członka], jako administrator, to zmiany w Teams zostaną zsynchronizowane… w ciągu 24h [SIC!]. jest to trochę dziwne. np. w tym samym czasie SharePoint widział zmianę od razu.

dwa wnioski:

  • lepiej unikać zarządzania administracyjnego – lepiej zostawić to właścicielom Teamów
  • trzeba pamiętać, że 'sowy nie są tym czym się wydają’

eN.

unikaty i duplikaty

Duplikaty

łatwo jest przefiltrować listę tak, aby mieć tylko unikalne elementy – jest zarówno commandlet 'get-unique’ oraz parametr ’-unique’ przy select-object, ale jak wyłuskać duplikaty?

sposobów jest oczywiście wiele a ten, który mi się podoba to:

cat "<file.name>"|group |? count -gt 1

lub w hiperpoprawnym zapisie:

get-content "<file.name>"|group-object|where-object {$_.count -gt 1}

plik:

PS C:\Temp> cat .\loremipsum.txt
Lorem ipsum dolor sit amet,
consectetur adipiscing elit.
non consectetur ex aliquam a. Vestibulum ante ipsum primis
Nulla at blandit nisi. Maecenas sodales tempor ligula.
Mauris ac pharetra eros. Nam pellentesque quam purus,
non consectetur ex aliquam a. Vestibulum ante ipsum primis
in faucibus orci luctus et ultrices
posuere cubilia Curae; Maecenas
consequat velit consequat
Mauris ac pharetra eros. Nam pellentesque quam purus,
vulputate fringilla. Donec
bibendum finibus ex vel congue.
bibendum finibus ex vel congue.

a teraz sprawdźmy duplikaty:

Count Name Group
----- ---- -----
 2 non consectetur ex ali... {non consectetur ex aliquam a. Vestibulum ante ipsum primis , non consectetur ex ali...
 2 Mauris ac pharetra ero... {Mauris ac pharetra eros. Nam pellentesque quam purus, , Mauris ac pharetra eros. Na...
 2 bibendum finibus ex ve... {bibendum finibus ex vel congue. , bibendum finibus ex vel congue. }

można jeszcze upiększyć output, pozbywając się śmieci:

cat .\sfbea.txt |group -NoElement|? count -gt 1

Unikaty

powracając jeszcze do unikatów… wydawałoby się, że skoro jest oddzielne polecenie – get-unique, to powinno mieć większe możliwości i być bardziej elastyczne niż jakiś tam parametr do innego polecenia.

o dziwo jest odwrotnie. osobiście traktuję get-unique jako ciekawostkę i nie miałem scenariusza, w którym bym go użył. a to dla tego iż [msdn]:

The Get-Unique cmdlet compares each item in a sorted list to the next item, eliminates duplicates, and returns only one instance of each item. The list must be sorted for the cmdlet to work properly.

Get-Unique is case-sensitive. As a result, strings that differ only in character casing are considered to be unique.

eN.

„nie można zainstalować drukarki – brak dostępu”

repairtiaaa… dawno nie było takiego wpisu q: czasem trafiają do mnie zadania czysto administracyjne. taki lajf. ostatnio trafił do mnie taki właśnie kejs jak w tytule – przy próbie dodania drukarki sieciowej na Windows 1o, wyskaqje takiż komunikat.. albo podobny (; minęło trochę czasu od kiedy zajmowałem się politykami GPO, ale finalnie i tak to nie one były przyczyną problemu. przeważnie chodzi o fakt, że użytkownik nie ma możliwości instalacji sterowników, i można to rozwiązać konfigurując dwa ustawienia w GPO: link tutaj

  • Computer Configuration\Policies\Administrative Templates\System\Driver Installation\Allow non-administrators to install drivers for these devices setup classes
    • Enabled
    • Device class GUID of printers: {4d36e979-e325-11ce-bfc1-08002be10318}
  • Computer Configuration/Policies/Administrative Templates/Printers/Point and Print Restrictions
    • Enabled
    • Security Prompts: When Installing Drivers for a new connection = Do not show warning or elevation prompt

ale… okazało się, że to nie pomogło. rozwiązaniem było ustawienie uprawnienia 'view server’ na poziomie Print Servera:

printerpermission01printerpermission02

eN.

mała-wielka zmiana. MS16-072

chaoswyszła ostatnio poprawka, która zabezpiecza przed pewnymi scenariuszami MitM attacks. mniejsza-o-większość, szczegóły można doczytać na technecie, a ja chciałem się sqpić nad pewną drobną konsekwencją, która może sporo namieszać.

po zainstalowaniu tej poprawki, przestają działać te polisy, które filtrowane są na podstawie uprawnień dla poszczególnych obiektów, i nie posiadają dodanego 'authenticated users: Read’ . w efekcie po wylistowaniu gpresult, pojawia się komunikat: 'not applied (unknown)’ .

oczywiście – wedle 'best practices’ nie powinno się nigdy zdejmować tego uprawnienia, a tylko wyrzucać 'apply’, niemniej nigdy nie stanowiło to problemu.

widziałem już różne dziwne metody stosowania GPO u klientów – tak dziwne, że patrzyłem i nie wierzyłem, że można coś tak dziwnego wymyślić. efekt tego, że jakiś admin-samouk zaczął coś w pokrętny sposób wdrażać, a potem trzeba to było kontynuować, bo oczywiście posprzątanie to ryzyko i chaos. w takim środowisq, ta mała zmiana, będzie miała olbrzymi wpływ. dotknęło to również środowiska jednego z obecnych klientów, gdzie ktoś dzięki dziwnemu zestawowi uprawnień wdrożył polisy terminalowe w zupełnie odwrotny sposób – zamiast stworzyć GPO na komputer z 'loopback processing’, zrobione były polisy na użytkowników, z wyciętymi uprawnieniami dla komputerów. nadal nie jestem pewien, jakim cudem to w ogóle działało… przyszła poprawka i wymusiła porządki.

to tak jakby ktoś miał wątpliwości, czemu warto stosować proste, prawidłowe metody, zamiast dziwolągów, bazujących na nieudokumentowanych testach – po prostu z-dnia-na-dzień mogą przestać działać.

eN.

OneDrive for business – sync

TVtaki mały trick… ponieważ po raz kolejny rozwaliła się lokalna biblioteka, i ponieważ po raz kolejny straciłem czas i nerwy, a do normalnej wersji zostało jeszcze ok. pół roq, mały tips, który może oszczędzi komuś zgrzytów:

  • jeśli otworzy się bibliotekę z Edge albo FF to zostanie się przekierowanym na stronę z downloadem całego office2o13 – zainstaluje się 1GB po to, żeby był klient OneDrive2o13, i zaczyna tak bruździć, że pozostaje tylko usunięcie profilu użytkownika.
  • ale jak otworzy się z IE, to okazuje się, że ten klient z office16 zawiera odpowiedniego klienta i jednak potrafi synchronizować, i wtedy na jakiś czas znów można korzystać…

… aż znów z niewiadomych powodów zacznie się kaszanić. średnio biblioteka współdzielona wytrzymuje mi ok. miesiąca i zaczyna się rozjeżdżać /:

kilka rzeczy, których robić nie wolno, bo generują problemy [nie zawsze, ale lepiej unikać], dla bibliotek z wymuszeniem check-in:

  • zapisywać plik z Internetu/załącznik z maila. chodzi o ADS, który bloqje synchronizację
  • nadpisać plik. trzeba usunąć, wymusić sync i nagrać
  • korzystać z aplikacji, które robią lock na plikach

eN.

CSV, SSV… ? ULSLSSV!

Windows_PowerShell_iconwpis z cyklu 'człowiek uczy się całe życie’ (; od zawsze pluję się, że durny Excel pliki CSV – Comma Separated Value – zapisuje/odczytuje jako Semicolon Separated Value z niewyjaśnionych przyczyn.

okazuje się, że sprawa jest bardziej skomplikowana i to nie jest ani CSV, ani SSV tylko ULSLSSV – czyli User Language Specyfic List Separator Separated Value (;

listSeparator

o ile dla US „List separator” to przecinek, więc dla Amerykanów CSV to CSV o tyle dla Polaków „List separator” to średnik… jest to dodatkowe utrudnienie na które trzeba uważać w skryptach bo mogą uruchamiać je osoby o różnych ustawieniach regionanych. o ile głupotą jest że CSV to SSV kod jest prosty:

import-csv/export-csv -delimiter ';'

a prawidłowo-bezpiecznie, w skryptach trzeba uważać i zamienić to na:

import-csv/export-csv -delimiter -useCulture

eN.