Как получить к пользователям% APPDATA% при запуске от имени системного пользователя из командного файла - PullRequest
0 голосов
/ 17 мая 2018

Развертывание приложений через SCCM.В настоящее время пытаюсь развернуть Wireshark, и я первый раз пытаюсь создать каталог, а затем скопировать файл настроек пользователям %APPDATA%.Файл настроек в основном не позволяет приложению проверять наличие автообновлений.

Причина, по которой мне нужно создать каталог, заключается в том, что он не существует до первого запуска Wireshark.

Проблема заключается в том, чтопри этом SCCM развертывается как системный пользователь, поэтому %APPDATA% переходит в каталог C:\Windows\System32\config\systemprofile\AppData\Roaming\

Но я бы хотел попасть в C: \ Users \ SPECIFIC USER \ AppData \ Roaming

Я развертываю приложение с помощью командного файла:


Wireshark-win64-2.4.6.exe /S

mkdir %APPDATA%\Wireshark\

xcopy preferences %APPDATA%\Wireshark

Это будет работать локально на моей собственной машине, но если я буду работать под PSEXEC (как SCCM) затем он окажется в неправильном каталоге.

Я новичок в создании приложений в SCCM, а также в использовании пакетных файлов для развертывания, поэтому, если возможно, укажите подробности.Независимо от того, я ценю помощь!

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Завершено с помощью getprofiles.cmd для вывода профилей и с помощью main.cmd с циклом for для обработки путей к профилям.

main.cmd :

@echo off
setlocal

:: Install Wireshark.
echo Wireshark-win64-2.4.6.exe /S

:: Update Wireshark app data in user profiles.
for /f "tokens=*" %%A in ('getprofiles.cmd "\AppData\Roaming"') do (
    call :skip_profile "%%~A" "\\Administrator\\" "\\MSSQL\$SQLEXPRESS\\" || (
        echo mkdir "%%~A\Wireshark\"
        echo xcopy preferences "%%~A\Wireshark"
    )
)

exit /b

:skip_profile
for %%A in (%*) do (
    if not "%%~A" == "" if /i not "%%~A" == "%~1" (
        echo "%~1"| findstr /i "%%~A" >nul 2>nul
        if not errorlevel 1 (
            echo Skip account "%~1"
            exit /b 0
        )
    )
)
exit /b 1

getprofiles.cmd :

@echo off
setlocal

if "%~1" == "/?" goto :help

:: ProfileList key that contains profile paths.
set "ProfileListKey=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"

:: Get profiles directory path.
set "ProfilesDirectory="

for /f "tokens=1,3" %%A in (
    'reg query "%ProfileListKey%" /v "ProfilesDirectory"'
) do if /i "%%~A" == "ProfilesDirectory" call set "ProfilesDirectory=%%~B"

if not defined ProfilesDirectory (
    >&2 echo ProfilesDirectory is undefined
    exit /b 1
)

:: Search all profile paths in profiles directory and echo existing paths appended with the 1st script argument.
for /f "delims=" %%A in (
    'reg query "%ProfileListKey%"'
) do call :ProfilePath "%%~A" "%~1"

exit /b

:ProfilePath
setlocal
set "arg1=%~1"

:: Validate 1st call argument is a profile subkey.
if not defined arg1 exit /b 1
if /i "%arg1%" == "%ProfileListKey%" exit /b 1
if "%arg1:~,1%" == " " exit /b 1

:: Echo existing profile paths with defined 2nd argument appended.
for /f "tokens=1,3" %%A in (
    'reg query "%arg1%" /v ProfileImagePath^|find /i "%ProfilesDirectory%"'
) do (
    if "%%~A" == "ProfileImagePath" (
        if exist "%%~B%~2" echo "%%~B%~2"
    )
)
exit /b

:help
echo Prints profile paths from the registry that exist in the Profiles Directory.
echo 1st argument can be a path to be appended to the profile path.
echo   i.e. "\AppData\Roaming" is appended to become "C:\Users\...\AppData\Roaming".
exit /b

Скрипт main.cmd отображает результаты тестирования.Удалите эхо-сигналы, которые фактически используются, если команды верны.

Ключ ProfileList в реестре хранит путь для поиска профилей и содержит подразделы с данными, такими как путь каждого профиля на компьютере.

main.cmd позволяет избежать таких профилей, как Administrator и MSSQL$SQLEXPRESS.Вызываемая метка :skip_profile принимает путь профиля в качестве 1-го аргумента.Следующие аргументы относятся к шаблонам и, если они совпадают, будут пропущенным профилем.findstr используется для проверки пути к профилю на соответствие регулярным выражениям, поэтому используйте findstr /? для требований синтаксиса.Регистр не зависит от использования /i.

Сценарий getprofiles.cmd получает путь ProfilesDirectory, в котором можно найти папки профиля пользователя.Затем он запрашивает ключ для получения ключей профиля, используя вызываемую метку :ProfilePath.Метка проверяет, найден ли путь ProfilesDirectory в каждом найденном пути профиля.Затем он проверяет, существует ли путь, перед тем как повторить путь.Если передан необязательный 1-й параметр, он будет добавлен, и путь будет утвержден в качестве этого пути.

A выводит тест:

Wireshark-win64-2.4.6.exe /S
mkdir "C:\Users\Michael\AppData\Roaming\Wireshark\"
xcopy preferences "C:\Users\Michael\AppData\Roaming\Wireshark"

, что кажется нормальным, поскольку у меня есть только 1профиль пользователя на моем текущем компьютере.

Вероятно, вы могли бы объединить код, чтобы сделать всего 1 скрипт, хотя я решил оставить getprofiles.cmd в качестве многоразового использования для других целей.

0 голосов
/ 18 мая 2018

Вот пакетный файл, который может вам помочь.Он создает каталог, который вы ему сообщаете, во всех каталогах %APPDATA% пользователя, которые он находит, если вы не указали имя пользователя, или создает каталог только в каталоге %APPDATA% конкретного пользователя, если вы указываете имя пользователя.

@ECHO OFF
SETLOCAL
SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

SET BAT=%~NX0
SET ROOTDIR=C:\Users

IF "%~1" == "" (
    GOTO USAGE
)
SET "DIR=%~1"
SET "USER=%~2"
IF NOT "%USER%" == "" (
    IF EXIST %ROOTDIR%\%USER%\AppData\Roaming\ (
        IF NOT EXIST "%ROOTDIR%\%USER%\AppData\Roaming\%DIR%" (
            MKDIR "%ROOTDIR%\%USER%\AppData\Roaming\%DIR%"
            ECHO Created %ROOTDIR%\%USER%\AppData\Roaming\%DIR%
        )
    )
    GOTO :EOF
)

FOR /F "DELIMS=" %%D IN ('DIR /A:D /B %ROOTDIR%') DO (
    IF EXIST %ROOTDIR%\%%D\AppData\Roaming\ (
        IF NOT EXIST "%ROOTDIR%\%%D\AppData\Roaming\%DIR%" (
            MKDIR "%ROOTDIR%\%%D\AppData\Roaming\%DIR%"
            ECHO Created %ROOTDIR%\%%D\AppData\Roaming\%DIR%
        )
    )
)
GOTO :EOF

:: --------------------------------------------------------------------------
:USAGE
ECHO.
ECHO   A batch file that creates a directory in every user's %%APPDATA%% directory
ECHO   if no username is specified or creates the directory only for the specific
ECHO   user if the username is specified.
ECHO.
ECHO   Usage: %BAT% ^<directory^> [username]
GOTO :EOF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...